Merge "AppWindowToken: Guard against null SurfaceControl in prepareSurfaces"
diff --git a/Android.bp b/Android.bp
index afdcadd..ecdc082 100644
--- a/Android.bp
+++ b/Android.bp
@@ -49,9 +49,6 @@
         "rs/java/**/*.java",
 
         ":framework-javastream-protos",
-        // TODO: Resolve circular library dependency and remove media1-srcs and mediasession2-srcs
-        ":media1-srcs",
-        ":mediasession2-srcs",
 
         "core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl",
         "core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl",
@@ -120,7 +117,6 @@
         "core/java/android/app/timedetector/ITimeDetectorService.aidl",
         "core/java/android/app/timezone/ICallback.aidl",
         "core/java/android/app/timezone/IRulesManager.aidl",
-        "core/java/android/app/timezonedetector/ITimeZoneDetectorService.aidl",
         "core/java/android/app/usage/ICacheQuotaService.aidl",
         "core/java/android/app/usage/IStorageStatsManager.aidl",
         "core/java/android/app/usage/IUsageStatsManager.aidl",
@@ -250,6 +246,7 @@
         "core/java/android/os/ICancellationSignal.aidl",
         "core/java/android/os/IDeviceIdentifiersPolicyService.aidl",
         "core/java/android/os/IDeviceIdleController.aidl",
+        "core/java/android/os/IDynamicAndroidService.aidl",
         "core/java/android/os/IHardwarePropertiesManager.aidl",
         ":libincident_aidl",
         "core/java/android/os/IMaintenanceActivityListener.aidl",
@@ -376,6 +373,7 @@
         "core/java/android/view/IApplicationToken.aidl",
         "core/java/android/view/IAppTransitionAnimationSpecsFuture.aidl",
         "core/java/android/view/IDockedStackListener.aidl",
+        "core/java/android/view/IDisplayFoldListener.aidl",
         "core/java/android/view/IGraphicsStats.aidl",
         "core/java/android/view/IGraphicsStatsCallback.aidl",
         "core/java/android/view/IInputFilter.aidl",
@@ -505,7 +503,11 @@
         "media/java/android/media/session/ICallback.aidl",
         "media/java/android/media/session/IOnMediaKeyListener.aidl",
         "media/java/android/media/session/IOnVolumeKeyLongPressListener.aidl",
+        "media/java/android/media/session/ISession.aidl",
         "media/java/android/media/session/ISession2TokensListener.aidl",
+        "media/java/android/media/session/ISessionCallback.aidl",
+        "media/java/android/media/session/ISessionController.aidl",
+        "media/java/android/media/session/ISessionControllerCallback.aidl",
         "media/java/android/media/session/ISessionManager.aidl",
         "media/java/android/media/soundtrigger/ISoundTriggerDetectionService.aidl",
         "media/java/android/media/soundtrigger/ISoundTriggerDetectionServiceClient.aidl",
@@ -520,6 +522,8 @@
         "media/java/android/media/tv/ITvInputSessionCallback.aidl",
         "media/java/android/media/tv/ITvRemoteProvider.aidl",
         "media/java/android/media/tv/ITvRemoteServiceInput.aidl",
+        "media/java/android/service/media/IMediaBrowserService.aidl",
+        "media/java/android/service/media/IMediaBrowserServiceCallbacks.aidl",
         "telecomm/java/com/android/internal/telecom/ICallRedirectionAdapter.aidl",
         "telecomm/java/com/android/internal/telecom/ICallRedirectionService.aidl",
         "telecomm/java/com/android/internal/telecom/ICallScreeningAdapter.aidl",
@@ -654,8 +658,10 @@
 
         ":storaged_aidl",
         ":vold_aidl",
+        ":gsiservice_aidl",
         ":installd_aidl",
         ":dumpstate_aidl",
+        ":incidentcompanion_aidl",
 
         "lowpan/java/android/net/lowpan/ILowpanEnergyScanCallback.aidl",
         "lowpan/java/android/net/lowpan/ILowpanNetScanCallback.aidl",
@@ -706,11 +712,13 @@
             "system/update_engine/binder_bindings",
             "frameworks/native/aidl/binder",
             "frameworks/native/cmds/dumpstate/binder",
+            "frameworks/native/libs/incidentcompanion/binder",
             "frameworks/av/camera/aidl",
             "frameworks/av/media/libaudioclient/aidl",
             "frameworks/native/aidl/gui",
             "system/core/storaged/binder",
             "system/vold/binder",
+            "system/gsid/aidl",
             "system/bt/binder",
             "system/security/keystore/binder",
         ],
@@ -726,6 +734,7 @@
     no_framework_libs: true,
     libs: [
         "ext",
+        "updatable_media_stubs",
     ],
 
     jarjar_rules: "jarjar_rules_hidl.txt",
@@ -778,6 +787,7 @@
         "--multi-dex",
     ],
 
+    plugins: ["view-inspector-annotation-processor"],
 }
 
 filegroup {
@@ -919,6 +929,7 @@
         "core/java/android/annotation/UnsupportedAppUsage.java",
         "core/java/android/net/DhcpResults.java",
         "core/java/android/util/LocalLog.java",
+        "core/java/com/android/internal/annotations/GuardedBy.java",
         "core/java/com/android/internal/annotations/VisibleForTesting.java",
         "core/java/com/android/internal/util/HexDump.java",
         "core/java/com/android/internal/util/IndentingPrintWriter.java",
@@ -1285,7 +1296,7 @@
         ":non_openjdk_javadoc_files",
         ":android_icu4j_src_files_for_docs",
         ":conscrypt_public_api_files",
-        ":media-srcs-without-aidls",
+        ":updatable-media-srcs-without-aidls",
         "test-mock/src/**/*.java",
         "test-runner/src/**/*.java",
     ],
@@ -1347,7 +1358,7 @@
         ":non_openjdk_javadoc_files",
         ":android_icu4j_src_files_for_docs",
         ":conscrypt_public_api_files",
-        ":media-srcs-without-aidls",
+        ":updatable-media-srcs-without-aidls",
     ],
     srcs_lib: "framework",
     srcs_lib_whitelist_dirs: frameworks_base_subdirs,
diff --git a/Android.mk b/Android.mk
index e405345..65d4d24 100644
--- a/Android.mk
+++ b/Android.mk
@@ -78,6 +78,7 @@
 update-api: doc-comment-check-docs
 
 # ==== hiddenapi lists =======================================
+ifneq ($(UNSAFE_DISABLE_HIDDENAPI_FLAGS),true)
 .KATI_RESTAT: $(INTERNAL_PLATFORM_HIDDENAPI_FLAGS)
 $(INTERNAL_PLATFORM_HIDDENAPI_FLAGS): \
     PRIVATE_FLAGS_INPUTS := $(PRIVATE_FLAGS_INPUTS) $(SOONG_HIDDENAPI_FLAGS)
@@ -108,6 +109,7 @@
 
 $(call dist-for-goals,droidcore,$(INTERNAL_PLATFORM_HIDDENAPI_FLAGS))
 $(call dist-for-goals,droidcore,$(INTERNAL_PLATFORM_HIDDENAPI_GREYLIST_METADATA))
+endif  # UNSAFE_DISABLE_HIDDENAPI_FLAGS
 
 # Include subdirectory makefiles
 # ============================================================
diff --git a/apct-tests/perftests/core/src/android/os/KernelCpuThreadReaderPerfTest.java b/apct-tests/perftests/core/src/android/os/KernelCpuThreadReaderPerfTest.java
index 11c7599..9234849 100644
--- a/apct-tests/perftests/core/src/android/os/KernelCpuThreadReaderPerfTest.java
+++ b/apct-tests/perftests/core/src/android/os/KernelCpuThreadReaderPerfTest.java
@@ -39,7 +39,8 @@
     @Rule
     public final PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
 
-    private final KernelCpuThreadReader mKernelCpuThreadReader = KernelCpuThreadReader.create();
+    private final KernelCpuThreadReader mKernelCpuThreadReader =
+            KernelCpuThreadReader.create(8, uid -> 1000 <= uid && uid < 2000);
 
     @Test
     public void timeReadCurrentProcessCpuUsage() {
diff --git a/apct-tests/perftests/core/src/android/textclassifier/TextClassifierPerfTest.java b/apct-tests/perftests/core/src/android/textclassifier/TextClassifierPerfTest.java
index 767434d..ec46a75 100644
--- a/apct-tests/perftests/core/src/android/textclassifier/TextClassifierPerfTest.java
+++ b/apct-tests/perftests/core/src/android/textclassifier/TextClassifierPerfTest.java
@@ -47,7 +47,7 @@
     @Rule
     public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
 
-    @Parameterized.Parameters(name = "size={0}")
+    @Parameterized.Parameters(name = "size{0}")
     public static Collection<Object[]> data() {
         return Arrays.asList(new Object[][]{{ACTUAL_REQUEST}, {10}, {100}, {1000}});
     }
diff --git a/api/current.txt b/api/current.txt
index fc86c7a..ff93504 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -1511,6 +1511,7 @@
     field public static final int use32bitAbi = 16844053; // 0x1010515
     field public static final int useAppZygote = 16844184; // 0x1010598
     field public static final int useDefaultMargins = 16843641; // 0x1010379
+    field public static final int useEmbeddedDex = 16844196; // 0x10105a4
     field public static final int useIntrinsicSizeAsMinimum = 16843536; // 0x1010310
     field public static final int useLevel = 16843167; // 0x101019f
     field public static final int userVisible = 16843409; // 0x1010291
@@ -1622,6 +1623,7 @@
     field @Deprecated public static final int yearListSelectorColor = 16843930; // 0x101049a
     field public static final int yesNoPreferenceStyle = 16842896; // 0x1010090
     field public static final int zAdjustment = 16843201; // 0x10101c1
+    field public static final int zygotePreloadName = 16844195; // 0x10105a3
   }
 
   public static final class R.bool {
@@ -5777,6 +5779,7 @@
     method public String addAutomaticZenRule(android.app.AutomaticZenRule);
     method public boolean areBubblesAllowed();
     method public boolean areNotificationsEnabled();
+    method public boolean areNotificationsPaused();
     method public boolean canNotifyAsPackage(String);
     method public void cancel(int);
     method public void cancel(String, int);
@@ -5810,6 +5813,7 @@
     method public final void setInterruptionFilter(int);
     method public void setNotificationDelegate(@NonNull String);
     method public void setNotificationPolicy(@NonNull android.app.NotificationManager.Policy);
+    method public boolean shouldHideSilentStatusBarIcons();
     method public boolean updateAutomaticZenRule(String, android.app.AutomaticZenRule);
     field public static final String ACTION_APP_BLOCK_STATE_CHANGED = "android.app.action.APP_BLOCK_STATE_CHANGED";
     field public static final String ACTION_AUTOMATIC_ZEN_RULE = "android.app.action.AUTOMATIC_ZEN_RULE";
@@ -6174,6 +6178,7 @@
     method public void onTrimMemory(int);
     method public boolean onUnbind(android.content.Intent);
     method public final void startForeground(int, android.app.Notification);
+    method public final void startForeground(int, @NonNull android.app.Notification, int);
     method public final void stopForeground(boolean);
     method public final void stopForeground(int);
     method public final void stopSelf();
@@ -6210,6 +6215,9 @@
     method public final android.os.IBinder onBind(android.content.Intent);
   }
 
+  public class StatusBarManager {
+  }
+
   @Deprecated public class TabActivity extends android.app.ActivityGroup {
     ctor @Deprecated public TabActivity();
     method @Deprecated public android.widget.TabHost getTabHost();
@@ -6478,6 +6486,10 @@
     method public void onColorsChanged(android.app.WallpaperColors, int);
   }
 
+  public interface ZygotePreload {
+    method public void doPreload(android.content.pm.ApplicationInfo);
+  }
+
 }
 
 package android.app.admin {
@@ -6605,6 +6617,7 @@
     method @Nullable public String[] getAccountTypesWithManagementDisabled();
     method @Nullable public java.util.List<android.content.ComponentName> getActiveAdmins();
     method @NonNull public java.util.Set<java.lang.String> getAffiliationIds(@NonNull android.content.ComponentName);
+    method @Nullable public java.util.List<java.lang.String> getAlwaysOnVpnLockdownWhitelist(@NonNull android.content.ComponentName);
     method @Nullable public String getAlwaysOnVpnPackage(@NonNull android.content.ComponentName);
     method @WorkerThread @NonNull public android.os.Bundle getApplicationRestrictions(@Nullable android.content.ComponentName, String);
     method @Deprecated @Nullable public String getApplicationRestrictionsManagingPackage(@NonNull android.content.ComponentName);
@@ -6679,6 +6692,7 @@
     method public boolean isActivePasswordSufficient();
     method public boolean isAdminActive(@NonNull android.content.ComponentName);
     method public boolean isAffiliatedUser();
+    method public boolean isAlwaysOnVpnLockdownEnabled(@NonNull android.content.ComponentName);
     method public boolean isApplicationHidden(@NonNull android.content.ComponentName, String);
     method public boolean isBackupServiceEnabled(@NonNull android.content.ComponentName);
     method @Deprecated public boolean isCallerApplicationRestrictionsManagingPackage();
@@ -6715,7 +6729,8 @@
     method @Nullable public java.util.List<android.app.admin.SecurityLog.SecurityEvent> retrieveSecurityLogs(@NonNull android.content.ComponentName);
     method public void setAccountManagementDisabled(@NonNull android.content.ComponentName, String, boolean);
     method public void setAffiliationIds(@NonNull android.content.ComponentName, @NonNull java.util.Set<java.lang.String>);
-    method public void setAlwaysOnVpnPackage(@NonNull android.content.ComponentName, @Nullable String, boolean) throws android.content.pm.PackageManager.NameNotFoundException, java.lang.UnsupportedOperationException;
+    method public void setAlwaysOnVpnPackage(@NonNull android.content.ComponentName, @Nullable String, boolean) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public void setAlwaysOnVpnPackage(@NonNull android.content.ComponentName, @Nullable String, boolean, @Nullable java.util.List<java.lang.String>) throws android.content.pm.PackageManager.NameNotFoundException;
     method public boolean setApplicationHidden(@NonNull android.content.ComponentName, String, boolean);
     method @WorkerThread public void setApplicationRestrictions(@Nullable android.content.ComponentName, String, android.os.Bundle);
     method @Deprecated public void setApplicationRestrictionsManagingPackage(@NonNull android.content.ComponentName, @Nullable String) throws android.content.pm.PackageManager.NameNotFoundException;
@@ -11225,6 +11240,7 @@
 
   public class LauncherApps {
     method public java.util.List<android.content.pm.LauncherActivityInfo> getActivityList(String, android.os.UserHandle);
+    method @NonNull public java.util.List<android.content.pm.PackageInstaller.SessionInfo> getAllPackageInstallerSessions();
     method @Nullable public android.content.pm.LauncherApps.AppUsageLimit getAppUsageLimit(String, android.os.UserHandle);
     method public android.content.pm.ApplicationInfo getApplicationInfo(@NonNull String, int, @NonNull android.os.UserHandle) throws android.content.pm.PackageManager.NameNotFoundException;
     method public android.content.pm.LauncherApps.PinItemRequest getPinItemRequest(android.content.Intent);
@@ -11241,13 +11257,16 @@
     method public void pinShortcuts(@NonNull String, @NonNull java.util.List<java.lang.String>, @NonNull android.os.UserHandle);
     method public void registerCallback(android.content.pm.LauncherApps.Callback);
     method public void registerCallback(android.content.pm.LauncherApps.Callback, android.os.Handler);
+    method public void registerPackageInstallerSessionCallback(@NonNull java.util.concurrent.Executor, @NonNull android.content.pm.PackageInstaller.SessionCallback);
     method public android.content.pm.LauncherActivityInfo resolveActivity(android.content.Intent, android.os.UserHandle);
     method public boolean shouldHideFromSuggestions(@NonNull String, @NonNull android.os.UserHandle);
     method public void startAppDetailsActivity(android.content.ComponentName, android.os.UserHandle, android.graphics.Rect, android.os.Bundle);
     method public void startMainActivity(android.content.ComponentName, android.os.UserHandle, android.graphics.Rect, android.os.Bundle);
+    method public void startPackageInstallerSessionDetailsActivity(android.content.pm.PackageInstaller.SessionInfo, android.graphics.Rect, android.os.Bundle);
     method public void startShortcut(@NonNull String, @NonNull String, @Nullable android.graphics.Rect, @Nullable android.os.Bundle, @NonNull android.os.UserHandle);
     method public void startShortcut(@NonNull android.content.pm.ShortcutInfo, @Nullable android.graphics.Rect, @Nullable android.os.Bundle);
     method public void unregisterCallback(android.content.pm.LauncherApps.Callback);
+    method public void unregisterPackageInstallerSessionCallback(android.content.pm.PackageInstaller.SessionCallback);
     field public static final String ACTION_CONFIRM_PIN_APPWIDGET = "android.content.pm.action.CONFIRM_PIN_APPWIDGET";
     field public static final String ACTION_CONFIRM_PIN_SHORTCUT = "android.content.pm.action.CONFIRM_PIN_SHORTCUT";
     field public static final String EXTRA_PIN_ITEM_REQUEST = "android.content.pm.extra.PIN_ITEM_REQUEST";
@@ -11305,7 +11324,7 @@
 
   public final class ModuleInfo implements android.os.Parcelable {
     method public int describeContents();
-    method @Nullable public String getName();
+    method @Nullable public CharSequence getName();
     method @Nullable public String getPackageName();
     method public boolean isHidden();
     method public void writeToParcel(android.os.Parcel, int);
@@ -11437,6 +11456,7 @@
     method public long getSize();
     method public int getStagedSessionErrorCode();
     method public String getStagedSessionErrorMessage();
+    method public android.os.UserHandle getUser();
     method public boolean isActive();
     method public boolean isMultiPackage();
     method public boolean isSealed();
@@ -11647,8 +11667,7 @@
     field public static final String FEATURE_FAKETOUCH = "android.hardware.faketouch";
     field public static final String FEATURE_FAKETOUCH_MULTITOUCH_DISTINCT = "android.hardware.faketouch.multitouch.distinct";
     field public static final String FEATURE_FAKETOUCH_MULTITOUCH_JAZZHAND = "android.hardware.faketouch.multitouch.jazzhand";
-    field public static final String FEATURE_FINGERPRINT = "android.hardware.biometrics.fingerprint";
-    field public static final String FEATURE_FINGERPRINT_PRE_29 = "android.hardware.fingerprint";
+    field public static final String FEATURE_FINGERPRINT = "android.hardware.fingerprint";
     field public static final String FEATURE_FREEFORM_WINDOW_MANAGEMENT = "android.software.freeform_window_management";
     field public static final String FEATURE_GAMEPAD = "android.hardware.gamepad";
     field public static final String FEATURE_HIFI_SENSORS = "android.hardware.sensor.hifi_sensors";
@@ -11912,13 +11931,13 @@
     field public static final int FLAG_SINGLE_USER = 1073741824; // 0x40000000
     field public static final int FLAG_STOP_WITH_TASK = 1; // 0x1
     field public static final int FLAG_USE_APP_ZYGOTE = 8; // 0x8
-    field public static final int FOREGROUND_SERVICE_TYPE_DEVICE_COMPANION = 5; // 0x5
-    field public static final int FOREGROUND_SERVICE_TYPE_LOCATION = 4; // 0x4
-    field public static final int FOREGROUND_SERVICE_TYPE_MEDIA_PLAY = 2; // 0x2
-    field public static final int FOREGROUND_SERVICE_TYPE_ONGOING_PROCESS = 6; // 0x6
-    field public static final int FOREGROUND_SERVICE_TYPE_PHONE_CALL = 3; // 0x3
-    field public static final int FOREGROUND_SERVICE_TYPE_SYNC = 1; // 0x1
-    field public static final int FOREGROUND_SERVICE_TYPE_UNSPECIFIED = 0; // 0x0
+    field public static final int FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE = 16; // 0x10
+    field public static final int FOREGROUND_SERVICE_TYPE_DATA_SYNC = 1; // 0x1
+    field public static final int FOREGROUND_SERVICE_TYPE_LOCATION = 8; // 0x8
+    field public static final int FOREGROUND_SERVICE_TYPE_MANIFEST = -1; // 0xffffffff
+    field public static final int FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK = 2; // 0x2
+    field public static final int FOREGROUND_SERVICE_TYPE_NONE = 0; // 0x0
+    field public static final int FOREGROUND_SERVICE_TYPE_PHONE_CALL = 4; // 0x4
     field public int flags;
     field public String permission;
   }
@@ -12972,7 +12991,7 @@
     method @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder removeOpenFlags(int);
     method @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setCursorFactory(@Nullable android.database.sqlite.SQLiteDatabase.CursorFactory);
     method @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setErrorHandler(@Nullable android.database.DatabaseErrorHandler);
-    method @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setIdleConnectionTimeout(@IntRange(from=0) long);
+    method @Deprecated @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setIdleConnectionTimeout(@IntRange(from=0) long);
     method @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setJournalMode(@NonNull String);
     method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setLookasideConfig(@IntRange(from=0) int, @IntRange(from=0) int);
     method @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setOpenFlags(int);
@@ -13033,7 +13052,7 @@
     method public void onDowngrade(android.database.sqlite.SQLiteDatabase, int, int);
     method public void onOpen(android.database.sqlite.SQLiteDatabase);
     method public abstract void onUpgrade(android.database.sqlite.SQLiteDatabase, int, int);
-    method public void setIdleConnectionTimeout(@IntRange(from=0) long);
+    method @Deprecated public void setIdleConnectionTimeout(@IntRange(from=0) long);
     method public void setLookasideConfig(@IntRange(from=0) int, @IntRange(from=0) int);
     method public void setOpenParams(@NonNull android.database.sqlite.SQLiteDatabase.OpenParams);
     method public void setWriteAheadLoggingEnabled(boolean);
@@ -13545,10 +13564,12 @@
     method public static android.graphics.Bitmap createScaledBitmap(@NonNull android.graphics.Bitmap, int, int, boolean);
     method public int describeContents();
     method public void eraseColor(@ColorInt int);
+    method public void eraseColor(@ColorLong long);
     method @CheckResult public android.graphics.Bitmap extractAlpha();
     method @CheckResult public android.graphics.Bitmap extractAlpha(android.graphics.Paint, int[]);
     method public int getAllocationByteCount();
     method public int getByteCount();
+    method public android.graphics.Color getColor(int, int);
     method @Nullable public android.graphics.ColorSpace getColorSpace();
     method public android.graphics.Bitmap.Config getConfig();
     method public int getDensity();
@@ -13574,6 +13595,7 @@
     method public void reconfigure(int, int, android.graphics.Bitmap.Config);
     method public void recycle();
     method public boolean sameAs(android.graphics.Bitmap);
+    method public void setColorSpace(@NonNull android.graphics.ColorSpace);
     method public void setConfig(android.graphics.Bitmap.Config);
     method public void setDensity(int);
     method public void setHasAlpha(boolean);
@@ -13760,8 +13782,10 @@
     method public void drawBitmapMesh(@NonNull android.graphics.Bitmap, int, int, @NonNull float[], int, @Nullable int[], int, @Nullable android.graphics.Paint);
     method public void drawCircle(float, float, float, @NonNull android.graphics.Paint);
     method public void drawColor(@ColorInt int);
+    method public void drawColor(@ColorLong long);
     method @Deprecated public void drawColor(@ColorInt int, @NonNull android.graphics.PorterDuff.Mode);
     method public void drawColor(@ColorInt int, @NonNull android.graphics.BlendMode);
+    method public void drawColor(@ColorLong long, @NonNull android.graphics.BlendMode);
     method public void drawDoubleRoundRect(@NonNull android.graphics.RectF, float, float, @NonNull android.graphics.RectF, float, float, @NonNull android.graphics.Paint);
     method public void drawDoubleRoundRect(@NonNull android.graphics.RectF, float[], @NonNull android.graphics.RectF, float[], @NonNull android.graphics.Paint);
     method public void drawLine(float, float, float, float, @NonNull android.graphics.Paint);
@@ -14168,6 +14192,7 @@
     ctor public ImageFormat();
     method public static int getBitsPerPixel(int);
     field public static final int DEPTH16 = 1144402265; // 0x44363159
+    field public static final int DEPTH_JPEG = 1768253795; // 0x69656963
     field public static final int DEPTH_POINT_CLOUD = 257; // 0x101
     field public static final int FLEX_RGBA_8888 = 42; // 0x2a
     field public static final int FLEX_RGB_888 = 41; // 0x29
@@ -14231,7 +14256,9 @@
 
   public class LinearGradient extends android.graphics.Shader {
     ctor public LinearGradient(float, float, float, float, @NonNull @ColorInt int[], @Nullable float[], @NonNull android.graphics.Shader.TileMode);
+    ctor public LinearGradient(float, float, float, float, @NonNull @ColorLong long[], @Nullable float[], @NonNull android.graphics.Shader.TileMode);
     ctor public LinearGradient(float, float, float, float, @ColorInt int, @ColorInt int, @NonNull android.graphics.Shader.TileMode);
+    ctor public LinearGradient(float, float, float, float, @ColorLong long, @ColorLong long, @NonNull android.graphics.Shader.TileMode);
   }
 
   public class MaskFilter {
@@ -14372,6 +14399,7 @@
     method @Nullable public android.graphics.BlendMode getBlendMode();
     method @ColorInt public int getColor();
     method public android.graphics.ColorFilter getColorFilter();
+    method @ColorLong public long getColorLong();
     method public boolean getFillPath(android.graphics.Path, android.graphics.Path);
     method public int getFlags();
     method public String getFontFeatureSettings();
@@ -14392,6 +14420,7 @@
     method public float getRunAdvance(CharSequence, int, int, int, int, boolean, int);
     method public android.graphics.Shader getShader();
     method @ColorInt public int getShadowLayerColor();
+    method @ColorLong public long getShadowLayerColorLong();
     method public float getShadowLayerDx();
     method public float getShadowLayerDy();
     method public float getShadowLayerRadius();
@@ -14446,6 +14475,7 @@
     method public void setAntiAlias(boolean);
     method public void setBlendMode(@Nullable android.graphics.BlendMode);
     method public void setColor(@ColorInt int);
+    method public void setColor(@ColorLong long);
     method public android.graphics.ColorFilter setColorFilter(android.graphics.ColorFilter);
     method public void setDither(boolean);
     method public void setElegantTextHeight(boolean);
@@ -14462,6 +14492,7 @@
     method public android.graphics.PathEffect setPathEffect(android.graphics.PathEffect);
     method public android.graphics.Shader setShader(android.graphics.Shader);
     method public void setShadowLayer(float, float, float, @ColorInt int);
+    method public void setShadowLayer(float, float, float, @ColorLong long);
     method public void setStrikeThruText(boolean);
     method public void setStrokeCap(android.graphics.Paint.Cap);
     method public void setStrokeJoin(android.graphics.Paint.Join);
@@ -14756,7 +14787,9 @@
 
   public class RadialGradient extends android.graphics.Shader {
     ctor public RadialGradient(float, float, float, @NonNull @ColorInt int[], @Nullable float[], @NonNull android.graphics.Shader.TileMode);
+    ctor public RadialGradient(float, float, float, @NonNull @ColorLong long[], @Nullable float[], @NonNull android.graphics.Shader.TileMode);
     ctor public RadialGradient(float, float, float, @ColorInt int, @ColorInt int, @NonNull android.graphics.Shader.TileMode);
+    ctor public RadialGradient(float, float, float, @ColorLong long, @ColorLong long, @NonNull android.graphics.Shader.TileMode);
   }
 
   public final class RecordingCanvas extends android.graphics.Canvas {
@@ -15016,7 +15049,9 @@
 
   public class SweepGradient extends android.graphics.Shader {
     ctor public SweepGradient(float, float, @NonNull @ColorInt int[], @Nullable float[]);
+    ctor public SweepGradient(float, float, @NonNull @ColorLong long[], @Nullable float[]);
     ctor public SweepGradient(float, float, @ColorInt int, @ColorInt int);
+    ctor public SweepGradient(float, float, @ColorLong long, @ColorLong long);
   }
 
   public class Typeface {
@@ -16676,6 +16711,7 @@
   }
 
   public static final class CameraCharacteristics.Key<T> {
+    ctor public CameraCharacteristics.Key(String, Class<T>);
     method @NonNull public String getName();
   }
 
@@ -17047,6 +17083,7 @@
   }
 
   public static final class CaptureRequest.Key<T> {
+    ctor public CaptureRequest.Key(String, Class<T>);
     method @NonNull public String getName();
   }
 
@@ -17141,6 +17178,7 @@
   }
 
   public static final class CaptureResult.Key<T> {
+    ctor public CaptureResult.Key(String, Class<T>);
     method @NonNull public String getName();
   }
 
@@ -24707,9 +24745,9 @@
     field public static final int KEY_TYPE_OFFLINE = 2; // 0x2
     field public static final int KEY_TYPE_RELEASE = 3; // 0x3
     field public static final int KEY_TYPE_STREAMING = 1; // 0x1
-    field public static final int OFFLINE_LICENSE_INACTIVE = 2; // 0x2
+    field public static final int OFFLINE_LICENSE_STATE_RELEASED = 2; // 0x2
     field public static final int OFFLINE_LICENSE_STATE_UNKNOWN = 0; // 0x0
-    field public static final int OFFLINE_LICENSE_USABLE = 1; // 0x1
+    field public static final int OFFLINE_LICENSE_STATE_USABLE = 1; // 0x1
     field public static final String PROPERTY_ALGORITHMS = "algorithms";
     field public static final String PROPERTY_DESCRIPTION = "description";
     field public static final String PROPERTY_DEVICE_UNIQUE_ID = "deviceUniqueId";
@@ -25155,6 +25193,8 @@
     field public static final int METADATA_KEY_DATE = 5; // 0x5
     field public static final int METADATA_KEY_DISC_NUMBER = 14; // 0xe
     field public static final int METADATA_KEY_DURATION = 9; // 0x9
+    field public static final int METADATA_KEY_EXIF_LENGTH = 34; // 0x22
+    field public static final int METADATA_KEY_EXIF_OFFSET = 33; // 0x21
     field public static final int METADATA_KEY_GENRE = 6; // 0x6
     field public static final int METADATA_KEY_HAS_AUDIO = 16; // 0x10
     field public static final int METADATA_KEY_HAS_IMAGE = 26; // 0x1a
@@ -25468,7 +25508,7 @@
     method @Nullable public android.media.MediaTimestamp getTimestamp();
     method @NonNull public java.util.List<android.media.MediaPlayer2.TrackInfo> getTrackInfo();
     method @NonNull public java.util.List<android.media.MediaPlayer2.TrackInfo> getTrackInfo(@NonNull android.media.DataSourceDesc);
-    method public android.media.VideoSize getVideoSize();
+    method public android.util.Size getVideoSize();
     method public boolean isLooping();
     method public Object loopCurrent(boolean);
     method public Object notifyWhenCommandLabelReached(@NonNull Object);
@@ -25560,6 +25600,14 @@
     field public static final int PLAYER_STATE_PAUSED = 1003; // 0x3eb
     field public static final int PLAYER_STATE_PLAYING = 1004; // 0x3ec
     field public static final int PLAYER_STATE_PREPARED = 1002; // 0x3ea
+    field public static final int PREPARE_DRM_STATUS_KEY_EXCHANGE_ERROR = 7; // 0x7
+    field public static final int PREPARE_DRM_STATUS_PREPARATION_ERROR = 3; // 0x3
+    field public static final int PREPARE_DRM_STATUS_PROVISIONING_NETWORK_ERROR = 1; // 0x1
+    field public static final int PREPARE_DRM_STATUS_PROVISIONING_SERVER_ERROR = 2; // 0x2
+    field public static final int PREPARE_DRM_STATUS_RESOURCE_BUSY = 5; // 0x5
+    field public static final int PREPARE_DRM_STATUS_RESTORE_ERROR = 6; // 0x6
+    field public static final int PREPARE_DRM_STATUS_SUCCESS = 0; // 0x0
+    field public static final int PREPARE_DRM_STATUS_UNSUPPORTED_SCHEME = 4; // 0x4
     field public static final int SEEK_CLOSEST = 3; // 0x3
     field public static final int SEEK_CLOSEST_SYNC = 2; // 0x2
     field public static final int SEEK_NEXT_SYNC = 1; // 0x1
@@ -25602,7 +25650,7 @@
     method public void onMediaTimeDiscontinuity(@NonNull android.media.MediaPlayer2, @NonNull android.media.DataSourceDesc, @NonNull android.media.MediaTimestamp);
     method public void onSubtitleData(@NonNull android.media.MediaPlayer2, @NonNull android.media.DataSourceDesc, @NonNull android.media.SubtitleData);
     method public void onTimedMetaDataAvailable(@NonNull android.media.MediaPlayer2, @NonNull android.media.DataSourceDesc, @NonNull android.media.TimedMetaData);
-    method public void onVideoSizeChanged(@NonNull android.media.MediaPlayer2, @NonNull android.media.DataSourceDesc, @NonNull android.media.VideoSize);
+    method public void onVideoSizeChanged(@NonNull android.media.MediaPlayer2, @NonNull android.media.DataSourceDesc, @NonNull android.util.Size);
   }
 
   public static final class MediaPlayer2.MetricsConstants {
@@ -25958,6 +26006,7 @@
     method @NonNull public abstract android.media.MediaSession2 onGetPrimarySession();
     method @Nullable public abstract android.media.MediaSession2Service.MediaNotification onUpdateNotification(@NonNull android.media.MediaSession2);
     method public final void removeSession(@NonNull android.media.MediaSession2);
+    field public static final String SERVICE_INTERFACE = "android.media.MediaSession2Service";
   }
 
   public static class MediaSession2Service.MediaNotification {
@@ -26506,11 +26555,6 @@
     method @NonNull public android.media.UriDataSourceDesc.Builder setDataSource(@NonNull android.content.Context, @NonNull android.net.Uri, @Nullable java.util.Map<java.lang.String,java.lang.String>, @Nullable java.util.List<java.net.HttpCookie>);
   }
 
-  public final class VideoSize {
-    method public int getHeight();
-    method public int getWidth();
-  }
-
   public interface VolumeAutomation {
     method @NonNull public android.media.VolumeShaper createVolumeShaper(@NonNull android.media.VolumeShaper.Configuration);
   }
@@ -27480,7 +27524,6 @@
     method @NonNull public java.util.List<android.media.Session2Token> getSession2Tokens();
     method public boolean isTrustedForMediaControl(@NonNull android.media.session.MediaSessionManager.RemoteUserInfo);
     method public void notifySession2Created(@NonNull android.media.Session2Token);
-    method public void notifySession2Destroyed(@NonNull android.media.Session2Token);
     method public void removeOnActiveSessionsChangedListener(@NonNull android.media.session.MediaSessionManager.OnActiveSessionsChangedListener);
     method public void removeOnSession2TokensChangedListener(@NonNull android.media.session.MediaSessionManager.OnSession2TokensChangedListener);
   }
@@ -28943,6 +28986,7 @@
   }
 
   public abstract class NetworkSpecifier {
+    ctor public NetworkSpecifier();
   }
 
   public class ParseException extends java.lang.RuntimeException {
@@ -29243,6 +29287,7 @@
     method public android.net.VpnService.Builder setBlocking(boolean);
     method public android.net.VpnService.Builder setConfigureIntent(android.app.PendingIntent);
     method public android.net.VpnService.Builder setHttpProxy(android.net.ProxyInfo);
+    method public android.net.VpnService.Builder setMetered(boolean);
     method public android.net.VpnService.Builder setMtu(int);
     method public android.net.VpnService.Builder setSession(String);
     method public android.net.VpnService.Builder setUnderlyingNetworks(android.net.Network[]);
@@ -29966,24 +30011,25 @@
     method @Deprecated public abstract void onSucceeded();
   }
 
-  public class WifiNetworkConfigBuilder {
-    ctor public WifiNetworkConfigBuilder();
-    method public android.net.NetworkSpecifier buildNetworkSpecifier();
-    method public android.net.wifi.WifiNetworkSuggestion buildNetworkSuggestion();
-    method public android.net.wifi.WifiNetworkConfigBuilder setBssid(@NonNull android.net.MacAddress);
-    method public android.net.wifi.WifiNetworkConfigBuilder setBssidPattern(@NonNull android.net.MacAddress, @NonNull android.net.MacAddress);
-    method public android.net.wifi.WifiNetworkConfigBuilder setIsAppInteractionRequired();
-    method public android.net.wifi.WifiNetworkConfigBuilder setIsEnhancedOpen();
-    method public android.net.wifi.WifiNetworkConfigBuilder setIsHiddenSsid();
-    method public android.net.wifi.WifiNetworkConfigBuilder setIsMetered();
-    method public android.net.wifi.WifiNetworkConfigBuilder setIsUserInteractionRequired();
-    method public android.net.wifi.WifiNetworkConfigBuilder setPriority(int);
-    method public android.net.wifi.WifiNetworkConfigBuilder setSsid(@NonNull String);
-    method public android.net.wifi.WifiNetworkConfigBuilder setSsidPattern(@NonNull android.os.PatternMatcher);
-    method public android.net.wifi.WifiNetworkConfigBuilder setWpa2EnterpriseConfig(@NonNull android.net.wifi.WifiEnterpriseConfig);
-    method public android.net.wifi.WifiNetworkConfigBuilder setWpa2Passphrase(@NonNull String);
-    method public android.net.wifi.WifiNetworkConfigBuilder setWpa3EnterpriseConfig(@NonNull android.net.wifi.WifiEnterpriseConfig);
-    method public android.net.wifi.WifiNetworkConfigBuilder setWpa3Passphrase(@NonNull String);
+  public final class WifiNetworkSpecifier extends android.net.NetworkSpecifier implements android.os.Parcelable {
+    method public int describeContents();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.net.wifi.WifiNetworkSpecifier> CREATOR;
+  }
+
+  public static class WifiNetworkSpecifier.Builder {
+    ctor public WifiNetworkSpecifier.Builder();
+    method public android.net.NetworkSpecifier build();
+    method public android.net.wifi.WifiNetworkSpecifier.Builder setBssid(@NonNull android.net.MacAddress);
+    method public android.net.wifi.WifiNetworkSpecifier.Builder setBssidPattern(@NonNull android.net.MacAddress, @NonNull android.net.MacAddress);
+    method public android.net.wifi.WifiNetworkSpecifier.Builder setIsEnhancedOpen();
+    method public android.net.wifi.WifiNetworkSpecifier.Builder setIsHiddenSsid();
+    method public android.net.wifi.WifiNetworkSpecifier.Builder setSsid(@NonNull String);
+    method public android.net.wifi.WifiNetworkSpecifier.Builder setSsidPattern(@NonNull android.os.PatternMatcher);
+    method public android.net.wifi.WifiNetworkSpecifier.Builder setWpa2EnterpriseConfig(@NonNull android.net.wifi.WifiEnterpriseConfig);
+    method public android.net.wifi.WifiNetworkSpecifier.Builder setWpa2Passphrase(@NonNull String);
+    method public android.net.wifi.WifiNetworkSpecifier.Builder setWpa3EnterpriseConfig(@NonNull android.net.wifi.WifiEnterpriseConfig);
+    method public android.net.wifi.WifiNetworkSpecifier.Builder setWpa3Passphrase(@NonNull String);
   }
 
   public final class WifiNetworkSuggestion implements android.os.Parcelable {
@@ -29992,6 +30038,23 @@
     field public static final android.os.Parcelable.Creator<android.net.wifi.WifiNetworkSuggestion> CREATOR;
   }
 
+  public static class WifiNetworkSuggestion.Builder {
+    ctor public WifiNetworkSuggestion.Builder();
+    method public android.net.wifi.WifiNetworkSuggestion build();
+    method public android.net.wifi.WifiNetworkSuggestion.Builder setBssid(@NonNull android.net.MacAddress);
+    method public android.net.wifi.WifiNetworkSuggestion.Builder setIsAppInteractionRequired();
+    method public android.net.wifi.WifiNetworkSuggestion.Builder setIsEnhancedOpen();
+    method public android.net.wifi.WifiNetworkSuggestion.Builder setIsHiddenSsid();
+    method public android.net.wifi.WifiNetworkSuggestion.Builder setIsMetered();
+    method public android.net.wifi.WifiNetworkSuggestion.Builder setIsUserInteractionRequired();
+    method public android.net.wifi.WifiNetworkSuggestion.Builder setPriority(int);
+    method public android.net.wifi.WifiNetworkSuggestion.Builder setSsid(@NonNull String);
+    method public android.net.wifi.WifiNetworkSuggestion.Builder setWpa2EnterpriseConfig(@NonNull android.net.wifi.WifiEnterpriseConfig);
+    method public android.net.wifi.WifiNetworkSuggestion.Builder setWpa2Passphrase(@NonNull String);
+    method public android.net.wifi.WifiNetworkSuggestion.Builder setWpa3EnterpriseConfig(@NonNull android.net.wifi.WifiEnterpriseConfig);
+    method public android.net.wifi.WifiNetworkSuggestion.Builder setWpa3Passphrase(@NonNull String);
+  }
+
   public class WpsInfo implements android.os.Parcelable {
     ctor public WpsInfo();
     ctor public WpsInfo(android.net.wifi.WpsInfo);
@@ -30357,6 +30420,7 @@
     method public void removeLocalService(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.nsd.WifiP2pServiceInfo, android.net.wifi.p2p.WifiP2pManager.ActionListener);
     method public void removeServiceRequest(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.nsd.WifiP2pServiceRequest, android.net.wifi.p2p.WifiP2pManager.ActionListener);
     method public void requestConnectionInfo(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ConnectionInfoListener);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void requestDeviceInfo(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @NonNull android.net.wifi.p2p.WifiP2pManager.DeviceInfoListener);
     method public void requestDiscoveryState(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @NonNull android.net.wifi.p2p.WifiP2pManager.DiscoveryStateListener);
     method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void requestGroupInfo(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.GroupInfoListener);
     method public void requestNetworkInfo(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @NonNull android.net.wifi.p2p.WifiP2pManager.NetworkInfoListener);
@@ -30405,6 +30469,10 @@
     method public void onConnectionInfoAvailable(android.net.wifi.p2p.WifiP2pInfo);
   }
 
+  public static interface WifiP2pManager.DeviceInfoListener {
+    method public void onDeviceInfoAvailable(android.net.wifi.p2p.WifiP2pDevice);
+  }
+
   public static interface WifiP2pManager.DiscoveryStateListener {
     method public void onDiscoveryStateAvailable(int);
   }
@@ -30590,6 +30658,7 @@
   }
 
   public final class NfcAdapter {
+    method public boolean deviceSupportsNfcSecure();
     method public void disableForegroundDispatch(android.app.Activity);
     method @Deprecated public void disableForegroundNdefPush(android.app.Activity);
     method public void disableReaderMode(android.app.Activity);
@@ -30602,6 +30671,7 @@
     method @Deprecated public boolean invokeBeam(android.app.Activity);
     method public boolean isEnabled();
     method @Deprecated public boolean isNdefPushEnabled();
+    method public boolean isNfcSecureEnabled();
     method @Deprecated public void setBeamPushUris(android.net.Uri[], android.app.Activity);
     method @Deprecated public void setBeamPushUrisCallback(android.nfc.NfcAdapter.CreateBeamUrisCallback, android.app.Activity);
     method @Deprecated public void setNdefPushMessage(android.nfc.NdefMessage, android.app.Activity, android.app.Activity...);
@@ -36487,7 +36557,7 @@
     field public static final String ACCOUNT_TYPE_LOCAL = "LOCAL";
     field public static final String ACTION_EVENT_REMINDER = "android.intent.action.EVENT_REMINDER";
     field public static final String ACTION_HANDLE_CUSTOM_EVENT = "android.provider.calendar.action.HANDLE_CUSTOM_EVENT";
-    field public static final String ACTION_VIEW_WORK_CALENDAR_EVENT = "android.provider.calendar.action.VIEW_WORK_CALENDAR_EVENT";
+    field public static final String ACTION_VIEW_MANAGED_PROFILE_CALENDAR_EVENT = "android.provider.calendar.action.VIEW_MANAGED_PROFILE_CALENDAR_EVENT";
     field public static final String AUTHORITY = "com.android.calendar";
     field public static final String CALLER_IS_SYNCADAPTER = "caller_is_syncadapter";
     field public static final android.net.Uri CONTENT_URI;
@@ -38447,13 +38517,13 @@
     field public static final String BUCKET_ID = "bucket_id";
     field public static final String DATE_TAKEN = "datetaken";
     field public static final String DESCRIPTION = "description";
+    field public static final String GROUP_ID = "group_id";
     field public static final String IS_PRIVATE = "isprivate";
     field @Deprecated public static final String LATITUDE = "latitude";
     field @Deprecated public static final String LONGITUDE = "longitude";
     field @Deprecated public static final String MINI_THUMB_MAGIC = "mini_thumb_magic";
     field public static final String ORIENTATION = "orientation";
     field @Deprecated public static final String PICASA_ID = "picasa_id";
-    field public static final String SECONDARY_BUCKET_ID = "secondary_bucket_id";
   }
 
   public static final class MediaStore.Images.Media implements android.provider.MediaStore.Images.ImageColumns {
@@ -38507,6 +38577,8 @@
     field public static final String IS_TRASHED = "is_trashed";
     field public static final String MIME_TYPE = "mime_type";
     field public static final String OWNER_PACKAGE_NAME = "owner_package_name";
+    field public static final String PRIMARY_DIRECTORY = "primary_directory";
+    field public static final String SECONDARY_DIRECTORY = "secondary_directory";
     field public static final String SIZE = "_size";
     field public static final String TITLE = "title";
     field public static final String WIDTH = "width";
@@ -38574,13 +38646,13 @@
     field public static final String DATE_TAKEN = "datetaken";
     field public static final String DESCRIPTION = "description";
     field public static final String DURATION = "duration";
+    field public static final String GROUP_ID = "group_id";
     field public static final String IS_PRIVATE = "isprivate";
     field public static final String LANGUAGE = "language";
     field @Deprecated public static final String LATITUDE = "latitude";
     field @Deprecated public static final String LONGITUDE = "longitude";
     field @Deprecated public static final String MINI_THUMB_MAGIC = "mini_thumb_magic";
     field public static final String RESOLUTION = "resolution";
-    field public static final String SECONDARY_BUCKET_ID = "secondary_bucket_id";
     field public static final String TAGS = "tags";
   }
 
@@ -38804,6 +38876,7 @@
     field @Deprecated public static final int LOCATION_MODE_BATTERY_SAVING = 2; // 0x2
     field @Deprecated public static final int LOCATION_MODE_HIGH_ACCURACY = 3; // 0x3
     field @Deprecated public static final int LOCATION_MODE_OFF = 0; // 0x0
+    field @Deprecated public static final int LOCATION_MODE_ON = 3; // 0x3
     field @Deprecated public static final int LOCATION_MODE_SENSORS_ONLY = 1; // 0x1
     field @Deprecated public static final String LOCATION_PROVIDERS_ALLOWED = "location_providers_allowed";
     field @Deprecated public static final String LOCK_PATTERN_ENABLED = "lock_pattern_autolock";
@@ -41515,6 +41588,7 @@
     method public void onNotificationRemoved(android.service.notification.StatusBarNotification);
     method public void onNotificationRemoved(android.service.notification.StatusBarNotification, android.service.notification.NotificationListenerService.RankingMap);
     method public void onNotificationRemoved(android.service.notification.StatusBarNotification, android.service.notification.NotificationListenerService.RankingMap, int);
+    method public void onStatusBarIconsBehaviorChanged(boolean);
     method public final void requestInterruptionFilter(int);
     method public final void requestListenerHints(int);
     method public static void requestRebind(android.content.ComponentName);
@@ -41827,10 +41901,6 @@
     method public void showSession(android.os.Bundle, int);
     field public static final String SERVICE_INTERFACE = "android.service.voice.VoiceInteractionService";
     field public static final String SERVICE_META_DATA = "android.voice_interaction";
-    field public static final int VOICE_STATE_CONDITIONAL_LISTENING = 1; // 0x1
-    field public static final int VOICE_STATE_FULFILLING = 3; // 0x3
-    field public static final int VOICE_STATE_LISTENING = 2; // 0x2
-    field public static final int VOICE_STATE_NONE = 0; // 0x0
   }
 
   public class VoiceInteractionSession implements android.content.ComponentCallbacks2 android.view.KeyEvent.Callback {
@@ -43882,8 +43952,8 @@
   }
 
   public static final class VideoProfile.CameraCapabilities implements android.os.Parcelable {
-    ctor public VideoProfile.CameraCapabilities(int, int);
-    ctor public VideoProfile.CameraCapabilities(int, int, boolean, float);
+    ctor public VideoProfile.CameraCapabilities(@IntRange(from=0) int, @IntRange(from=0) int);
+    ctor public VideoProfile.CameraCapabilities(@IntRange(from=0) int, @IntRange(from=0) int, boolean, @FloatRange(from=1.0f) float);
     method public int describeContents();
     method public int getHeight();
     method public float getMaxZoom();
@@ -44143,6 +44213,9 @@
     field public static final String KEY_MONTHLY_DATA_CYCLE_DAY_INT = "monthly_data_cycle_day_int";
     field public static final String KEY_ONLY_SINGLE_DC_ALLOWED_INT_ARRAY = "only_single_dc_allowed_int_array";
     field public static final String KEY_OPERATOR_SELECTION_EXPAND_BOOL = "operator_selection_expand_bool";
+    field public static final String KEY_OPPORTUNISTIC_NETWORK_DATA_SWITCH_HYSTERESIS_TIME_LONG = "opportunistic_network_data_switch_hysteresis_time_long";
+    field public static final String KEY_OPPORTUNISTIC_NETWORK_ENTRY_OR_EXIT_HYSTERESIS_TIME_LONG = "opportunistic_network_entry_or_exit_hysteresis_time_long";
+    field public static final String KEY_OPPORTUNISTIC_NETWORK_ENTRY_THRESHOLD_BANDWIDTH_INT = "opportunistic_network_entry_threshold_bandwidth_int";
     field public static final String KEY_OPPORTUNISTIC_NETWORK_ENTRY_THRESHOLD_RSRP_INT = "opportunistic_network_entry_threshold_rsrp_int";
     field public static final String KEY_OPPORTUNISTIC_NETWORK_ENTRY_THRESHOLD_RSSNR_INT = "opportunistic_network_entry_threshold_rssnr_int";
     field public static final String KEY_OPPORTUNISTIC_NETWORK_EXIT_THRESHOLD_RSRP_INT = "opportunistic_network_exit_threshold_rsrp_int";
@@ -44811,6 +44884,7 @@
   public class SubscriptionInfo implements android.os.Parcelable {
     method public android.graphics.Bitmap createIconBitmap(android.content.Context);
     method public int describeContents();
+    method public int getCardId();
     method public int getCarrierId();
     method public CharSequence getCarrierName();
     method public String getCountryIso();
@@ -44927,6 +45001,7 @@
     method public android.telephony.TelephonyManager createForSubscriptionId(int);
     method @RequiresPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) public java.util.List<android.telephony.CellInfo> getAllCellInfo();
     method public int getCallState();
+    method public int getCardIdForDefaultEuicc();
     method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) @WorkerThread public android.os.PersistableBundle getCarrierConfig();
     method public int getCarrierIdFromSimMccMnc();
     method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public android.telephony.CellLocation getCellLocation();
@@ -44974,6 +45049,7 @@
     method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getSubscriberId();
     method public String getTypeAllocationCode();
     method public String getTypeAllocationCode(int);
+    method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public java.util.List<android.telephony.UiccCardInfo> getUiccCardsInfo();
     method @Nullable @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getVisualVoicemailPackageName();
     method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getVoiceMailAlphaTag();
     method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getVoiceMailNumber();
@@ -45016,6 +45092,7 @@
     method public boolean setVoiceMailNumber(String, String);
     method @Deprecated public void setVoicemailRingtoneUri(android.telecom.PhoneAccountHandle, android.net.Uri);
     method @Deprecated public void setVoicemailVibrationEnabled(android.telecom.PhoneAccountHandle, boolean);
+    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void switchMultiSimConfig(int);
     method public boolean updateAvailableNetworks(java.util.List<android.telephony.AvailableNetworkInfo>);
     field public static final String ACTION_CONFIGURE_VOICEMAIL = "android.telephony.action.CONFIGURE_VOICEMAIL";
     field public static final String ACTION_NETWORK_COUNTRY_CHANGED = "android.telephony.action.NETWORK_COUNTRY_CHANGED";
@@ -45068,6 +45145,7 @@
     field public static final String EXTRA_STATE_RINGING;
     field public static final String EXTRA_SUBSCRIPTION_ID = "android.telephony.extra.SUBSCRIPTION_ID";
     field public static final String EXTRA_VOICEMAIL_NUMBER = "android.telephony.extra.VOICEMAIL_NUMBER";
+    field public static final int INVALID_CARD_ID = -1; // 0xffffffff
     field public static final String METADATA_HIDE_VOICEMAIL_SETTINGS_MENU = "android.telephony.HIDE_VOICEMAIL_SETTINGS_MENU";
     field public static final int NETWORK_TYPE_1xRTT = 7; // 0x7
     field public static final int NETWORK_TYPE_CDMA = 4; // 0x4
@@ -45135,6 +45213,18 @@
     method public void onResults(java.util.List<android.telephony.CellInfo>);
   }
 
+  public final class UiccCardInfo implements android.os.Parcelable {
+    ctor public UiccCardInfo(boolean, int, String, String, int);
+    method public int describeContents();
+    method public int getCardId();
+    method public String getEid();
+    method public String getIccId();
+    method public int getSlotIndex();
+    method public boolean isEuicc();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.telephony.UiccCardInfo> CREATOR;
+  }
+
   public abstract class VisualVoicemailService extends android.app.Service {
     ctor public VisualVoicemailService();
     method public android.os.IBinder onBind(android.content.Intent);
@@ -49720,6 +49810,7 @@
     field public static final int EDGE_RIGHT = 8; // 0x8
     field public static final int EDGE_TOP = 1; // 0x1
     field public static final int FLAG_WINDOW_IS_OBSCURED = 1; // 0x1
+    field public static final int FLAG_WINDOW_IS_PARTIALLY_OBSCURED = 2; // 0x2
     field public static final int INVALID_POINTER_ID = -1; // 0xffffffff
     field public static final int TOOL_TYPE_ERASER = 4; // 0x4
     field public static final int TOOL_TYPE_FINGER = 1; // 0x1
@@ -50272,6 +50363,7 @@
     method public final int getScrollX();
     method public final int getScrollY();
     method @android.view.ViewDebug.ExportedProperty(category="drawing") @ColorInt public int getSolidColor();
+    method @LayoutRes public int getSourceLayoutResId();
     method public android.animation.StateListAnimator getStateListAnimator();
     method protected int getSuggestedMinimumHeight();
     method protected int getSuggestedMinimumWidth();
@@ -50936,6 +51028,7 @@
   public class ViewConfiguration {
     ctor @Deprecated public ViewConfiguration();
     method public static android.view.ViewConfiguration get(android.content.Context);
+    method @FloatRange(from=1.0) public static float getAmbiguousGestureMultiplier();
     method public static long getDefaultActionModeHideDuration();
     method public static int getDoubleTapTimeout();
     method @Deprecated public static int getEdgeSlop();
@@ -52815,7 +52908,7 @@
     method @NonNull public final android.view.ViewStructure newVirtualViewStructure(@NonNull android.view.autofill.AutofillId, long);
     method public final void notifyViewAppeared(@NonNull android.view.ViewStructure);
     method public final void notifyViewDisappeared(@NonNull android.view.autofill.AutofillId);
-    method public final void notifyViewTextChanged(@NonNull android.view.autofill.AutofillId, @Nullable CharSequence, int);
+    method public final void notifyViewTextChanged(@NonNull android.view.autofill.AutofillId, @Nullable CharSequence);
     method public final void notifyViewsDisappeared(@NonNull android.view.autofill.AutofillId, @NonNull long[]);
   }
 
@@ -52827,6 +52920,9 @@
 
   public final class UserDataRemovalRequest implements android.os.Parcelable {
     method public int describeContents();
+    method @NonNull public String getPackageName();
+    method @NonNull public java.util.List<android.view.contentcapture.UserDataRemovalRequest.UriRequest> getUriRequests();
+    method public boolean isForEverything();
     method public void writeToParcel(android.os.Parcel, int);
     field public static final android.os.Parcelable.Creator<android.view.contentcapture.UserDataRemovalRequest> CREATOR;
   }
@@ -52838,6 +52934,11 @@
     method @NonNull public android.view.contentcapture.UserDataRemovalRequest.Builder forEverything();
   }
 
+  public final class UserDataRemovalRequest.UriRequest {
+    method @NonNull public android.net.Uri getUri();
+    method @NonNull public boolean isRecursive();
+  }
+
 }
 
 package android.view.inputmethod {
@@ -55942,8 +56043,7 @@
     method public void show(@FloatRange(from=0) float, @FloatRange(from=0) float, float, float);
     method public void update();
     field public static final int SOURCE_BOUND_MAX_IN_SURFACE = 0; // 0x0
-    field public static final int SOURCE_BOUND_MAX_IN_VIEW = 1; // 0x1
-    field public static final int SOURCE_BOUND_MAX_VISIBLE = 2; // 0x2
+    field public static final int SOURCE_BOUND_MAX_VISIBLE = 1; // 0x1
   }
 
   public static class Magnifier.Builder {
@@ -58057,13 +58157,13 @@
     ctor public ByteArrayOutputStream(int);
     method public void reset();
     method public int size();
-    method public byte[] toByteArray();
+    method @NonNull public byte[] toByteArray();
     method @NonNull public String toString(@NonNull String) throws java.io.UnsupportedEncodingException;
     method @Deprecated @NonNull public String toString(int);
     method public void write(int);
-    method public void write(byte[], int, int);
+    method public void write(@NonNull byte[], int, int);
     method public void writeTo(@NonNull java.io.OutputStream) throws java.io.IOException;
-    field protected byte[] buf;
+    field @NonNull protected byte[] buf;
     field protected int count;
   }
 
@@ -58234,12 +58334,12 @@
     method public boolean isHidden();
     method public long lastModified();
     method public long length();
-    method public String[] list();
-    method public String[] list(@Nullable java.io.FilenameFilter);
-    method public java.io.File[] listFiles();
-    method public java.io.File[] listFiles(@Nullable java.io.FilenameFilter);
-    method public java.io.File[] listFiles(@Nullable java.io.FileFilter);
-    method public static java.io.File[] listRoots();
+    method @Nullable public String[] list();
+    method @Nullable public String[] list(@Nullable java.io.FilenameFilter);
+    method @Nullable public java.io.File[] listFiles();
+    method @Nullable public java.io.File[] listFiles(@Nullable java.io.FilenameFilter);
+    method @Nullable public java.io.File[] listFiles(@Nullable java.io.FileFilter);
+    method @NonNull public static java.io.File[] listRoots();
     method public boolean mkdir();
     method public boolean mkdirs();
     method public boolean renameTo(@NonNull java.io.File);
@@ -58728,8 +58828,8 @@
     method protected void clearError();
     method public void close();
     method public void flush();
-    method @NonNull public java.io.PrintWriter format(@NonNull String, java.lang.Object...);
-    method @NonNull public java.io.PrintWriter format(@Nullable java.util.Locale, @NonNull String, java.lang.Object...);
+    method @NonNull public java.io.PrintWriter format(@NonNull String, @NonNull java.lang.Object...);
+    method @NonNull public java.io.PrintWriter format(@Nullable java.util.Locale, @NonNull String, @NonNull java.lang.Object...);
     method public void print(boolean);
     method public void print(char);
     method public void print(int);
@@ -58739,8 +58839,8 @@
     method public void print(char[]);
     method public void print(@Nullable String);
     method public void print(@Nullable Object);
-    method @NonNull public java.io.PrintWriter printf(@NonNull String, java.lang.Object...);
-    method @NonNull public java.io.PrintWriter printf(@Nullable java.util.Locale, @NonNull String, java.lang.Object...);
+    method @NonNull public java.io.PrintWriter printf(@NonNull String, @NonNull java.lang.Object...);
+    method @NonNull public java.io.PrintWriter printf(@Nullable java.util.Locale, @NonNull String, @NonNull java.lang.Object...);
     method public void println();
     method public void println(boolean);
     method public void println(char);
@@ -59566,45 +59666,45 @@
     method @NonNull public static Class<?> forName(@NonNull String) throws java.lang.ClassNotFoundException;
     method @NonNull public static Class<?> forName(@NonNull String, boolean, @Nullable ClassLoader) throws java.lang.ClassNotFoundException;
     method @Nullable public <A extends java.lang.annotation.Annotation> A getAnnotation(@NonNull Class<A>);
-    method public java.lang.annotation.Annotation[] getAnnotations();
+    method @NonNull public java.lang.annotation.Annotation[] getAnnotations();
     method @NonNull public <A extends java.lang.annotation.Annotation> A[] getAnnotationsByType(@NonNull Class<A>);
     method @Nullable public String getCanonicalName();
     method @Nullable public ClassLoader getClassLoader();
-    method public Class<?>[] getClasses();
+    method @NonNull public Class<?>[] getClasses();
     method @Nullable public Class<?> getComponentType();
-    method @NonNull public java.lang.reflect.Constructor<T> getConstructor(Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
-    method public java.lang.reflect.Constructor<?>[] getConstructors() throws java.lang.SecurityException;
+    method @NonNull public java.lang.reflect.Constructor<T> getConstructor(@Nullable Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
+    method @NonNull public java.lang.reflect.Constructor<?>[] getConstructors() throws java.lang.SecurityException;
     method @Nullable public <A extends java.lang.annotation.Annotation> A getDeclaredAnnotation(@NonNull Class<A>);
-    method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
-    method public Class<?>[] getDeclaredClasses();
-    method @NonNull public java.lang.reflect.Constructor<T> getDeclaredConstructor(Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
-    method public java.lang.reflect.Constructor<?>[] getDeclaredConstructors() throws java.lang.SecurityException;
+    method @NonNull public java.lang.annotation.Annotation[] getDeclaredAnnotations();
+    method @NonNull public Class<?>[] getDeclaredClasses();
+    method @NonNull public java.lang.reflect.Constructor<T> getDeclaredConstructor(@Nullable Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
+    method @NonNull public java.lang.reflect.Constructor<?>[] getDeclaredConstructors() throws java.lang.SecurityException;
     method @NonNull public java.lang.reflect.Field getDeclaredField(@NonNull String) throws java.lang.NoSuchFieldException;
-    method public java.lang.reflect.Field[] getDeclaredFields();
-    method @NonNull public java.lang.reflect.Method getDeclaredMethod(@NonNull String, Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
-    method public java.lang.reflect.Method[] getDeclaredMethods() throws java.lang.SecurityException;
+    method @NonNull public java.lang.reflect.Field[] getDeclaredFields();
+    method @NonNull public java.lang.reflect.Method getDeclaredMethod(@NonNull String, @Nullable Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
+    method @NonNull public java.lang.reflect.Method[] getDeclaredMethods() throws java.lang.SecurityException;
     method @Nullable public Class<?> getDeclaringClass();
     method @Nullable public Class<?> getEnclosingClass();
     method @Nullable public java.lang.reflect.Constructor<?> getEnclosingConstructor();
     method @Nullable public java.lang.reflect.Method getEnclosingMethod();
-    method public T[] getEnumConstants();
+    method @Nullable public T[] getEnumConstants();
     method @NonNull public java.lang.reflect.Field getField(@NonNull String) throws java.lang.NoSuchFieldException;
-    method public java.lang.reflect.Field[] getFields() throws java.lang.SecurityException;
-    method public java.lang.reflect.Type[] getGenericInterfaces();
+    method @NonNull public java.lang.reflect.Field[] getFields() throws java.lang.SecurityException;
+    method @NonNull public java.lang.reflect.Type[] getGenericInterfaces();
     method @Nullable public java.lang.reflect.Type getGenericSuperclass();
-    method public Class<?>[] getInterfaces();
-    method @NonNull public java.lang.reflect.Method getMethod(@NonNull String, Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
-    method public java.lang.reflect.Method[] getMethods() throws java.lang.SecurityException;
+    method @NonNull public Class<?>[] getInterfaces();
+    method @NonNull public java.lang.reflect.Method getMethod(@NonNull String, @Nullable Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
+    method @NonNull public java.lang.reflect.Method[] getMethods() throws java.lang.SecurityException;
     method public int getModifiers();
     method @NonNull public String getName();
     method @Nullable public Package getPackage();
     method @Nullable public java.security.ProtectionDomain getProtectionDomain();
     method @Nullable public java.net.URL getResource(@NonNull String);
     method @Nullable public java.io.InputStream getResourceAsStream(@NonNull String);
-    method public Object[] getSigners();
+    method @Nullable public Object[] getSigners();
     method @NonNull public String getSimpleName();
     method @Nullable public Class<? super T> getSuperclass();
-    method public java.lang.reflect.TypeVariable<java.lang.Class<T>>[] getTypeParameters();
+    method @NonNull public java.lang.reflect.TypeVariable<java.lang.Class<T>>[] getTypeParameters();
     method public boolean isAnnotation();
     method public boolean isAnonymousClass();
     method public boolean isArray();
@@ -60491,8 +60591,8 @@
     method @NonNull public static String copyValueOf(char[]);
     method public boolean endsWith(@NonNull String);
     method public boolean equalsIgnoreCase(@Nullable String);
-    method @NonNull public static String format(@NonNull String, java.lang.Object...);
-    method @NonNull public static String format(@NonNull java.util.Locale, @NonNull String, java.lang.Object...);
+    method @NonNull public static String format(@NonNull String, @NonNull java.lang.Object...);
+    method @NonNull public static String format(@NonNull java.util.Locale, @NonNull String, @NonNull java.lang.Object...);
     method @Deprecated public void getBytes(int, int, byte[], int);
     method public byte[] getBytes(@NonNull String) throws java.io.UnsupportedEncodingException;
     method public byte[] getBytes(@NonNull java.nio.charset.Charset);
@@ -60504,7 +60604,7 @@
     method public int indexOf(@NonNull String, int);
     method @NonNull public String intern();
     method public boolean isEmpty();
-    method @NonNull public static String join(@NonNull CharSequence, java.lang.CharSequence...);
+    method @NonNull public static String join(@NonNull CharSequence, @Nullable java.lang.CharSequence...);
     method @NonNull public static String join(@NonNull CharSequence, @NonNull Iterable<? extends java.lang.CharSequence>);
     method public int lastIndexOf(int);
     method public int lastIndexOf(int, int);
@@ -60519,8 +60619,8 @@
     method @NonNull public String replace(@NonNull CharSequence, @NonNull CharSequence);
     method @NonNull public String replaceAll(@NonNull String, @NonNull String);
     method @NonNull public String replaceFirst(@NonNull String, @NonNull String);
-    method public String[] split(@NonNull String, int);
-    method public String[] split(@NonNull String);
+    method @NonNull public String[] split(@NonNull String, int);
+    method @NonNull public String[] split(@NonNull String);
     method public boolean startsWith(@NonNull String, int);
     method public boolean startsWith(@NonNull String);
     method @NonNull public CharSequence subSequence(int, int);
@@ -60721,7 +60821,7 @@
     method public long getId();
     method @NonNull public final String getName();
     method public final int getPriority();
-    method public StackTraceElement[] getStackTrace();
+    method @NonNull public StackTraceElement[] getStackTrace();
     method @NonNull public java.lang.Thread.State getState();
     method @Nullable public final ThreadGroup getThreadGroup();
     method @Nullable public java.lang.Thread.UncaughtExceptionHandler getUncaughtExceptionHandler();
@@ -60819,13 +60919,13 @@
     method @Nullable public Throwable getCause();
     method @Nullable public String getLocalizedMessage();
     method @Nullable public String getMessage();
-    method public StackTraceElement[] getStackTrace();
-    method public final Throwable[] getSuppressed();
+    method @NonNull public StackTraceElement[] getStackTrace();
+    method @NonNull public final Throwable[] getSuppressed();
     method @NonNull public Throwable initCause(@Nullable Throwable);
     method public void printStackTrace();
     method public void printStackTrace(@NonNull java.io.PrintStream);
     method public void printStackTrace(@NonNull java.io.PrintWriter);
-    method public void setStackTrace(StackTraceElement[]);
+    method public void setStackTrace(@NonNull StackTraceElement[]);
   }
 
   public class TypeNotPresentException extends java.lang.RuntimeException {
@@ -61148,8 +61248,8 @@
   public class AccessibleObject implements java.lang.reflect.AnnotatedElement {
     ctor protected AccessibleObject();
     method @Nullable public <T extends java.lang.annotation.Annotation> T getAnnotation(@NonNull Class<T>);
-    method public java.lang.annotation.Annotation[] getAnnotations();
-    method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
+    method @NonNull public java.lang.annotation.Annotation[] getAnnotations();
+    method @NonNull public java.lang.annotation.Annotation[] getDeclaredAnnotations();
     method public boolean isAccessible();
     method public static void setAccessible(java.lang.reflect.AccessibleObject[], boolean) throws java.lang.SecurityException;
     method public void setAccessible(boolean) throws java.lang.SecurityException;
@@ -61157,10 +61257,10 @@
 
   public interface AnnotatedElement {
     method @Nullable public <T extends java.lang.annotation.Annotation> T getAnnotation(@NonNull Class<T>);
-    method public java.lang.annotation.Annotation[] getAnnotations();
+    method @NonNull public java.lang.annotation.Annotation[] getAnnotations();
     method public default <T extends java.lang.annotation.Annotation> T[] getAnnotationsByType(@NonNull Class<T>);
     method @Nullable public default <T extends java.lang.annotation.Annotation> T getDeclaredAnnotation(@NonNull Class<T>);
-    method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
+    method @NonNull public java.lang.annotation.Annotation[] getDeclaredAnnotations();
     method public default <T extends java.lang.annotation.Annotation> T[] getDeclaredAnnotationsByType(@NonNull Class<T>);
     method public default boolean isAnnotationPresent(@NonNull Class<? extends java.lang.annotation.Annotation>);
   }
@@ -61195,20 +61295,20 @@
     method public int getModifiers();
     method @NonNull public String getName();
     method public java.lang.annotation.Annotation[][] getParameterAnnotations();
-    method public Class<?>[] getParameterTypes();
+    method @NonNull public Class<?>[] getParameterTypes();
     method public java.lang.reflect.TypeVariable<java.lang.reflect.Constructor<T>>[] getTypeParameters();
     method @NonNull public T newInstance(java.lang.Object...) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException, java.lang.InstantiationException, java.lang.reflect.InvocationTargetException;
     method @NonNull public String toGenericString();
   }
 
   public abstract class Executable extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member {
-    method public abstract Class<?>[] getExceptionTypes();
-    method public java.lang.reflect.Type[] getGenericExceptionTypes();
-    method public java.lang.reflect.Type[] getGenericParameterTypes();
-    method public abstract java.lang.annotation.Annotation[][] getParameterAnnotations();
+    method @NonNull public abstract Class<?>[] getExceptionTypes();
+    method @NonNull public java.lang.reflect.Type[] getGenericExceptionTypes();
+    method @NonNull public java.lang.reflect.Type[] getGenericParameterTypes();
+    method @NonNull public abstract java.lang.annotation.Annotation[][] getParameterAnnotations();
     method public int getParameterCount();
-    method public abstract Class<?>[] getParameterTypes();
-    method public java.lang.reflect.Parameter[] getParameters();
+    method @NonNull public abstract Class<?>[] getParameterTypes();
+    method @NonNull public java.lang.reflect.Parameter[] getParameters();
     method public final boolean isAnnotationPresent(@NonNull Class<? extends java.lang.annotation.Annotation>);
     method public boolean isSynthetic();
     method public boolean isVarArgs();
@@ -61297,7 +61397,7 @@
     method @NonNull public Class<?>[] getParameterTypes();
     method @NonNull public Class<?> getReturnType();
     method @NonNull public java.lang.reflect.TypeVariable<java.lang.reflect.Method>[] getTypeParameters();
-    method @Nullable public Object invoke(@Nullable Object, java.lang.Object...) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException, java.lang.reflect.InvocationTargetException;
+    method @Nullable public Object invoke(@Nullable Object, @Nullable java.lang.Object...) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException, java.lang.reflect.InvocationTargetException;
     method public boolean isBridge();
     method public boolean isDefault();
     method @NonNull public String toGenericString();
@@ -61340,8 +61440,8 @@
 
   public final class Parameter implements java.lang.reflect.AnnotatedElement {
     method @Nullable public <T extends java.lang.annotation.Annotation> T getAnnotation(@NonNull Class<T>);
-    method public java.lang.annotation.Annotation[] getAnnotations();
-    method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
+    method @NonNull public java.lang.annotation.Annotation[] getAnnotations();
+    method @NonNull public java.lang.annotation.Annotation[] getDeclaredAnnotations();
     method @NonNull public java.lang.reflect.Executable getDeclaringExecutable();
     method public int getModifiers();
     method @NonNull public String getName();
@@ -61354,7 +61454,7 @@
   }
 
   public interface ParameterizedType extends java.lang.reflect.Type {
-    method public java.lang.reflect.Type[] getActualTypeArguments();
+    method @NonNull public java.lang.reflect.Type[] getActualTypeArguments();
     method @Nullable public java.lang.reflect.Type getOwnerType();
     method @NonNull public java.lang.reflect.Type getRawType();
   }
@@ -61362,9 +61462,9 @@
   public class Proxy implements java.io.Serializable {
     ctor protected Proxy(@NonNull java.lang.reflect.InvocationHandler);
     method @NonNull public static java.lang.reflect.InvocationHandler getInvocationHandler(@NonNull Object) throws java.lang.IllegalArgumentException;
-    method @NonNull public static Class<?> getProxyClass(@Nullable ClassLoader, Class<?>...) throws java.lang.IllegalArgumentException;
+    method @NonNull public static Class<?> getProxyClass(@Nullable ClassLoader, @NonNull Class<?>...) throws java.lang.IllegalArgumentException;
     method public static boolean isProxyClass(@NonNull Class<?>);
-    method @NonNull public static Object newProxyInstance(@Nullable ClassLoader, Class<?>[], @NonNull java.lang.reflect.InvocationHandler) throws java.lang.IllegalArgumentException;
+    method @NonNull public static Object newProxyInstance(@Nullable ClassLoader, @NonNull Class<?>[], @NonNull java.lang.reflect.InvocationHandler) throws java.lang.IllegalArgumentException;
     field protected java.lang.reflect.InvocationHandler h;
   }
 
@@ -61378,7 +61478,7 @@
   }
 
   public interface TypeVariable<D extends java.lang.reflect.GenericDeclaration> extends java.lang.reflect.Type {
-    method public java.lang.reflect.Type[] getBounds();
+    method @NonNull public java.lang.reflect.Type[] getBounds();
     method @NonNull public D getGenericDeclaration();
     method @NonNull public String getName();
   }
@@ -61390,8 +61490,8 @@
   }
 
   public interface WildcardType extends java.lang.reflect.Type {
-    method public java.lang.reflect.Type[] getLowerBounds();
-    method public java.lang.reflect.Type[] getUpperBounds();
+    method @NonNull public java.lang.reflect.Type[] getLowerBounds();
+    method @NonNull public java.lang.reflect.Type[] getUpperBounds();
   }
 
 }
@@ -62435,7 +62535,7 @@
   public abstract class ByteBuffer extends java.nio.Buffer implements java.lang.Comparable<java.nio.ByteBuffer> {
     method @NonNull public static java.nio.ByteBuffer allocate(int);
     method @NonNull public static java.nio.ByteBuffer allocateDirect(int);
-    method public final byte[] array();
+    method @NonNull public final byte[] array();
     method public final int arrayOffset();
     method @NonNull public abstract java.nio.CharBuffer asCharBuffer();
     method @NonNull public abstract java.nio.DoubleBuffer asDoubleBuffer();
@@ -62449,8 +62549,8 @@
     method @NonNull public abstract java.nio.ByteBuffer duplicate();
     method public abstract byte get();
     method public abstract byte get(int);
-    method @NonNull public java.nio.ByteBuffer get(byte[], int, int);
-    method @NonNull public java.nio.ByteBuffer get(byte[]);
+    method @NonNull public java.nio.ByteBuffer get(@NonNull byte[], int, int);
+    method @NonNull public java.nio.ByteBuffer get(@NonNull byte[]);
     method public abstract char getChar();
     method public abstract char getChar(int);
     method public abstract double getDouble();
@@ -62469,8 +62569,8 @@
     method @NonNull public abstract java.nio.ByteBuffer put(byte);
     method @NonNull public abstract java.nio.ByteBuffer put(int, byte);
     method @NonNull public java.nio.ByteBuffer put(@NonNull java.nio.ByteBuffer);
-    method @NonNull public java.nio.ByteBuffer put(byte[], int, int);
-    method @NonNull public final java.nio.ByteBuffer put(byte[]);
+    method @NonNull public java.nio.ByteBuffer put(@NonNull byte[], int, int);
+    method @NonNull public final java.nio.ByteBuffer put(@NonNull byte[]);
     method @NonNull public abstract java.nio.ByteBuffer putChar(char);
     method @NonNull public abstract java.nio.ByteBuffer putChar(int, char);
     method @NonNull public abstract java.nio.ByteBuffer putDouble(double);
@@ -62484,8 +62584,8 @@
     method @NonNull public abstract java.nio.ByteBuffer putShort(short);
     method @NonNull public abstract java.nio.ByteBuffer putShort(int, short);
     method @NonNull public abstract java.nio.ByteBuffer slice();
-    method @NonNull public static java.nio.ByteBuffer wrap(byte[], int, int);
-    method @NonNull public static java.nio.ByteBuffer wrap(byte[]);
+    method @NonNull public static java.nio.ByteBuffer wrap(@NonNull byte[], int, int);
+    method @NonNull public static java.nio.ByteBuffer wrap(@NonNull byte[]);
   }
 
   public final class ByteOrder {
@@ -64318,20 +64418,20 @@
 
   public abstract class MessageDigest extends java.security.MessageDigestSpi {
     ctor protected MessageDigest(@NonNull String);
-    method public byte[] digest();
-    method public int digest(byte[], int, int) throws java.security.DigestException;
-    method public byte[] digest(byte[]);
+    method @NonNull public byte[] digest();
+    method public int digest(@NonNull byte[], int, int) throws java.security.DigestException;
+    method @NonNull public byte[] digest(@NonNull byte[]);
     method @NonNull public final String getAlgorithm();
     method public final int getDigestLength();
     method @NonNull public static java.security.MessageDigest getInstance(@NonNull String) throws java.security.NoSuchAlgorithmException;
     method @NonNull public static java.security.MessageDigest getInstance(@NonNull String, @NonNull String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
     method @NonNull public static java.security.MessageDigest getInstance(@NonNull String, @NonNull java.security.Provider) throws java.security.NoSuchAlgorithmException;
     method @NonNull public final java.security.Provider getProvider();
-    method public static boolean isEqual(byte[], byte[]);
+    method public static boolean isEqual(@Nullable byte[], @Nullable byte[]);
     method public void reset();
     method public void update(byte);
-    method public void update(byte[], int, int);
-    method public void update(byte[]);
+    method public void update(@NonNull byte[], int, int);
+    method public void update(@NonNull byte[]);
     method public final void update(@NonNull java.nio.ByteBuffer);
   }
 
@@ -66938,7 +67038,7 @@
     method @NonNull public final StringBuffer format(@NonNull Object, @NonNull StringBuffer, @NonNull java.text.FieldPosition);
     method @NonNull public abstract StringBuffer format(@NonNull java.util.Date, @NonNull StringBuffer, @NonNull java.text.FieldPosition);
     method @NonNull public final String format(@NonNull java.util.Date);
-    method public static java.util.Locale[] getAvailableLocales();
+    method @NonNull public static java.util.Locale[] getAvailableLocales();
     method @NonNull public java.util.Calendar getCalendar();
     method @NonNull public static final java.text.DateFormat getDateInstance();
     method @NonNull public static final java.text.DateFormat getDateInstance(int);
@@ -67178,7 +67278,7 @@
     method @NonNull public final String format(long);
     method @NonNull public abstract StringBuffer format(double, @NonNull StringBuffer, @NonNull java.text.FieldPosition);
     method @NonNull public abstract StringBuffer format(long, @NonNull StringBuffer, @NonNull java.text.FieldPosition);
-    method public static java.util.Locale[] getAvailableLocales();
+    method @NonNull public static java.util.Locale[] getAvailableLocales();
     method @Nullable public java.util.Currency getCurrency();
     method @NonNull public static final java.text.NumberFormat getCurrencyInstance();
     method @NonNull public static java.text.NumberFormat getCurrencyInstance(@NonNull java.util.Locale);
@@ -68832,8 +68932,8 @@
     method public boolean remove(@Nullable Object);
     method public boolean removeAll(@NonNull java.util.Collection<?>);
     method public boolean retainAll(@NonNull java.util.Collection<?>);
-    method public Object[] toArray();
-    method public <T> T[] toArray(T[]);
+    method @NonNull public Object[] toArray();
+    method @NonNull public <T> T[] toArray(@NonNull T[]);
   }
 
   public abstract class AbstractList<E> extends java.util.AbstractCollection<E> implements java.util.List<E> {
@@ -68942,161 +69042,161 @@
   }
 
   public class Arrays {
-    method @NonNull @java.lang.SafeVarargs public static <T> java.util.List<T> asList(T...);
-    method public static int binarySearch(long[], long);
-    method public static int binarySearch(long[], int, int, long);
-    method public static int binarySearch(int[], int);
-    method public static int binarySearch(int[], int, int, int);
-    method public static int binarySearch(short[], short);
-    method public static int binarySearch(short[], int, int, short);
-    method public static int binarySearch(char[], char);
-    method public static int binarySearch(char[], int, int, char);
-    method public static int binarySearch(byte[], byte);
-    method public static int binarySearch(byte[], int, int, byte);
-    method public static int binarySearch(double[], double);
-    method public static int binarySearch(double[], int, int, double);
-    method public static int binarySearch(float[], float);
-    method public static int binarySearch(float[], int, int, float);
-    method public static int binarySearch(Object[], @NonNull Object);
-    method public static int binarySearch(Object[], int, int, @NonNull Object);
-    method public static <T> int binarySearch(T[], T, @Nullable java.util.Comparator<? super T>);
-    method public static <T> int binarySearch(T[], int, int, T, @Nullable java.util.Comparator<? super T>);
-    method public static <T> T[] copyOf(T[], int);
-    method public static <T, U> T[] copyOf(U[], int, @NonNull Class<? extends T[]>);
-    method public static byte[] copyOf(byte[], int);
-    method public static short[] copyOf(short[], int);
-    method public static int[] copyOf(int[], int);
-    method public static long[] copyOf(long[], int);
-    method public static char[] copyOf(char[], int);
-    method public static float[] copyOf(float[], int);
-    method public static double[] copyOf(double[], int);
-    method public static boolean[] copyOf(boolean[], int);
-    method public static <T> T[] copyOfRange(T[], int, int);
-    method public static <T, U> T[] copyOfRange(U[], int, int, @NonNull Class<? extends T[]>);
-    method public static byte[] copyOfRange(byte[], int, int);
-    method public static short[] copyOfRange(short[], int, int);
-    method public static int[] copyOfRange(int[], int, int);
-    method public static long[] copyOfRange(long[], int, int);
-    method public static char[] copyOfRange(char[], int, int);
-    method public static float[] copyOfRange(float[], int, int);
-    method public static double[] copyOfRange(double[], int, int);
-    method public static boolean[] copyOfRange(boolean[], int, int);
-    method public static boolean deepEquals(Object[], Object[]);
-    method public static int deepHashCode(Object[]);
-    method @NonNull public static String deepToString(Object[]);
-    method public static boolean equals(long[], long[]);
-    method public static boolean equals(int[], int[]);
-    method public static boolean equals(short[], short[]);
-    method public static boolean equals(char[], char[]);
-    method public static boolean equals(byte[], byte[]);
-    method public static boolean equals(boolean[], boolean[]);
-    method public static boolean equals(double[], double[]);
-    method public static boolean equals(float[], float[]);
-    method public static boolean equals(Object[], Object[]);
-    method public static void fill(long[], long);
-    method public static void fill(long[], int, int, long);
-    method public static void fill(int[], int);
-    method public static void fill(int[], int, int, int);
-    method public static void fill(short[], short);
-    method public static void fill(short[], int, int, short);
-    method public static void fill(char[], char);
-    method public static void fill(char[], int, int, char);
-    method public static void fill(byte[], byte);
-    method public static void fill(byte[], int, int, byte);
-    method public static void fill(boolean[], boolean);
-    method public static void fill(boolean[], int, int, boolean);
-    method public static void fill(double[], double);
-    method public static void fill(double[], int, int, double);
-    method public static void fill(float[], float);
-    method public static void fill(float[], int, int, float);
-    method public static void fill(Object[], @Nullable Object);
-    method public static void fill(Object[], int, int, @Nullable Object);
-    method public static int hashCode(long[]);
-    method public static int hashCode(int[]);
-    method public static int hashCode(short[]);
-    method public static int hashCode(char[]);
-    method public static int hashCode(byte[]);
-    method public static int hashCode(boolean[]);
-    method public static int hashCode(float[]);
-    method public static int hashCode(double[]);
-    method public static int hashCode(Object[]);
-    method public static <T> void parallelPrefix(T[], @NonNull java.util.function.BinaryOperator<T>);
-    method public static <T> void parallelPrefix(T[], int, int, @NonNull java.util.function.BinaryOperator<T>);
-    method public static void parallelPrefix(long[], @NonNull java.util.function.LongBinaryOperator);
-    method public static void parallelPrefix(long[], int, int, @NonNull java.util.function.LongBinaryOperator);
-    method public static void parallelPrefix(double[], @NonNull java.util.function.DoubleBinaryOperator);
-    method public static void parallelPrefix(double[], int, int, @NonNull java.util.function.DoubleBinaryOperator);
-    method public static void parallelPrefix(int[], @NonNull java.util.function.IntBinaryOperator);
-    method public static void parallelPrefix(int[], int, int, @NonNull java.util.function.IntBinaryOperator);
-    method public static <T> void parallelSetAll(T[], @NonNull java.util.function.IntFunction<? extends T>);
-    method public static void parallelSetAll(int[], @NonNull java.util.function.IntUnaryOperator);
-    method public static void parallelSetAll(long[], @NonNull java.util.function.IntToLongFunction);
-    method public static void parallelSetAll(double[], @NonNull java.util.function.IntToDoubleFunction);
-    method public static void parallelSort(byte[]);
-    method public static void parallelSort(byte[], int, int);
-    method public static void parallelSort(char[]);
-    method public static void parallelSort(char[], int, int);
-    method public static void parallelSort(short[]);
-    method public static void parallelSort(short[], int, int);
-    method public static void parallelSort(int[]);
-    method public static void parallelSort(int[], int, int);
-    method public static void parallelSort(long[]);
-    method public static void parallelSort(long[], int, int);
-    method public static void parallelSort(float[]);
-    method public static void parallelSort(float[], int, int);
-    method public static void parallelSort(double[]);
-    method public static void parallelSort(double[], int, int);
-    method public static <T extends java.lang.Comparable<? super T>> void parallelSort(T[]);
-    method public static <T extends java.lang.Comparable<? super T>> void parallelSort(T[], int, int);
-    method public static <T> void parallelSort(T[], @Nullable java.util.Comparator<? super T>);
-    method public static <T> void parallelSort(T[], int, int, @Nullable java.util.Comparator<? super T>);
-    method public static <T> void setAll(T[], @NonNull java.util.function.IntFunction<? extends T>);
-    method public static void setAll(int[], @NonNull java.util.function.IntUnaryOperator);
-    method public static void setAll(long[], @NonNull java.util.function.IntToLongFunction);
-    method public static void setAll(double[], @NonNull java.util.function.IntToDoubleFunction);
-    method public static void sort(int[]);
-    method public static void sort(int[], int, int);
-    method public static void sort(long[]);
-    method public static void sort(long[], int, int);
-    method public static void sort(short[]);
-    method public static void sort(short[], int, int);
-    method public static void sort(char[]);
-    method public static void sort(char[], int, int);
-    method public static void sort(byte[]);
-    method public static void sort(byte[], int, int);
-    method public static void sort(float[]);
-    method public static void sort(float[], int, int);
-    method public static void sort(double[]);
-    method public static void sort(double[], int, int);
-    method public static void sort(Object[]);
-    method public static void sort(Object[], int, int);
-    method public static <T> void sort(T[], @Nullable java.util.Comparator<? super T>);
-    method public static <T> void sort(T[], int, int, @Nullable java.util.Comparator<? super T>);
-    method @NonNull public static <T> java.util.Spliterator<T> spliterator(T[]);
-    method @NonNull public static <T> java.util.Spliterator<T> spliterator(T[], int, int);
-    method @NonNull public static java.util.Spliterator.OfInt spliterator(int[]);
-    method @NonNull public static java.util.Spliterator.OfInt spliterator(int[], int, int);
-    method @NonNull public static java.util.Spliterator.OfLong spliterator(long[]);
-    method @NonNull public static java.util.Spliterator.OfLong spliterator(long[], int, int);
-    method @NonNull public static java.util.Spliterator.OfDouble spliterator(double[]);
-    method @NonNull public static java.util.Spliterator.OfDouble spliterator(double[], int, int);
-    method @NonNull public static <T> java.util.stream.Stream<T> stream(T[]);
-    method @NonNull public static <T> java.util.stream.Stream<T> stream(T[], int, int);
-    method @NonNull public static java.util.stream.IntStream stream(int[]);
-    method @NonNull public static java.util.stream.IntStream stream(int[], int, int);
-    method @NonNull public static java.util.stream.LongStream stream(long[]);
-    method @NonNull public static java.util.stream.LongStream stream(long[], int, int);
-    method @NonNull public static java.util.stream.DoubleStream stream(double[]);
-    method @NonNull public static java.util.stream.DoubleStream stream(double[], int, int);
-    method @NonNull public static String toString(long[]);
-    method @NonNull public static String toString(int[]);
-    method @NonNull public static String toString(short[]);
-    method @NonNull public static String toString(char[]);
-    method @NonNull public static String toString(byte[]);
-    method @NonNull public static String toString(boolean[]);
-    method @NonNull public static String toString(float[]);
-    method @NonNull public static String toString(double[]);
-    method @NonNull public static String toString(Object[]);
+    method @NonNull @java.lang.SafeVarargs public static <T> java.util.List<T> asList(@NonNull T...);
+    method public static int binarySearch(@NonNull long[], long);
+    method public static int binarySearch(@NonNull long[], int, int, long);
+    method public static int binarySearch(@NonNull int[], int);
+    method public static int binarySearch(@NonNull int[], int, int, int);
+    method public static int binarySearch(@NonNull short[], short);
+    method public static int binarySearch(@NonNull short[], int, int, short);
+    method public static int binarySearch(@NonNull char[], char);
+    method public static int binarySearch(@NonNull char[], int, int, char);
+    method public static int binarySearch(@NonNull byte[], byte);
+    method public static int binarySearch(@NonNull byte[], int, int, byte);
+    method public static int binarySearch(@NonNull double[], double);
+    method public static int binarySearch(@NonNull double[], int, int, double);
+    method public static int binarySearch(@NonNull float[], float);
+    method public static int binarySearch(@NonNull float[], int, int, float);
+    method public static int binarySearch(@NonNull Object[], @NonNull Object);
+    method public static int binarySearch(@NonNull Object[], int, int, @NonNull Object);
+    method public static <T> int binarySearch(@NonNull T[], T, @Nullable java.util.Comparator<? super T>);
+    method public static <T> int binarySearch(@NonNull T[], int, int, T, @Nullable java.util.Comparator<? super T>);
+    method @NonNull public static <T> T[] copyOf(@NonNull T[], int);
+    method @NonNull public static <T, U> T[] copyOf(@NonNull U[], int, @NonNull Class<? extends T[]>);
+    method @NonNull public static byte[] copyOf(@NonNull byte[], int);
+    method @NonNull public static short[] copyOf(@NonNull short[], int);
+    method @NonNull public static int[] copyOf(@NonNull int[], int);
+    method @NonNull public static long[] copyOf(@NonNull long[], int);
+    method @NonNull public static char[] copyOf(@NonNull char[], int);
+    method @NonNull public static float[] copyOf(@NonNull float[], int);
+    method @NonNull public static double[] copyOf(@NonNull double[], int);
+    method @NonNull public static boolean[] copyOf(@NonNull boolean[], int);
+    method @NonNull public static <T> T[] copyOfRange(@NonNull T[], int, int);
+    method @NonNull public static <T, U> T[] copyOfRange(@NonNull U[], int, int, @NonNull Class<? extends T[]>);
+    method @NonNull public static byte[] copyOfRange(@NonNull byte[], int, int);
+    method @NonNull public static short[] copyOfRange(@NonNull short[], int, int);
+    method @NonNull public static int[] copyOfRange(@NonNull int[], int, int);
+    method @NonNull public static long[] copyOfRange(@NonNull long[], int, int);
+    method @NonNull public static char[] copyOfRange(@NonNull char[], int, int);
+    method @NonNull public static float[] copyOfRange(@NonNull float[], int, int);
+    method @NonNull public static double[] copyOfRange(@NonNull double[], int, int);
+    method @NonNull public static boolean[] copyOfRange(@NonNull boolean[], int, int);
+    method public static boolean deepEquals(@Nullable Object[], @Nullable Object[]);
+    method public static int deepHashCode(@Nullable Object[]);
+    method @NonNull public static String deepToString(@Nullable Object[]);
+    method public static boolean equals(@Nullable long[], @Nullable long[]);
+    method public static boolean equals(@Nullable int[], @Nullable int[]);
+    method public static boolean equals(@Nullable short[], @Nullable short[]);
+    method public static boolean equals(@Nullable char[], @Nullable char[]);
+    method public static boolean equals(@Nullable byte[], @Nullable byte[]);
+    method public static boolean equals(@Nullable boolean[], @Nullable boolean[]);
+    method public static boolean equals(@Nullable double[], @Nullable double[]);
+    method public static boolean equals(@Nullable float[], @Nullable float[]);
+    method public static boolean equals(@Nullable Object[], @Nullable Object[]);
+    method public static void fill(@NonNull long[], long);
+    method public static void fill(@NonNull long[], int, int, long);
+    method public static void fill(@NonNull int[], int);
+    method public static void fill(@NonNull int[], int, int, int);
+    method public static void fill(@NonNull short[], short);
+    method public static void fill(@NonNull short[], int, int, short);
+    method public static void fill(@NonNull char[], char);
+    method public static void fill(@NonNull char[], int, int, char);
+    method public static void fill(@NonNull byte[], byte);
+    method public static void fill(@NonNull byte[], int, int, byte);
+    method public static void fill(@NonNull boolean[], boolean);
+    method public static void fill(@NonNull boolean[], int, int, boolean);
+    method public static void fill(@NonNull double[], double);
+    method public static void fill(@NonNull double[], int, int, double);
+    method public static void fill(@NonNull float[], float);
+    method public static void fill(@NonNull float[], int, int, float);
+    method public static void fill(@NonNull Object[], @Nullable Object);
+    method public static void fill(@NonNull Object[], int, int, @Nullable Object);
+    method public static int hashCode(@Nullable long[]);
+    method public static int hashCode(@Nullable int[]);
+    method public static int hashCode(@Nullable short[]);
+    method public static int hashCode(@Nullable char[]);
+    method public static int hashCode(@Nullable byte[]);
+    method public static int hashCode(@Nullable boolean[]);
+    method public static int hashCode(@Nullable float[]);
+    method public static int hashCode(@Nullable double[]);
+    method public static int hashCode(@Nullable Object[]);
+    method public static <T> void parallelPrefix(@NonNull T[], @NonNull java.util.function.BinaryOperator<T>);
+    method public static <T> void parallelPrefix(@NonNull T[], int, int, @NonNull java.util.function.BinaryOperator<T>);
+    method public static void parallelPrefix(@NonNull long[], @NonNull java.util.function.LongBinaryOperator);
+    method public static void parallelPrefix(@NonNull long[], int, int, @NonNull java.util.function.LongBinaryOperator);
+    method public static void parallelPrefix(@NonNull double[], @NonNull java.util.function.DoubleBinaryOperator);
+    method public static void parallelPrefix(@NonNull double[], int, int, @NonNull java.util.function.DoubleBinaryOperator);
+    method public static void parallelPrefix(@NonNull int[], @NonNull java.util.function.IntBinaryOperator);
+    method public static void parallelPrefix(@NonNull int[], int, int, @NonNull java.util.function.IntBinaryOperator);
+    method public static <T> void parallelSetAll(@NonNull T[], @NonNull java.util.function.IntFunction<? extends T>);
+    method public static void parallelSetAll(@NonNull int[], @NonNull java.util.function.IntUnaryOperator);
+    method public static void parallelSetAll(@NonNull long[], @NonNull java.util.function.IntToLongFunction);
+    method public static void parallelSetAll(@NonNull double[], @NonNull java.util.function.IntToDoubleFunction);
+    method public static void parallelSort(@NonNull byte[]);
+    method public static void parallelSort(@NonNull byte[], int, int);
+    method public static void parallelSort(@NonNull char[]);
+    method public static void parallelSort(@NonNull char[], int, int);
+    method public static void parallelSort(@NonNull short[]);
+    method public static void parallelSort(@NonNull short[], int, int);
+    method public static void parallelSort(@NonNull int[]);
+    method public static void parallelSort(@NonNull int[], int, int);
+    method public static void parallelSort(@NonNull long[]);
+    method public static void parallelSort(@NonNull long[], int, int);
+    method public static void parallelSort(@NonNull float[]);
+    method public static void parallelSort(@NonNull float[], int, int);
+    method public static void parallelSort(@NonNull double[]);
+    method public static void parallelSort(@NonNull double[], int, int);
+    method public static <T extends java.lang.Comparable<? super T>> void parallelSort(@NonNull T[]);
+    method public static <T extends java.lang.Comparable<? super T>> void parallelSort(@NonNull T[], int, int);
+    method public static <T> void parallelSort(@NonNull T[], @Nullable java.util.Comparator<? super T>);
+    method public static <T> void parallelSort(@NonNull T[], int, int, @Nullable java.util.Comparator<? super T>);
+    method public static <T> void setAll(@NonNull T[], @NonNull java.util.function.IntFunction<? extends T>);
+    method public static void setAll(@NonNull int[], @NonNull java.util.function.IntUnaryOperator);
+    method public static void setAll(@NonNull long[], @NonNull java.util.function.IntToLongFunction);
+    method public static void setAll(@NonNull double[], @NonNull java.util.function.IntToDoubleFunction);
+    method public static void sort(@NonNull int[]);
+    method public static void sort(@NonNull int[], int, int);
+    method public static void sort(@NonNull long[]);
+    method public static void sort(@NonNull long[], int, int);
+    method public static void sort(@NonNull short[]);
+    method public static void sort(@NonNull short[], int, int);
+    method public static void sort(@NonNull char[]);
+    method public static void sort(@NonNull char[], int, int);
+    method public static void sort(@NonNull byte[]);
+    method public static void sort(@NonNull byte[], int, int);
+    method public static void sort(@NonNull float[]);
+    method public static void sort(@NonNull float[], int, int);
+    method public static void sort(@NonNull double[]);
+    method public static void sort(@NonNull double[], int, int);
+    method public static void sort(@NonNull Object[]);
+    method public static void sort(@NonNull Object[], int, int);
+    method public static <T> void sort(@NonNull T[], @Nullable java.util.Comparator<? super T>);
+    method public static <T> void sort(@NonNull T[], int, int, @Nullable java.util.Comparator<? super T>);
+    method @NonNull public static <T> java.util.Spliterator<T> spliterator(@NonNull T[]);
+    method @NonNull public static <T> java.util.Spliterator<T> spliterator(@NonNull T[], int, int);
+    method @NonNull public static java.util.Spliterator.OfInt spliterator(@NonNull int[]);
+    method @NonNull public static java.util.Spliterator.OfInt spliterator(@NonNull int[], int, int);
+    method @NonNull public static java.util.Spliterator.OfLong spliterator(@NonNull long[]);
+    method @NonNull public static java.util.Spliterator.OfLong spliterator(@NonNull long[], int, int);
+    method @NonNull public static java.util.Spliterator.OfDouble spliterator(@NonNull double[]);
+    method @NonNull public static java.util.Spliterator.OfDouble spliterator(@NonNull double[], int, int);
+    method @NonNull public static <T> java.util.stream.Stream<T> stream(@NonNull T[]);
+    method @NonNull public static <T> java.util.stream.Stream<T> stream(@NonNull T[], int, int);
+    method @NonNull public static java.util.stream.IntStream stream(@NonNull int[]);
+    method @NonNull public static java.util.stream.IntStream stream(@NonNull int[], int, int);
+    method @NonNull public static java.util.stream.LongStream stream(@NonNull long[]);
+    method @NonNull public static java.util.stream.LongStream stream(@NonNull long[], int, int);
+    method @NonNull public static java.util.stream.DoubleStream stream(@NonNull double[]);
+    method @NonNull public static java.util.stream.DoubleStream stream(@NonNull double[], int, int);
+    method @NonNull public static String toString(@Nullable long[]);
+    method @NonNull public static String toString(@Nullable int[]);
+    method @NonNull public static String toString(@Nullable short[]);
+    method @NonNull public static String toString(@Nullable char[]);
+    method @NonNull public static String toString(@Nullable byte[]);
+    method @NonNull public static String toString(@Nullable boolean[]);
+    method @NonNull public static String toString(@Nullable float[]);
+    method @NonNull public static String toString(@Nullable double[]);
+    method @NonNull public static String toString(@Nullable Object[]);
   }
 
   public class Base64 {
@@ -69180,7 +69280,7 @@
     method public int getActualMaximum(int);
     method public int getActualMinimum(int);
     method @NonNull public static java.util.Set<java.lang.String> getAvailableCalendarTypes();
-    method public static java.util.Locale[] getAvailableLocales();
+    method @NonNull public static java.util.Locale[] getAvailableLocales();
     method @NonNull public String getCalendarType();
     method @Nullable public String getDisplayName(int, int, @NonNull java.util.Locale);
     method @Nullable public java.util.Map<java.lang.String,java.lang.Integer> getDisplayNames(int, int, @NonNull java.util.Locale);
@@ -69268,8 +69368,8 @@
     field public static final int YEAR = 1; // 0x1
     field public static final int ZONE_OFFSET = 15; // 0xf
     field protected boolean areFieldsSet;
-    field protected int[] fields;
-    field protected boolean[] isSet;
+    field @NonNull protected int[] fields;
+    field @NonNull protected boolean[] isSet;
     field protected boolean isTimeSet;
     field protected long time;
   }
@@ -69280,7 +69380,7 @@
     method @NonNull public java.util.Calendar.Builder set(int, int);
     method @NonNull public java.util.Calendar.Builder setCalendarType(@NonNull String);
     method @NonNull public java.util.Calendar.Builder setDate(int, int, int);
-    method @NonNull public java.util.Calendar.Builder setFields(int...);
+    method @NonNull public java.util.Calendar.Builder setFields(@NonNull int...);
     method @NonNull public java.util.Calendar.Builder setInstant(long);
     method @NonNull public java.util.Calendar.Builder setInstant(@NonNull java.util.Date);
     method @NonNull public java.util.Calendar.Builder setLenient(boolean);
@@ -69310,12 +69410,12 @@
     method public int size();
     method @NonNull public default java.util.Spliterator<E> spliterator();
     method @NonNull public default java.util.stream.Stream<E> stream();
-    method public Object[] toArray();
-    method public <T> T[] toArray(T[]);
+    method @NonNull public Object[] toArray();
+    method @NonNull public <T> T[] toArray(@NonNull T[]);
   }
 
   public class Collections {
-    method @java.lang.SafeVarargs public static <T> boolean addAll(@NonNull java.util.Collection<? super T>, T...);
+    method @java.lang.SafeVarargs public static <T> boolean addAll(@NonNull java.util.Collection<? super T>, @NonNull T...);
     method @NonNull public static <T> java.util.Queue<T> asLifoQueue(@NonNull java.util.Deque<T>);
     method public static <T> int binarySearch(@NonNull java.util.List<? extends java.lang.Comparable<? super T>>, @NonNull T);
     method public static <T> int binarySearch(@NonNull java.util.List<? extends T>, T, @Nullable java.util.Comparator<? super T>);
@@ -69833,7 +69933,7 @@
     method @NonNull public static java.util.List<java.lang.String> filterTags(@NonNull java.util.List<java.util.Locale.LanguageRange>, @NonNull java.util.Collection<java.lang.String>, @NonNull java.util.Locale.FilteringMode);
     method @NonNull public static java.util.List<java.lang.String> filterTags(@NonNull java.util.List<java.util.Locale.LanguageRange>, @NonNull java.util.Collection<java.lang.String>);
     method @NonNull public static java.util.Locale forLanguageTag(@NonNull String);
-    method public static java.util.Locale[] getAvailableLocales();
+    method @NonNull public static java.util.Locale[] getAvailableLocales();
     method @NonNull public String getCountry();
     method @NonNull public static java.util.Locale getDefault();
     method @NonNull public static java.util.Locale getDefault(@NonNull java.util.Locale.Category);
@@ -69851,8 +69951,8 @@
     method @NonNull public java.util.Set<java.lang.Character> getExtensionKeys();
     method @NonNull public String getISO3Country() throws java.util.MissingResourceException;
     method @NonNull public String getISO3Language() throws java.util.MissingResourceException;
-    method public static String[] getISOCountries();
-    method public static String[] getISOLanguages();
+    method @NonNull public static String[] getISOCountries();
+    method @NonNull public static String[] getISOLanguages();
     method @NonNull public String getLanguage();
     method @NonNull public String getScript();
     method @NonNull public java.util.Set<java.lang.String> getUnicodeLocaleAttributes();
@@ -70046,7 +70146,7 @@
     method public static <T> int compare(T, T, @NonNull java.util.Comparator<? super T>);
     method public static boolean deepEquals(@Nullable Object, @Nullable Object);
     method public static boolean equals(@Nullable Object, @Nullable Object);
-    method public static int hash(java.lang.Object...);
+    method public static int hash(@Nullable java.lang.Object...);
     method public static int hashCode(@Nullable Object);
     method public static boolean isNull(@Nullable Object);
     method public static boolean nonNull(@Nullable Object);
@@ -70711,7 +70811,7 @@
     method public void addElement(E);
     method public int capacity();
     method @NonNull public Object clone();
-    method public void copyInto(Object[]);
+    method public void copyInto(@NonNull Object[]);
     method public E elementAt(int);
     method @NonNull public java.util.Enumeration<E> elements();
     method public void ensureCapacity(int);
@@ -70731,7 +70831,7 @@
     method public void trimToSize();
     field protected int capacityIncrement;
     field protected int elementCount;
-    field protected Object[] elementData;
+    field @NonNull protected Object[] elementData;
   }
 
   public class WeakHashMap<K, V> extends java.util.AbstractMap<K,V> implements java.util.Map<K,V> {
@@ -71122,7 +71222,7 @@
   public class CopyOnWriteArrayList<E> implements java.lang.Cloneable java.util.List<E> java.util.RandomAccess java.io.Serializable {
     ctor public CopyOnWriteArrayList();
     ctor public CopyOnWriteArrayList(@NonNull java.util.Collection<? extends E>);
-    ctor public CopyOnWriteArrayList(E[]);
+    ctor public CopyOnWriteArrayList(@NonNull E[]);
     method public boolean add(E);
     method public void add(int, E);
     method public boolean addAll(@NonNull java.util.Collection<? extends E>);
@@ -71150,8 +71250,8 @@
     method public E set(int, E);
     method public int size();
     method @NonNull public java.util.List<E> subList(int, int);
-    method public Object[] toArray();
-    method public <T> T[] toArray(T[]);
+    method @NonNull public Object[] toArray();
+    method @NonNull public <T> T[] toArray(@NonNull T[]);
   }
 
   public class CopyOnWriteArraySet<E> extends java.util.AbstractSet<E> implements java.io.Serializable {
@@ -72903,7 +73003,7 @@
     method public void config(@NonNull java.util.function.Supplier<java.lang.String>);
     method public void entering(@Nullable String, @Nullable String);
     method public void entering(@Nullable String, @Nullable String, @Nullable Object);
-    method public void entering(@Nullable String, @Nullable String, Object[]);
+    method public void entering(@Nullable String, @Nullable String, @Nullable Object[]);
     method public void exiting(@Nullable String, @Nullable String);
     method public void exiting(@Nullable String, @Nullable String, @Nullable Object);
     method public void fine(@Nullable String);
@@ -72916,7 +73016,7 @@
     method @NonNull public static java.util.logging.Logger getAnonymousLogger(@Nullable String);
     method @Nullable public java.util.logging.Filter getFilter();
     method @NonNull public static final java.util.logging.Logger getGlobal();
-    method public java.util.logging.Handler[] getHandlers();
+    method @NonNull public java.util.logging.Handler[] getHandlers();
     method @Nullable public java.util.logging.Level getLevel();
     method @NonNull public static java.util.logging.Logger getLogger(@NonNull String);
     method @NonNull public static java.util.logging.Logger getLogger(@NonNull String, @Nullable String);
@@ -72932,7 +73032,7 @@
     method public void log(@NonNull java.util.logging.Level, @Nullable String);
     method public void log(@NonNull java.util.logging.Level, @NonNull java.util.function.Supplier<java.lang.String>);
     method public void log(@NonNull java.util.logging.Level, @Nullable String, @Nullable Object);
-    method public void log(@NonNull java.util.logging.Level, @Nullable String, Object[]);
+    method public void log(@NonNull java.util.logging.Level, @Nullable String, @Nullable Object[]);
     method public void log(@NonNull java.util.logging.Level, @Nullable String, @Nullable Throwable);
     method public void log(@NonNull java.util.logging.Level, @Nullable Throwable, @NonNull java.util.function.Supplier<java.lang.String>);
     method public void logp(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable String);
@@ -72943,8 +73043,8 @@
     method public void logp(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable Throwable, @NonNull java.util.function.Supplier<java.lang.String>);
     method @Deprecated public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable String, @Nullable String);
     method @Deprecated public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable String, @Nullable String, @Nullable Object);
-    method @Deprecated public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable String, @Nullable String, Object[]);
-    method public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable java.util.ResourceBundle, @Nullable String, java.lang.Object...);
+    method @Deprecated public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable String, @Nullable String, @Nullable Object[]);
+    method public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable java.util.ResourceBundle, @Nullable String, @Nullable java.lang.Object...);
     method @Deprecated public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable String, @Nullable String, @Nullable Throwable);
     method public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable java.util.ResourceBundle, @Nullable String, @Nullable Throwable);
     method public void removeHandler(@Nullable java.util.logging.Handler) throws java.lang.SecurityException;
@@ -73206,8 +73306,8 @@
     method public static boolean matches(@NonNull String, @NonNull CharSequence);
     method @NonNull public String pattern();
     method @NonNull public static String quote(@NonNull String);
-    method public String[] split(@NonNull CharSequence, int);
-    method public String[] split(@NonNull CharSequence);
+    method @NonNull public String[] split(@NonNull CharSequence, int);
+    method @NonNull public String[] split(@NonNull CharSequence);
     method @NonNull public java.util.stream.Stream<java.lang.String> splitAsStream(@NonNull CharSequence);
     field public static final int CANON_EQ = 128; // 0x80
     field public static final int CASE_INSENSITIVE = 2; // 0x2
diff --git a/api/system-current.txt b/api/system-current.txt
index e0af359..94dec1c 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -18,6 +18,7 @@
     field public static final String ALLOCATE_AGGRESSIVE = "android.permission.ALLOCATE_AGGRESSIVE";
     field public static final String ALLOW_ANY_CODEC_FOR_PLAYBACK = "android.permission.ALLOW_ANY_CODEC_FOR_PLAYBACK";
     field public static final String AMBIENT_WALLPAPER = "android.permission.AMBIENT_WALLPAPER";
+    field public static final String APPROVE_INCIDENT_REPORTS = "android.permission.APPROVE_INCIDENT_REPORTS";
     field public static final String BACKUP = "android.permission.BACKUP";
     field public static final String BIND_ATTENTION_SERVICE = "android.permission.BIND_ATTENTION_SERVICE";
     field public static final String BIND_AUGMENTED_AUTOFILL_SERVICE = "android.permission.BIND_AUGMENTED_AUTOFILL_SERVICE";
@@ -121,6 +122,7 @@
     field public static final String OBSERVE_ROLE_HOLDERS = "android.permission.OBSERVE_ROLE_HOLDERS";
     field public static final String OVERRIDE_WIFI_CONFIG = "android.permission.OVERRIDE_WIFI_CONFIG";
     field public static final String PACKAGE_VERIFICATION_AGENT = "android.permission.PACKAGE_VERIFICATION_AGENT";
+    field public static final String PACKET_KEEPALIVE_OFFLOAD = "android.permission.PACKET_KEEPALIVE_OFFLOAD";
     field public static final String PEERS_MAC_ADDRESS = "android.permission.PEERS_MAC_ADDRESS";
     field public static final String PERFORM_CDMA_PROVISIONING = "android.permission.PERFORM_CDMA_PROVISIONING";
     field public static final String PERFORM_SIM_ACTIVATION = "android.permission.PERFORM_SIM_ACTIVATION";
@@ -346,10 +348,11 @@
     field public static final String OPSTR_WRITE_ICC_SMS = "android:write_icc_sms";
     field public static final String OPSTR_WRITE_SMS = "android:write_sms";
     field public static final String OPSTR_WRITE_WALLPAPER = "android:write_wallpaper";
-    field public static final int UID_STATE_BACKGROUND = 4; // 0x4
-    field public static final int UID_STATE_CACHED = 5; // 0x5
-    field public static final int UID_STATE_FOREGROUND = 3; // 0x3
-    field public static final int UID_STATE_FOREGROUND_SERVICE = 2; // 0x2
+    field public static final int UID_STATE_BACKGROUND = 5; // 0x5
+    field public static final int UID_STATE_CACHED = 6; // 0x6
+    field public static final int UID_STATE_FOREGROUND = 4; // 0x4
+    field public static final int UID_STATE_FOREGROUND_SERVICE = 3; // 0x3
+    field public static final int UID_STATE_FOREGROUND_SERVICE_LOCATION = 2; // 0x2
     field public static final int UID_STATE_PERSISTENT = 0; // 0x0
     field public static final int UID_STATE_TOP = 1; // 0x1
   }
@@ -499,6 +502,13 @@
     method public org.json.JSONObject toJson() throws org.json.JSONException;
   }
 
+  public class NotificationManager {
+    method @Nullable public android.content.ComponentName getAllowedNotificationAssistant();
+    method @Nullable public android.content.ComponentName getAllowedNotificationAssistantForUser(android.os.UserHandle);
+    method public void setNotificationAssistantAccessGranted(android.content.ComponentName, boolean);
+    method public void setNotificationAssistantAccessGrantedForUser(android.content.ComponentName, android.os.UserHandle, boolean);
+  }
+
   public final class StatsManager {
     method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void addConfig(long, byte[]) throws android.app.StatsManager.StatsUnavailableException;
     method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean addConfiguration(long, byte[]);
@@ -508,7 +518,7 @@
     method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getStatsMetadata() throws android.app.StatsManager.StatsUnavailableException;
     method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void removeConfig(long) throws android.app.StatsManager.StatsUnavailableException;
     method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean removeConfiguration(long);
-    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void setActiveConfigsChangedOperation(@Nullable android.app.PendingIntent) throws android.app.StatsManager.StatsUnavailableException;
+    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public long[] setActiveConfigsChangedOperation(@Nullable android.app.PendingIntent) throws android.app.StatsManager.StatsUnavailableException;
     method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void setBroadcastSubscriber(android.app.PendingIntent, long, long) throws android.app.StatsManager.StatsUnavailableException;
     method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean setBroadcastSubscriber(long, long, android.app.PendingIntent);
     method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean setDataFetchOperation(long, android.app.PendingIntent);
@@ -528,6 +538,18 @@
     ctor public StatsManager.StatsUnavailableException(String, Throwable);
   }
 
+  public class StatusBarManager {
+    method public android.util.Pair<java.lang.Integer,java.lang.Integer> getDisableFlags();
+    method public void setDisabledForSetup(boolean);
+    field public static final int DISABLE2_NONE = 0; // 0x0
+    field public static final int DISABLE_EXPAND = 65536; // 0x10000
+    field public static final int DISABLE_HOME = 2097152; // 0x200000
+    field public static final int DISABLE_NONE = 0; // 0x0
+    field public static final int DISABLE_NOTIFICATION_ALERTS = 262144; // 0x40000
+    field public static final int DISABLE_RECENT = 16777216; // 0x1000000
+    field public static final int DISABLE_SEARCH = 33554432; // 0x2000000
+  }
+
   public final class Vr2dDisplayProperties implements android.os.Parcelable {
     ctor public Vr2dDisplayProperties(int, int, int);
     method public int describeContents();
@@ -969,6 +991,7 @@
   }
 
   public static final class AppPredictionContext.Builder {
+    ctor public AppPredictionContext.Builder(@NonNull android.content.Context);
     method public android.app.prediction.AppPredictionContext build();
     method public android.app.prediction.AppPredictionContext.Builder setExtras(@Nullable android.os.Bundle);
     method public android.app.prediction.AppPredictionContext.Builder setPredictedTargetCount(int);
@@ -1000,6 +1023,8 @@
   }
 
   public final class AppTarget implements android.os.Parcelable {
+    ctor public AppTarget(@NonNull android.app.prediction.AppTargetId, @NonNull String, @Nullable String, @NonNull android.os.UserHandle);
+    ctor public AppTarget(@NonNull android.app.prediction.AppTargetId, @NonNull android.content.pm.ShortcutInfo, @Nullable String);
     method public int describeContents();
     method @Nullable public String getClassName();
     method @NonNull public android.app.prediction.AppTargetId getId();
@@ -1030,6 +1055,7 @@
   }
 
   public final class AppTargetId implements android.os.Parcelable {
+    ctor public AppTargetId(@NonNull String);
     method public int describeContents();
     method public void writeToParcel(android.os.Parcel, int);
     field public static final android.os.Parcelable.Creator<android.app.prediction.AppTargetId> CREATOR;
@@ -1101,6 +1127,7 @@
     method public String getNotificationChannelId();
     method @Nullable public String getTaskRootClassName();
     method @Nullable public String getTaskRootPackageName();
+    method public boolean isInstantApp();
     field public static final int NOTIFICATION_INTERRUPTION = 12; // 0xc
     field public static final int NOTIFICATION_SEEN = 10; // 0xa
     field public static final int SLICE_PINNED = 14; // 0xe
@@ -1265,6 +1292,7 @@
     field public static final String BACKUP_SERVICE = "backup";
     field public static final String CONTENT_SUGGESTIONS_SERVICE = "content_suggestions";
     field public static final String CONTEXTHUB_SERVICE = "contexthub";
+    field public static final String DYNAMIC_ANDROID_SERVICE = "dynamic_android";
     field public static final String EUICC_CARD_SERVICE = "euicc_card";
     field public static final String HDMI_CONTROL_SERVICE = "hdmi_control";
     field public static final String NETD_SERVICE = "netd";
@@ -1275,6 +1303,7 @@
     field public static final String ROLLBACK_SERVICE = "rollback";
     field public static final String SECURE_ELEMENT_SERVICE = "secure_element";
     field public static final String STATS_MANAGER = "stats";
+    field public static final String STATUS_BAR_SERVICE = "statusbar";
     field public static final String SYSTEM_UPDATE_SERVICE = "system_update";
     field public static final String VR_SERVICE = "vrmanager";
     field @Deprecated public static final String WIFI_RTT_SERVICE = "rttmanager";
@@ -1290,6 +1319,32 @@
     method public void sendOrderedBroadcast(android.content.Intent, String, android.os.Bundle, android.content.BroadcastReceiver, android.os.Handler, int, String, android.os.Bundle);
   }
 
+  public class DynamicAndroidClient {
+    ctor public DynamicAndroidClient(@NonNull android.content.Context);
+    method public void bind();
+    method public void setOnStatusChangedListener(@NonNull android.content.DynamicAndroidClient.OnStatusChangedListener, @NonNull java.util.concurrent.Executor);
+    method public void setOnStatusChangedListener(@NonNull android.content.DynamicAndroidClient.OnStatusChangedListener);
+    method public void start(String, long);
+    method public void start(String, long, long);
+    method public void unbind();
+    field public static final int CAUSE_ERROR_EXCEPTION = 6; // 0x6
+    field public static final int CAUSE_ERROR_INVALID_URL = 4; // 0x4
+    field public static final int CAUSE_ERROR_IO = 3; // 0x3
+    field public static final int CAUSE_ERROR_IPC = 5; // 0x5
+    field public static final int CAUSE_INSTALL_CANCELLED = 2; // 0x2
+    field public static final int CAUSE_INSTALL_COMPLETED = 1; // 0x1
+    field public static final int CAUSE_NOT_SPECIFIED = 0; // 0x0
+    field public static final int STATUS_IN_PROGRESS = 2; // 0x2
+    field public static final int STATUS_IN_USE = 4; // 0x4
+    field public static final int STATUS_NOT_STARTED = 1; // 0x1
+    field public static final int STATUS_READY = 3; // 0x3
+    field public static final int STATUS_UNKNOWN = 0; // 0x0
+  }
+
+  public static interface DynamicAndroidClient.OnStatusChangedListener {
+    method public void onStatusChanged(int, int, long);
+  }
+
   public class Intent implements java.lang.Cloneable android.os.Parcelable {
     field public static final String ACTION_BATTERY_LEVEL_CHANGED = "android.intent.action.BATTERY_LEVEL_CHANGED";
     field public static final String ACTION_CALL_EMERGENCY = "android.intent.action.CALL_EMERGENCY";
@@ -1297,6 +1352,7 @@
     field public static final String ACTION_DEVICE_CUSTOMIZATION_READY = "android.intent.action.DEVICE_CUSTOMIZATION_READY";
     field public static final String ACTION_FACTORY_RESET = "android.intent.action.FACTORY_RESET";
     field public static final String ACTION_GLOBAL_BUTTON = "android.intent.action.GLOBAL_BUTTON";
+    field public static final String ACTION_INCIDENT_REPORT_READY = "android.intent.action.INCIDENT_REPORT_READY";
     field public static final String ACTION_INSTALL_INSTANT_APP_PACKAGE = "android.intent.action.INSTALL_INSTANT_APP_PACKAGE";
     field public static final String ACTION_INSTANT_APP_RESOLVER_SETTINGS = "android.intent.action.INSTANT_APP_RESOLVER_SETTINGS";
     field public static final String ACTION_INTENT_FILTER_NEEDS_VERIFICATION = "android.intent.action.INTENT_FILTER_NEEDS_VERIFICATION";
@@ -1306,6 +1362,7 @@
     field public static final String ACTION_MANAGE_PERMISSION_APPS = "android.intent.action.MANAGE_PERMISSION_APPS";
     field @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public static final String ACTION_MANAGE_SPECIAL_APP_ACCESSES = "android.intent.action.MANAGE_SPECIAL_APP_ACCESSES";
     field public static final String ACTION_MASTER_CLEAR_NOTIFICATION = "android.intent.action.MASTER_CLEAR_NOTIFICATION";
+    field public static final String ACTION_PENDING_INCIDENT_REPORTS_CHANGED = "android.intent.action.PENDING_INCIDENT_REPORTS_CHANGED";
     field public static final String ACTION_PRE_BOOT_COMPLETED = "android.intent.action.PRE_BOOT_COMPLETED";
     field public static final String ACTION_QUERY_PACKAGE_RESTART = "android.intent.action.QUERY_PACKAGE_RESTART";
     field public static final String ACTION_RESOLVE_INSTANT_APP_PACKAGE = "android.intent.action.RESOLVE_INSTANT_APP_PACKAGE";
@@ -1489,6 +1546,7 @@
     method @NonNull public android.content.pm.dex.ArtManager getArtManager();
     method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public abstract String getDefaultBrowserPackageNameAsUser(int);
     method @Nullable @RequiresPermission(android.Manifest.permission.SET_HARMFUL_APP_WARNINGS) public CharSequence getHarmfulAppWarning(@NonNull String);
+    method public String getIncidentReportApproverPackageName();
     method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public abstract java.util.List<android.content.pm.PackageInfo> getInstalledPackagesAsUser(int, int);
     method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_INSTANT_APPS) public abstract android.graphics.drawable.Drawable getInstantAppIcon(String);
     method public abstract android.content.ComponentName getInstantAppInstallerComponent();
@@ -1608,8 +1666,10 @@
 
   public class PermissionInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
     field public static final int FLAG_REMOVED = 2; // 0x2
+    field public static final int PROTECTION_FLAG_APP_PREDICTOR = 2097152; // 0x200000
     field public static final int PROTECTION_FLAG_CONFIGURATOR = 524288; // 0x80000
     field public static final int PROTECTION_FLAG_DOCUMENTER = 262144; // 0x40000
+    field public static final int PROTECTION_FLAG_INCIDENT_REPORT_APPROVER = 1048576; // 0x100000
     field public static final int PROTECTION_FLAG_OEM = 16384; // 0x4000
     field public static final int PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER = 65536; // 0x10000
     field public static final int PROTECTION_FLAG_WELLBEING = 131072; // 0x20000
@@ -1698,20 +1758,27 @@
 
   public final class RollbackInfo implements android.os.Parcelable {
     method public int describeContents();
+    method public java.util.List<android.content.pm.VersionedPackage> getCausePackages();
+    method public int getCommittedSessionId();
     method public java.util.List<android.content.rollback.PackageRollbackInfo> getPackages();
     method public int getRollbackId();
-    method public int getSessionId();
     method public boolean isStaged();
     method public void writeToParcel(android.os.Parcel, int);
     field public static final android.os.Parcelable.Creator<android.content.rollback.RollbackInfo> CREATOR;
   }
 
   public final class RollbackManager {
-    method @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) public void commitRollback(int, @NonNull android.content.IntentSender);
+    method @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) public void commitRollback(int, @NonNull java.util.List<android.content.pm.VersionedPackage>, @NonNull android.content.IntentSender);
     method @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) public void expireRollbackForPackage(@NonNull String);
     method @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) public java.util.List<android.content.rollback.RollbackInfo> getAvailableRollbacks();
     method @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) @NonNull public java.util.List<android.content.rollback.RollbackInfo> getRecentlyCommittedRollbacks();
     method @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) public void reloadPersistedData();
+    field public static final String EXTRA_STATUS = "android.content.rollback.extra.STATUS";
+    field public static final String EXTRA_STATUS_MESSAGE = "android.content.rollback.extra.STATUS_MESSAGE";
+    field public static final int STATUS_FAILURE = 1; // 0x1
+    field public static final int STATUS_FAILURE_INSTALL = 3; // 0x3
+    field public static final int STATUS_FAILURE_ROLLBACK_UNAVAILABLE = 2; // 0x2
+    field public static final int STATUS_SUCCESS = 0; // 0x0
   }
 
 }
@@ -1776,7 +1843,9 @@
     field public static final android.os.Parcelable.Creator<android.hardware.display.BrightnessChangeEvent> CREATOR;
     field public final float batteryLevel;
     field public final float brightness;
+    field public final long colorSampleDuration;
     field public final int colorTemperature;
+    field @Nullable public final long[] colorValueBuckets;
     field public final boolean isDefaultBrightnessConfig;
     field public final boolean isUserSetBrightness;
     field public final float lastBrightness;
@@ -2934,10 +3003,12 @@
   public final class GnssMeasurementCorrections implements android.os.Parcelable {
     method public int describeContents();
     method public double getAltitudeMeters();
+    method public double getHorizontalPositionUncertaintyMeters();
     method public double getLatitudeDegrees();
     method public double getLongitudeDegrees();
     method @Nullable public java.util.List<android.location.GnssSingleSatCorrection> getSingleSatCorrectionList();
     method public long getToaGpsNanosecondsOfWeek();
+    method public double getVerticalPositionUncertaintyMeters();
     method public void writeToParcel(android.os.Parcel, int);
     field public static final android.os.Parcelable.Creator<android.location.GnssMeasurementCorrections> CREATOR;
   }
@@ -2946,10 +3017,12 @@
     ctor public GnssMeasurementCorrections.Builder();
     method public android.location.GnssMeasurementCorrections build();
     method public android.location.GnssMeasurementCorrections.Builder setAltitudeMeters(double);
+    method public android.location.GnssMeasurementCorrections.Builder setHorizontalPositionUncertaintyMeters(double);
     method public android.location.GnssMeasurementCorrections.Builder setLatitudeDegrees(double);
     method public android.location.GnssMeasurementCorrections.Builder setLongitudeDegrees(double);
     method public android.location.GnssMeasurementCorrections.Builder setSingleSatCorrectionList(@Nullable java.util.List<android.location.GnssSingleSatCorrection>);
     method public android.location.GnssMeasurementCorrections.Builder setToaGpsNanosecondsOfWeek(long);
+    method public android.location.GnssMeasurementCorrections.Builder setVerticalPositionUncertaintyMeters(double);
   }
 
   public final class GnssReflectingPlane implements android.os.Parcelable {
@@ -3418,15 +3491,6 @@
     method public void stop();
   }
 
-  public final class Session2Token implements android.os.Parcelable {
-    ctor public Session2Token(@NonNull android.content.Context, @NonNull String, @Nullable android.os.Bundle);
-    method public void destroy();
-    method @NonNull public android.os.Bundle getExtras();
-    method public int getPid();
-    method public boolean isDestroyed();
-    field public static final String SESSION_SERVICE_INTERFACE = "android.media.MediaSession2Service";
-  }
-
   public static class SubtitleData.Builder {
     ctor public SubtitleData.Builder();
     ctor public SubtitleData.Builder(@NonNull android.media.SubtitleData);
@@ -3441,15 +3505,6 @@
     method @NonNull public android.media.TimedMetaData.Builder setTimedMetaData(long, @NonNull byte[]);
   }
 
-  public abstract class VolumeProvider {
-    method public void setCallback(android.media.VolumeProvider.Callback);
-  }
-
-  public abstract static class VolumeProvider.Callback {
-    ctor public VolumeProvider.Callback();
-    method public abstract void onVolumeChanged(android.media.VolumeProvider);
-  }
-
 }
 
 package android.media.audiopolicy {
@@ -3538,161 +3593,8 @@
 
 package android.media.session {
 
-  public final class ControllerCallbackLink implements android.os.Parcelable {
-    ctor public ControllerCallbackLink(@NonNull android.content.Context, @NonNull android.media.session.ControllerCallbackLink.CallbackStub);
-    ctor public ControllerCallbackLink(android.os.IBinder);
-    method public int describeContents();
-    method @NonNull public android.os.IBinder getBinder();
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifyEvent(@NonNull String, @Nullable android.os.Bundle);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifyExtrasChanged(@Nullable android.os.Bundle);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifyMetadataChanged(@Nullable android.media.MediaMetadata);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifyPlaybackStateChanged(@Nullable android.media.session.PlaybackState);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifyQueueChanged(@Nullable java.util.List<android.media.session.MediaSession.QueueItem>);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifyQueueTitleChanged(@Nullable CharSequence);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifySessionDestroyed();
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifyVolumeInfoChanged(@NonNull android.media.session.MediaController.PlaybackInfo);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.media.session.ControllerCallbackLink> CREATOR;
-  }
-
-  public abstract static class ControllerCallbackLink.CallbackStub {
-    ctor public ControllerCallbackLink.CallbackStub();
-    method public void onEvent(@NonNull String, @Nullable android.os.Bundle);
-    method public void onExtrasChanged(@Nullable android.os.Bundle);
-    method public void onMetadataChanged(@Nullable android.media.MediaMetadata);
-    method public void onPlaybackStateChanged(@Nullable android.media.session.PlaybackState);
-    method public void onQueueChanged(@Nullable java.util.List<android.media.session.MediaSession.QueueItem>);
-    method public void onQueueTitleChanged(@Nullable CharSequence);
-    method public void onSessionDestroyed();
-    method public void onVolumeInfoChanged(@NonNull android.media.session.MediaController.PlaybackInfo);
-  }
-
-  public final class ControllerLink implements android.os.Parcelable {
-    ctor public ControllerLink(@NonNull android.media.session.ControllerLink.ControllerStub);
-    ctor public ControllerLink(android.os.IBinder);
-    method public int describeContents();
-    method @NonNull public android.os.IBinder getBinder();
-    method @Nullable public android.os.Bundle getExtras();
-    method @Nullable public android.media.MediaMetadata getMetadata();
-    method @Nullable public android.media.session.PlaybackState getPlaybackState();
-    method @Nullable public java.util.List<android.media.session.MediaSession.QueueItem> getQueue();
-    method @Nullable public CharSequence getQueueTitle();
-    method public int getRatingType();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.media.session.ControllerLink> CREATOR;
-  }
-
-  public abstract static class ControllerLink.ControllerStub {
-    ctor public ControllerLink.ControllerStub();
-    method public void adjustVolume(@NonNull String, @NonNull String, @NonNull android.media.session.ControllerCallbackLink, boolean, int, int);
-    method public void fastForward(@NonNull String, @NonNull android.media.session.ControllerCallbackLink);
-    method @Nullable public android.os.Bundle getExtras();
-    method public long getFlags();
-    method @Nullable public android.app.PendingIntent getLaunchPendingIntent();
-    method @Nullable public android.media.MediaMetadata getMetadata();
-    method @NonNull public String getPackageName();
-    method @Nullable public android.media.session.PlaybackState getPlaybackState();
-    method @Nullable public java.util.List<android.media.session.MediaSession.QueueItem> getQueue();
-    method @Nullable public CharSequence getQueueTitle();
-    method public int getRatingType();
-    method @NonNull public String getTag();
-    method @NonNull public android.media.session.MediaController.PlaybackInfo getVolumeAttributes();
-    method public void next(@NonNull String, @NonNull android.media.session.ControllerCallbackLink);
-    method public void pause(@NonNull String, @NonNull android.media.session.ControllerCallbackLink);
-    method public void play(@NonNull String, @NonNull android.media.session.ControllerCallbackLink);
-    method public void playFromMediaId(@NonNull String, @NonNull android.media.session.ControllerCallbackLink, @NonNull String, @Nullable android.os.Bundle);
-    method public void playFromSearch(@NonNull String, @NonNull android.media.session.ControllerCallbackLink, @NonNull String, @Nullable android.os.Bundle);
-    method public void playFromUri(@NonNull String, @NonNull android.media.session.ControllerCallbackLink, @NonNull android.net.Uri, @Nullable android.os.Bundle);
-    method public void prepare(@NonNull String, @NonNull android.media.session.ControllerCallbackLink);
-    method public void prepareFromMediaId(@NonNull String, @NonNull android.media.session.ControllerCallbackLink, @NonNull String, @Nullable android.os.Bundle);
-    method public void prepareFromSearch(@NonNull String, @NonNull android.media.session.ControllerCallbackLink, @NonNull String, @Nullable android.os.Bundle);
-    method public void prepareFromUri(@NonNull String, @NonNull android.media.session.ControllerCallbackLink, @NonNull android.net.Uri, @Nullable android.os.Bundle);
-    method public void previous(@NonNull String, @NonNull android.media.session.ControllerCallbackLink);
-    method public void rate(@NonNull String, @NonNull android.media.session.ControllerCallbackLink, @NonNull android.media.Rating);
-    method public void registerCallback(@NonNull String, @NonNull android.media.session.ControllerCallbackLink);
-    method public void rewind(@NonNull String, @NonNull android.media.session.ControllerCallbackLink);
-    method public void seekTo(@NonNull String, @NonNull android.media.session.ControllerCallbackLink, long);
-    method public void sendCommand(@NonNull String, @NonNull android.media.session.ControllerCallbackLink, @NonNull String, @Nullable android.os.Bundle, @Nullable android.os.ResultReceiver);
-    method public void sendCustomAction(@NonNull String, @NonNull android.media.session.ControllerCallbackLink, @NonNull String, @Nullable android.os.Bundle);
-    method public boolean sendMediaButton(@NonNull String, @NonNull android.media.session.ControllerCallbackLink, boolean, @NonNull android.view.KeyEvent);
-    method public void setVolumeTo(@NonNull String, @NonNull String, @NonNull android.media.session.ControllerCallbackLink, int, int);
-    method public void skipToQueueItem(@NonNull String, @NonNull android.media.session.ControllerCallbackLink, long);
-    method public void stop(@NonNull String, @NonNull android.media.session.ControllerCallbackLink);
-    method public void unregisterCallback(@NonNull android.media.session.ControllerCallbackLink);
-  }
-
-  public abstract static class MediaSession.Callback {
-    method public void onSetMediaButtonEventDelegate(@NonNull android.media.session.MediaSessionEngine.MediaButtonEventDelegate);
-  }
-
-  public static final class MediaSession.Token implements android.os.Parcelable {
-    method public android.media.session.ControllerLink getControllerLink();
-  }
-
-  public final class MediaSessionEngine implements java.lang.AutoCloseable {
-    ctor public MediaSessionEngine(@NonNull android.content.Context, @NonNull android.media.session.SessionLink, @NonNull android.media.session.SessionCallbackLink, @NonNull android.media.session.MediaSessionEngine.CallbackStub, int);
-    method public void close();
-    method public String getCallingPackage();
-    method @NonNull public android.media.session.MediaController getController();
-    method @NonNull public android.media.session.MediaSessionManager.RemoteUserInfo getCurrentControllerInfo();
-    method @NonNull public android.media.session.MediaSession.Token getSessionToken();
-    method public boolean isActive();
-    method public static boolean isActiveState(int);
-    method public void sendSessionEvent(@NonNull String, @Nullable android.os.Bundle);
-    method public void setActive(boolean);
-    method public void setCallback(@Nullable android.media.session.MediaSession.Callback);
-    method public void setCallback(@Nullable android.media.session.MediaSession.Callback, @NonNull android.os.Handler);
-    method public void setExtras(@Nullable android.os.Bundle);
-    method public void setFlags(int);
-    method public void setMediaButtonReceiver(@Nullable android.app.PendingIntent);
-    method public void setMetadata(@Nullable android.media.MediaMetadata);
-    method public void setPlaybackState(@Nullable android.media.session.PlaybackState);
-    method public void setPlaybackToLocal(android.media.AudioAttributes);
-    method public void setPlaybackToRemote(@NonNull android.media.VolumeProvider);
-    method public void setQueue(@Nullable java.util.List<android.media.session.MediaSession.QueueItem>);
-    method public void setQueueTitle(@Nullable CharSequence);
-    method public void setRatingType(int);
-    method public void setSessionActivity(@Nullable android.app.PendingIntent);
-  }
-
-  public static final class MediaSessionEngine.CallbackStub {
-    ctor public MediaSessionEngine.CallbackStub();
-    method public void onAdjustVolume(String, int, int, android.media.session.ControllerCallbackLink, int);
-    method public void onCommand(String, int, int, android.media.session.ControllerCallbackLink, String, android.os.Bundle, android.os.ResultReceiver);
-    method public void onCustomAction(String, int, int, android.media.session.ControllerCallbackLink, String, android.os.Bundle);
-    method public void onFastForward(String, int, int, android.media.session.ControllerCallbackLink);
-    method public void onMediaButton(String, int, int, android.content.Intent, int, android.os.ResultReceiver);
-    method public void onMediaButtonFromController(String, int, int, android.media.session.ControllerCallbackLink, android.content.Intent);
-    method public void onNext(String, int, int, android.media.session.ControllerCallbackLink);
-    method public void onPause(String, int, int, android.media.session.ControllerCallbackLink);
-    method public void onPlay(String, int, int, android.media.session.ControllerCallbackLink);
-    method public void onPlayFromMediaId(String, int, int, android.media.session.ControllerCallbackLink, String, android.os.Bundle);
-    method public void onPlayFromSearch(String, int, int, android.media.session.ControllerCallbackLink, String, android.os.Bundle);
-    method public void onPlayFromUri(String, int, int, android.media.session.ControllerCallbackLink, android.net.Uri, android.os.Bundle);
-    method public void onPrepare(String, int, int, android.media.session.ControllerCallbackLink);
-    method public void onPrepareFromMediaId(String, int, int, android.media.session.ControllerCallbackLink, String, android.os.Bundle);
-    method public void onPrepareFromSearch(String, int, int, android.media.session.ControllerCallbackLink, String, android.os.Bundle);
-    method public void onPrepareFromUri(String, int, int, android.media.session.ControllerCallbackLink, android.net.Uri, android.os.Bundle);
-    method public void onPrevious(String, int, int, android.media.session.ControllerCallbackLink);
-    method public void onRate(String, int, int, android.media.session.ControllerCallbackLink, android.media.Rating);
-    method public void onRewind(String, int, int, android.media.session.ControllerCallbackLink);
-    method public void onSeekTo(String, int, int, android.media.session.ControllerCallbackLink, long);
-    method public void onSetVolumeTo(String, int, int, android.media.session.ControllerCallbackLink, int);
-    method public void onSkipToTrack(String, int, int, android.media.session.ControllerCallbackLink, long);
-    method public void onStop(String, int, int, android.media.session.ControllerCallbackLink);
-  }
-
-  public static interface MediaSessionEngine.MediaButtonEventDelegate {
-    method public boolean onMediaButtonIntent(android.content.Intent);
-  }
-
-  public static final class MediaSessionEngine.QueueItem {
-    ctor public MediaSessionEngine.QueueItem(android.media.MediaDescription, long);
-    ctor public MediaSessionEngine.QueueItem(android.os.Parcel);
-    method public android.media.MediaDescription getDescription();
-    method public long getQueueId();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final int UNKNOWN_ID = -1; // 0xffffffff
+  public static final class MediaController.PlaybackInfo implements android.os.Parcelable {
+    ctor public MediaController.PlaybackInfo(int, int, int, int, android.media.AudioAttributes);
   }
 
   public final class MediaSessionManager {
@@ -3708,66 +3610,6 @@
     method public void onVolumeKeyLongPress(android.view.KeyEvent);
   }
 
-  public final class SessionCallbackLink implements android.os.Parcelable {
-    ctor public SessionCallbackLink(android.os.IBinder);
-    method public int describeContents();
-    method @NonNull public android.os.IBinder getBinder();
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifyAdjustVolume(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink, int);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifyCommand(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink, @NonNull String, @Nullable android.os.Bundle, @Nullable android.os.ResultReceiver);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifyCustomAction(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink, @NonNull String, @Nullable android.os.Bundle);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifyFastForward(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifyMediaButton(@NonNull String, int, int, @NonNull android.content.Intent, int, @Nullable android.os.ResultReceiver);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifyMediaButtonFromController(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink, @NonNull android.content.Intent);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifyNext(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifyPause(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifyPlay(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifyPlayFromMediaId(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink, @NonNull String, @Nullable android.os.Bundle);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifyPlayFromSearch(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink, @NonNull String, @Nullable android.os.Bundle);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifyPlayFromUri(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink, @NonNull android.net.Uri, @Nullable android.os.Bundle);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifyPrepare(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifyPrepareFromMediaId(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink, @NonNull String, @Nullable android.os.Bundle);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifyPrepareFromSearch(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink, @NonNull String, @Nullable android.os.Bundle);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifyPrepareFromUri(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink, @NonNull android.net.Uri, @Nullable android.os.Bundle);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifyPrevious(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifyRate(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink, @NonNull android.media.Rating);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifyRewind(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifySeekTo(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink, long);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifySetVolumeTo(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink, int);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifySkipToTrack(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink, long);
-    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void notifyStop(@NonNull String, int, int, @NonNull android.media.session.ControllerCallbackLink);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.media.session.SessionCallbackLink> CREATOR;
-  }
-
-  public final class SessionLink implements android.os.Parcelable {
-    ctor public SessionLink(@NonNull android.media.session.SessionLink.SessionStub);
-    ctor public SessionLink(android.os.IBinder);
-    method public int describeContents();
-    method @NonNull public android.os.IBinder getBinder();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.media.session.SessionLink> CREATOR;
-  }
-
-  public abstract static class SessionLink.SessionStub {
-    ctor public SessionLink.SessionStub();
-    method public void destroySession();
-    method @NonNull public android.media.session.ControllerLink getController();
-    method public void sendEvent(@NonNull String, @Nullable android.os.Bundle);
-    method public void setActive(boolean);
-    method public void setCurrentVolume(int);
-    method public void setExtras(@Nullable android.os.Bundle);
-    method public void setFlags(int);
-    method public void setLaunchPendingIntent(@Nullable android.app.PendingIntent);
-    method public void setMediaButtonReceiver(@Nullable android.app.PendingIntent);
-    method public void setMetadata(@Nullable android.media.MediaMetadata, long, @Nullable String);
-    method public void setPlaybackState(@Nullable android.media.session.PlaybackState);
-    method public void setPlaybackToLocal(@NonNull android.media.AudioAttributes);
-    method public void setPlaybackToRemote(int, int);
-    method public void setQueue(@Nullable java.util.List<android.media.session.MediaSession.QueueItem>);
-    method public void setQueueTitle(@Nullable CharSequence);
-    method public void setRatingType(int);
-  }
-
 }
 
 package android.media.soundtrigger {
@@ -4061,6 +3903,7 @@
 
   public class CaptivePortal implements android.os.Parcelable {
     ctor public CaptivePortal(android.os.IBinder);
+    method public void logEvent(int, String);
     method public void useNetwork();
     field public static final int APP_RETURN_DISMISSED = 0; // 0x0
     field public static final int APP_RETURN_UNWANTED = 1; // 0x1
@@ -4068,9 +3911,10 @@
   }
 
   public class ConnectivityManager {
-    method @RequiresPermission("android.permission.PACKET_KEEPALIVE_OFFLOAD") public android.net.SocketKeepalive createNattKeepalive(@NonNull android.net.Network, @NonNull java.io.FileDescriptor, @NonNull java.net.InetAddress, @NonNull java.net.InetAddress, @NonNull java.util.concurrent.Executor, @NonNull android.net.SocketKeepalive.Callback);
+    method @RequiresPermission(android.Manifest.permission.PACKET_KEEPALIVE_OFFLOAD) public android.net.SocketKeepalive createNattKeepalive(@NonNull android.net.Network, @NonNull java.io.FileDescriptor, @NonNull java.net.InetAddress, @NonNull java.net.InetAddress, @NonNull java.util.concurrent.Executor, @NonNull android.net.SocketKeepalive.Callback);
     method public boolean getAvoidBadWifi();
     method @RequiresPermission(android.Manifest.permission.LOCAL_MAC_ADDRESS) public String getCaptivePortalServerUrl();
+    method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void getLatestTetheringEntitlementValue(int, boolean, @NonNull android.net.ConnectivityManager.TetheringEntitlementValueListener, @Nullable android.os.Handler);
     method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public boolean isTetheringSupported();
     method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void setAirplaneMode(boolean);
     method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void startTethering(int, boolean, android.net.ConnectivityManager.OnStartTetheringCallback);
@@ -4081,6 +3925,9 @@
     field public static final int TETHERING_BLUETOOTH = 2; // 0x2
     field public static final int TETHERING_USB = 1; // 0x1
     field public static final int TETHERING_WIFI = 0; // 0x0
+    field public static final int TETHER_ERROR_ENTITLEMENT_UNKONWN = 13; // 0xd
+    field public static final int TETHER_ERROR_NO_ERROR = 0; // 0x0
+    field public static final int TETHER_ERROR_PROVISION_FAILED = 11; // 0xb
   }
 
   public abstract static class ConnectivityManager.OnStartTetheringCallback {
@@ -4089,8 +3936,14 @@
     method public void onTetheringStarted();
   }
 
+  public abstract static class ConnectivityManager.TetheringEntitlementValueListener {
+    ctor public ConnectivityManager.TetheringEntitlementValueListener();
+    method public void onEntitlementResult(int);
+  }
+
   public final class IpPrefix implements android.os.Parcelable {
     ctor public IpPrefix(java.net.InetAddress, int);
+    ctor public IpPrefix(String);
   }
 
   public final class IpSecManager {
@@ -4113,6 +3966,7 @@
     ctor public LinkAddress(java.net.InetAddress, int, int, int);
     ctor public LinkAddress(java.net.InetAddress, int);
     ctor public LinkAddress(String);
+    ctor public LinkAddress(String, int, int);
     method public boolean isGlobalPreferred();
     method public boolean isIPv4();
     method public boolean isIPv6();
@@ -4123,6 +3977,7 @@
     ctor public LinkProperties();
     ctor public LinkProperties(android.net.LinkProperties);
     method public boolean addDnsServer(java.net.InetAddress);
+    method public boolean addLinkAddress(android.net.LinkAddress);
     method public boolean addRoute(android.net.RouteInfo);
     method public void clear();
     method @Nullable public android.net.IpPrefix getNat64Prefix();
@@ -4137,6 +3992,7 @@
     method public boolean isProvisioned();
     method public boolean isReachable(java.net.InetAddress);
     method public boolean removeDnsServer(java.net.InetAddress);
+    method public boolean removeLinkAddress(android.net.LinkAddress);
     method public boolean removeRoute(android.net.RouteInfo);
     method public void setDnsServers(java.util.Collection<java.net.InetAddress>);
     method public void setDomains(String);
@@ -4153,6 +4009,7 @@
   }
 
   public class Network implements android.os.Parcelable {
+    ctor public Network(android.net.Network);
     method public android.net.Network getPrivateDnsBypassingCopy();
   }
 
@@ -4199,6 +4056,10 @@
     field public static final String EXTRA_PACKAGE_NAME = "packageName";
   }
 
+  public class NetworkStack {
+    field public static final String PERMISSION_MAINLINE_NETWORK_STACK = "android.permission.MAINLINE_NETWORK_STACK";
+  }
+
   public final class RouteInfo implements android.os.Parcelable {
     ctor public RouteInfo(android.net.IpPrefix, java.net.InetAddress, String, int);
     method public int getType();
@@ -4260,6 +4121,9 @@
     method public static void setThreadStatsTagApp();
     method public static void setThreadStatsTagBackup();
     method public static void setThreadStatsTagRestore();
+    field public static final int TAG_SYSTEM_DHCP = -192; // 0xffffff40
+    field public static final int TAG_SYSTEM_DHCP_SERVER = -186; // 0xffffff46
+    field public static final int TAG_SYSTEM_PROBE = -190; // 0xffffff42
   }
 
   public class VpnService extends android.app.Service {
@@ -4285,6 +4149,8 @@
 
   public class ApfCapabilities {
     ctor public ApfCapabilities(int, int, int);
+    method public static boolean getApfDrop8023Frames(android.content.Context);
+    method public static int[] getApfEthTypeBlackList(android.content.Context);
     method public boolean hasDataAccess();
     field public final int apfPacketFormat;
     field public final int apfVersionSupported;
@@ -4481,10 +4347,19 @@
 package android.net.util {
 
   public class SocketUtils {
+    method public static void addArpEntry(java.net.Inet4Address, android.net.MacAddress, String, java.io.FileDescriptor) throws java.io.IOException;
+    method public static void attachControlPacketFilter(java.io.FileDescriptor, int) throws java.net.SocketException;
+    method public static void attachDhcpFilter(java.io.FileDescriptor) throws java.net.SocketException;
+    method public static void attachRaFilter(java.io.FileDescriptor, int) throws java.net.SocketException;
+    method public static void bindSocket(java.io.FileDescriptor, java.net.SocketAddress) throws android.system.ErrnoException, java.net.SocketException;
     method public static void bindSocketToInterface(java.io.FileDescriptor, String) throws android.system.ErrnoException;
+    method public static void closeSocket(java.io.FileDescriptor) throws java.io.IOException;
+    method public static void connectSocket(java.io.FileDescriptor, java.net.SocketAddress) throws android.system.ErrnoException, java.net.SocketException;
     method public static java.net.SocketAddress makeNetlinkSocketAddress(int, int);
     method public static java.net.SocketAddress makePacketSocketAddress(short, int);
     method public static java.net.SocketAddress makePacketSocketAddress(int, byte[]);
+    method public static void sendTo(java.io.FileDescriptor, byte[], int, int, int, java.net.SocketAddress) throws android.system.ErrnoException, java.net.SocketException;
+    method public static void setSocketTimeValueOption(java.io.FileDescriptor, int, int, long) throws android.system.ErrnoException;
   }
 
 }
@@ -4924,8 +4799,16 @@
     method public int describeContents();
     method public void writeToParcel(android.os.Parcel, int);
     field public static final android.os.Parcelable.Creator<android.net.wifi.WifiUsabilityStatsEntry> CREATOR;
+    field public static final int PROBE_STATUS_FAILURE = 3; // 0x3
+    field public static final int PROBE_STATUS_NO_PROBE = 1; // 0x1
+    field public static final int PROBE_STATUS_SUCCESS = 2; // 0x2
+    field public static final int PROBE_STATUS_UNKNOWN = 0; // 0x0
     field public final int linkSpeedMbps;
+    field public final int probeElapsedTimeMsSinceLastUpdate;
+    field public final int probeMcsRateSinceLastUpdate;
+    field public final int probeStatusSinceLastUpdate;
     field public final int rssi;
+    field public final int rxLinkSpeedMbps;
     field public final long timeStampMs;
     field public final long totalBackgroundScanTimeMs;
     field public final long totalBeaconRx;
@@ -5078,6 +4961,7 @@
     method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean enableNdefPush();
     method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean removeNfcUnlockHandler(android.nfc.NfcAdapter.NfcUnlockHandler);
     method public void setNdefPushMessage(android.nfc.NdefMessage, android.app.Activity, int);
+    method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean setNfcSecure(boolean);
     field public static final int FLAG_NDEF_PUSH_NO_CONFIRM = 1; // 0x1
   }
 
@@ -5095,6 +4979,53 @@
     field public static final String EXTRA_EVENT_TIMESTAMP = "android.os.extra.EVENT_TIMESTAMP";
   }
 
+  public final class BatterySaverPolicyConfig implements android.os.Parcelable {
+    method public int describeContents();
+    method public float getAdjustBrightnessFactor();
+    method public boolean getAdvertiseIsEnabled();
+    method public boolean getDeferFullBackup();
+    method public boolean getDeferKeyValueBackup();
+    method @NonNull public java.util.Map<java.lang.String,java.lang.String> getDeviceSpecificSettings();
+    method public boolean getDisableAnimation();
+    method public boolean getDisableAod();
+    method public boolean getDisableLaunchBoost();
+    method public boolean getDisableOptionalSensors();
+    method public boolean getDisableSoundTrigger();
+    method public boolean getDisableVibration();
+    method public boolean getEnableAdjustBrightness();
+    method public boolean getEnableDataSaver();
+    method public boolean getEnableFirewall();
+    method public boolean getEnableQuickDoze();
+    method public boolean getForceAllAppsStandby();
+    method public boolean getForceBackgroundCheck();
+    method public int getGpsMode();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.os.BatterySaverPolicyConfig> CREATOR;
+  }
+
+  public static final class BatterySaverPolicyConfig.Builder {
+    ctor public BatterySaverPolicyConfig.Builder();
+    method @NonNull public android.os.BatterySaverPolicyConfig.Builder addDeviceSpecificSetting(@NonNull String, @NonNull String);
+    method @NonNull public android.os.BatterySaverPolicyConfig build();
+    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setAdjustBrightnessFactor(float);
+    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setAdvertiseIsEnabled(boolean);
+    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setDeferFullBackup(boolean);
+    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setDeferKeyValueBackup(boolean);
+    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setDisableAnimation(boolean);
+    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setDisableAod(boolean);
+    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setDisableLaunchBoost(boolean);
+    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setDisableOptionalSensors(boolean);
+    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setDisableSoundTrigger(boolean);
+    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setDisableVibration(boolean);
+    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setEnableAdjustBrightness(boolean);
+    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setEnableDataSaver(boolean);
+    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setEnableFirewall(boolean);
+    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setEnableQuickDoze(boolean);
+    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setForceAllAppsStandby(boolean);
+    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setForceBackgroundCheck(boolean);
+    method @NonNull public android.os.BatterySaverPolicyConfig.Builder setGpsMode(int);
+  }
+
   public class Binder implements android.os.IBinder {
     method public static final long clearCallingWorkSource();
     method public static final int getCallingWorkSourceUid();
@@ -5299,7 +5230,44 @@
   }
 
   public class IncidentManager {
+    method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public void approveReport(android.net.Uri);
+    method @RequiresPermission("android.permission.REQUEST_INCIDENT_REPORT_APPROVAL") public void cancelAuthorization(android.os.IncidentManager.AuthListener);
+    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void deleteIncidentReports(android.net.Uri);
+    method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public void denyReport(android.net.Uri);
+    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) @Nullable public android.os.IncidentManager.IncidentReport getIncidentReport(android.net.Uri);
+    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) @NonNull public java.util.List<android.net.Uri> getIncidentReportList(String);
+    method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public java.util.List<android.os.IncidentManager.PendingReport> getPendingReports();
     method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void reportIncident(android.os.IncidentReportArgs);
+    method @RequiresPermission("android.permission.REQUEST_INCIDENT_REPORT_APPROVAL") public void requestAuthorization(int, String, int, android.os.IncidentManager.AuthListener);
+    field public static final int FLAG_CONFIRMATION_DIALOG = 1; // 0x1
+    field public static final int PRIVACY_POLICY_AUTO = 200; // 0xc8
+    field public static final int PRIVACY_POLICY_EXPLICIT = 100; // 0x64
+    field public static final int PRIVACY_POLICY_LOCAL = 0; // 0x0
+  }
+
+  public static class IncidentManager.AuthListener {
+    ctor public IncidentManager.AuthListener();
+    method public void onReportApproved();
+    method public void onReportDenied();
+  }
+
+  public static class IncidentManager.IncidentReport implements java.io.Closeable android.os.Parcelable {
+    ctor public IncidentManager.IncidentReport(android.os.Parcel);
+    method public void close();
+    method public int describeContents();
+    method public java.io.InputStream getInputStream() throws java.io.IOException;
+    method public long getPrivacyPolicy();
+    method public long getTimestamp();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.os.IncidentManager.IncidentReport> CREATOR;
+  }
+
+  public static class IncidentManager.PendingReport {
+    ctor public IncidentManager.PendingReport(@NonNull android.net.Uri);
+    method public int getFlags();
+    method @NonNull public String getRequestingPackage();
+    method public long getTimestamp();
+    method @NonNull public android.net.Uri getUri();
   }
 
   public final class IncidentReportArgs implements android.os.Parcelable {
@@ -5333,6 +5301,8 @@
   public final class PowerManager {
     method @RequiresPermission(allOf={android.Manifest.permission.READ_DREAM_STATE, android.Manifest.permission.WRITE_DREAM_STATE}) public void dream(long);
     method @RequiresPermission(android.Manifest.permission.POWER_SAVER) public int getPowerSaveMode();
+    method @RequiresPermission(anyOf={android.Manifest.permission.DEVICE_POWER, android.Manifest.permission.POWER_SAVER}) public boolean setAdaptivePowerSaveEnabled(boolean);
+    method @RequiresPermission(anyOf={android.Manifest.permission.DEVICE_POWER, android.Manifest.permission.POWER_SAVER}) public boolean setAdaptivePowerSavePolicy(@NonNull android.os.BatterySaverPolicyConfig);
     method @RequiresPermission(android.Manifest.permission.POWER_SAVER) public boolean setDynamicPowerSavings(boolean, int);
     method @RequiresPermission(anyOf={android.Manifest.permission.DEVICE_POWER, android.Manifest.permission.POWER_SAVER}) public boolean setPowerSaveMode(boolean);
     method @RequiresPermission(anyOf={android.Manifest.permission.DEVICE_POWER, android.Manifest.permission.USER_ACTIVITY}) public void userActivity(long, int, int);
@@ -5471,6 +5441,7 @@
   }
 
   public final class UserHandle implements android.os.Parcelable {
+    method public static int getAppId(int);
     method public int getIdentifier();
     method @Deprecated public boolean isOwner();
     method public boolean isSystem();
@@ -5728,12 +5699,12 @@
     field public static final String NAMESPACE_GAME_DRIVER = "game_driver";
     field public static final String NAMESPACE_INPUT_NATIVE_BOOT = "input_native_boot";
     field public static final String NAMESPACE_NETD_NATIVE = "netd_native";
-    field public static final String NAMESPACE_NOTIFICATION_ASSISTANT = "notification_assistant";
   }
 
   public static interface DeviceConfig.ActivityManager {
     field public static final String KEY_COMPACT_ACTION_1 = "compact_action_1";
     field public static final String KEY_COMPACT_ACTION_2 = "compact_action_2";
+    field public static final String KEY_COMPACT_STATSD_SAMPLE_RATE = "compact_statsd_sample_rate";
     field public static final String KEY_COMPACT_THROTTLE_1 = "compact_throttle_1";
     field public static final String KEY_COMPACT_THROTTLE_2 = "compact_throttle_2";
     field public static final String KEY_COMPACT_THROTTLE_3 = "compact_throttle_3";
@@ -5743,28 +5714,53 @@
     field public static final String NAMESPACE = "activity_manager";
   }
 
-  public static interface DeviceConfig.AttentionManagerService {
-    field public static final String NAMESPACE = "attention_manager_service";
-    field public static final String PROPERTY_COMPONENT_NAME = "component_name";
-    field public static final String PROPERTY_SERVICE_ENABLED = "service_enabled";
+  public static interface DeviceConfig.ActivityManagerNativeBoot {
+    field public static final String NAMESPACE = "activity_manager_native_boot";
+    field public static final String OFFLOAD_QUEUE_ENABLED = "offload_queue_enabled";
   }
 
-  public static interface DeviceConfig.FsiBoot {
-    field public static final String NAMESPACE = "fsi_boot";
-    field public static final String OOB_ENABLED = "oob_enabled";
-    field public static final String OOB_WHITELIST = "oob_whitelist";
+  public static interface DeviceConfig.AttentionManagerService {
+    field public static final String COMPONENT_NAME = "component_name";
+    field public static final String NAMESPACE = "attention_manager_service";
+    field public static final String SERVICE_ENABLED = "service_enabled";
+  }
+
+  public static interface DeviceConfig.ContentCapture {
+    field public static final String NAMESPACE = "content_capture";
+  }
+
+  public static interface DeviceConfig.DexBoot {
+    field public static final String NAMESPACE = "dex_boot";
+    field public static final String PRIV_APPS_OOB_ENABLED = "priv_apps_oob_enabled";
+    field public static final String PRIV_APPS_OOB_WHITELIST = "priv_apps_oob_whitelist";
   }
 
   public static interface DeviceConfig.IntelligenceAttention {
+    field public static final String ATTENTION_ENABLED = "attention_enabled";
+    field public static final String ATTENTION_SETTINGS = "attention_settings";
     field public static final String NAMESPACE = "intelligence_attention";
-    field public static final String PROPERTY_ATTENTION_ENABLED = "attention_enabled";
-    field public static final String PROPERTY_ATTENTION_SETTINGS = "attention_settings";
+  }
+
+  public static interface DeviceConfig.NotificationAssistant {
+    field public static final String GENERATE_ACTIONS = "generate_actions";
+    field public static final String GENERATE_REPLIES = "generate_replies";
+    field public static final String NAMESPACE = "notification_assistant";
   }
 
   public static interface DeviceConfig.OnPropertyChangedListener {
     method public void onPropertyChanged(String, String, String);
   }
 
+  public static interface DeviceConfig.Privacy {
+    field public static final String NAMESPACE = "privacy";
+    field public static final String PROPERTY_LOCATION_ACCESS_CHECK_ENABLED = "location_access_check_enabled";
+    field public static final String PROPERTY_PERMISSIONS_HUB_ENABLED = "permissions_hub_enabled";
+  }
+
+  public static interface DeviceConfig.RuntimeNative {
+    field public static final String NAMESPACE = "runtime_native";
+  }
+
   public static interface DeviceConfig.Storage {
     field public static final String ISOLATED_STORAGE_ENABLED = "isolated_storage_enabled";
     field public static final String NAMESPACE = "storage";
@@ -5772,8 +5768,9 @@
 
   public static interface DeviceConfig.Telephony {
     field public static final String NAMESPACE = "telephony";
-    field public static final String PROPERTY_ENABLE_RAMPING_RINGER = "enable_ramping_ringer";
-    field public static final String PROPERTY_RAMPING_RINGER_DURATION = "ramping_duration";
+    field public static final String RAMPING_RINGER_DURATION = "ramping_ringer_duration";
+    field public static final String RAMPING_RINGER_ENABLED = "ramping_ringer_enabled";
+    field public static final String RAMPING_RINGER_VIBRATION_DURATION = "ramping_ringer_vibration_duration";
   }
 
   public final class DocumentsContract {
@@ -5848,6 +5845,9 @@
     field public static final String[] NON_INDEXABLES_KEYS_COLUMNS;
     field public static final String NON_INDEXABLES_KEYS_PATH = "settings/non_indexables_key";
     field public static final String PROVIDER_INTERFACE = "android.content.action.SEARCH_INDEXABLES_PROVIDER";
+    field public static final String SLICE_URI_PAIRS = "slice_uri_pairs";
+    field public static final String[] SLICE_URI_PAIRS_COLUMNS;
+    field public static final String SLICE_URI_PAIRS_PATH = "settings/slice_uri_pairs";
   }
 
   public static class SearchIndexablesContract.BaseColumns {
@@ -5876,6 +5876,11 @@
     field public static final String MIME_TYPE = "vnd.android.cursor.dir/indexables_raw";
   }
 
+  public static final class SearchIndexablesContract.SliceUriPairColumns {
+    field public static final String KEY = "key";
+    field public static final String SLICE_URI = "slice_uri";
+  }
+
   public static final class SearchIndexablesContract.XmlResource extends android.provider.SearchIndexablesContract.BaseColumns {
     field public static final String COLUMN_XML_RESID = "xmlResId";
     field public static final String MIME_TYPE = "vnd.android.cursor.dir/indexables_xml_res";
@@ -5889,6 +5894,7 @@
     method public android.database.Cursor query(android.net.Uri, String[], String, String[], String);
     method public abstract android.database.Cursor queryNonIndexableKeys(String[]);
     method public abstract android.database.Cursor queryRawData(String[]);
+    method public android.database.Cursor querySliceUriPairs();
     method public abstract android.database.Cursor queryXmlResources(String[]);
     method public final int update(android.net.Uri, android.content.ContentValues, String, String[]);
   }
@@ -5948,6 +5954,7 @@
     field public static final String AUTOFILL_USER_DATA_MAX_VALUE_LENGTH = "autofill_user_data_max_value_length";
     field public static final String AUTOFILL_USER_DATA_MIN_VALUE_LENGTH = "autofill_user_data_min_value_length";
     field public static final String COMPLETED_CATEGORY_PREFIX = "suggested.completed_category.";
+    field public static final String CONTENT_CAPTURE_ENABLED = "content_capture_enabled";
     field public static final String DOZE_ALWAYS_ON = "doze_always_on";
     field public static final String HUSH_GESTURE_USED = "hush_gesture_used";
     field public static final String INSTANT_APPS_ENABLED = "instant_apps_enabled";
@@ -7527,8 +7534,9 @@
   }
 
   public class PhoneStateListener {
-    method public void onCallAttributesChanged(android.telephony.CallAttributes);
+    method public void onCallAttributesChanged(@NonNull android.telephony.CallAttributes);
     method public void onCallDisconnectCauseChanged(int, int);
+    method public void onImsCallDisconnectCauseChanged(@NonNull android.telephony.ims.ImsReasonInfo);
     method public void onPreciseCallStateChanged(android.telephony.PreciseCallState);
     method public void onPreciseDataConnectionStateChanged(android.telephony.PreciseDataConnectionState);
     method public void onRadioPowerStateChanged(int);
@@ -7536,6 +7544,7 @@
     method public void onVoiceActivationStateChanged(int);
     field public static final int LISTEN_CALL_ATTRIBUTES_CHANGED = 67108864; // 0x4000000
     field public static final int LISTEN_CALL_DISCONNECT_CAUSES = 33554432; // 0x2000000
+    field public static final int LISTEN_IMS_CALL_DISCONNECT_CAUSES = 134217728; // 0x8000000
     field public static final int LISTEN_PRECISE_CALL_STATE = 2048; // 0x800
     field public static final int LISTEN_PRECISE_DATA_CONNECTION_STATE = 4096; // 0x1000
     field public static final int LISTEN_RADIO_POWER_STATE_CHANGED = 8388608; // 0x800000
@@ -7706,7 +7715,6 @@
 
   public class SubscriptionInfo implements android.os.Parcelable {
     method @Nullable public java.util.List<android.telephony.UiccAccessRule> getAccessRules();
-    method public int getCardId();
     method public int getProfileClass();
   }
 
@@ -7769,7 +7777,6 @@
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void enableVideoCalling(boolean);
     method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getAidForAppType(int);
     method @Deprecated @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.List<android.service.carrier.CarrierIdentifier> getAllowedCarriers(int);
-    method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public int getCardIdForDefaultEuicc();
     method public java.util.List<java.lang.String> getCarrierPackageNamesForIntent(android.content.Intent);
     method public java.util.List<java.lang.String> getCarrierPackageNamesForIntentAndPhone(android.content.Intent, int);
     method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public android.telephony.CarrierRestrictionRules getCarrierRestrictionRules();
@@ -7786,14 +7793,14 @@
     method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean getEmergencyCallbackMode();
     method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getIsimDomain();
     method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getIsimIst();
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getPreferredNetworkTypeBitmap();
+    method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.List<android.util.Pair<java.lang.Integer,java.lang.Integer>> getLogicalToPhysicalSlotMapping();
+    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public long getPreferredNetworkTypeBitmap();
     method @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public int getRadioPowerState();
     method public int getSimApplicationState();
     method public int getSimCardState();
     method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getSimLocale();
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getSupportedRadioAccessFamily();
+    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public long getSupportedRadioAccessFamily();
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public java.util.List<android.telephony.TelephonyHistogram> getTelephonyHistograms();
-    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public android.telephony.UiccCardInfo[] getUiccCardsInfo();
     method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public android.telephony.UiccSlotInfo[] getUiccSlotsInfo();
     method @Nullable public android.os.Bundle getVisualVoicemailSettings();
     method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getVoiceActivationState();
@@ -7802,6 +7809,7 @@
     method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isCurrentPotentialEmergencyNumber(@NonNull String);
     method public boolean isDataConnectivityPossible();
     method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isIdle();
+    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isMultisimCarrierRestricted();
     method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isOffhook();
     method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isRadioOn();
     method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isRinging();
@@ -7818,7 +7826,8 @@
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDataActivationState(int);
     method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDataEnabled(int, boolean);
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDataRoamingEnabled(boolean);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setPreferredNetworkTypeBitmap(int);
+    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setMultisimCarrierRestriction(boolean);
+    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setPreferredNetworkTypeBitmap(long);
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setRadio(boolean);
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setRadioPower(boolean);
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSimPowerState(int);
@@ -7842,27 +7851,27 @@
     field public static final String EXTRA_SIM_STATE = "android.telephony.extra.SIM_STATE";
     field public static final String EXTRA_VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL = "android.telephony.extra.VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL";
     field public static final String EXTRA_VOICEMAIL_SCRAMBLED_PIN_STRING = "android.telephony.extra.VOICEMAIL_SCRAMBLED_PIN_STRING";
-    field public static final int INVALID_CARD_ID = -1; // 0xffffffff
     field public static final long MAX_NUMBER_VERIFICATION_TIMEOUT_MILLIS = 60000L; // 0xea60L
-    field public static final int NETWORK_TYPE_BITMASK_1xRTT = 128; // 0x80
-    field public static final int NETWORK_TYPE_BITMASK_CDMA = 16; // 0x10
-    field public static final int NETWORK_TYPE_BITMASK_EDGE = 4; // 0x4
-    field public static final int NETWORK_TYPE_BITMASK_EHRPD = 16384; // 0x4000
-    field public static final int NETWORK_TYPE_BITMASK_EVDO_0 = 32; // 0x20
-    field public static final int NETWORK_TYPE_BITMASK_EVDO_A = 64; // 0x40
-    field public static final int NETWORK_TYPE_BITMASK_EVDO_B = 4096; // 0x1000
-    field public static final int NETWORK_TYPE_BITMASK_GPRS = 2; // 0x2
-    field public static final int NETWORK_TYPE_BITMASK_GSM = 65536; // 0x10000
-    field public static final int NETWORK_TYPE_BITMASK_HSDPA = 256; // 0x100
-    field public static final int NETWORK_TYPE_BITMASK_HSPA = 1024; // 0x400
-    field public static final int NETWORK_TYPE_BITMASK_HSPAP = 32768; // 0x8000
-    field public static final int NETWORK_TYPE_BITMASK_HSUPA = 512; // 0x200
-    field public static final int NETWORK_TYPE_BITMASK_LTE = 8192; // 0x2000
-    field public static final int NETWORK_TYPE_BITMASK_LTE_CA = 524288; // 0x80000
-    field public static final int NETWORK_TYPE_BITMASK_NR = 1048576; // 0x100000
-    field public static final int NETWORK_TYPE_BITMASK_TD_SCDMA = 131072; // 0x20000
-    field public static final int NETWORK_TYPE_BITMASK_UMTS = 8; // 0x8
-    field public static final int NETWORK_TYPE_BITMASK_UNKNOWN = 1; // 0x1
+    field public static final long NETWORK_TYPE_BITMASK_1xRTT = 64L; // 0x40L
+    field public static final long NETWORK_TYPE_BITMASK_CDMA = 8L; // 0x8L
+    field public static final long NETWORK_TYPE_BITMASK_EDGE = 2L; // 0x2L
+    field public static final long NETWORK_TYPE_BITMASK_EHRPD = 8192L; // 0x2000L
+    field public static final long NETWORK_TYPE_BITMASK_EVDO_0 = 16L; // 0x10L
+    field public static final long NETWORK_TYPE_BITMASK_EVDO_A = 32L; // 0x20L
+    field public static final long NETWORK_TYPE_BITMASK_EVDO_B = 2048L; // 0x800L
+    field public static final long NETWORK_TYPE_BITMASK_GPRS = 1L; // 0x1L
+    field public static final long NETWORK_TYPE_BITMASK_GSM = 32768L; // 0x8000L
+    field public static final long NETWORK_TYPE_BITMASK_HSDPA = 128L; // 0x80L
+    field public static final long NETWORK_TYPE_BITMASK_HSPA = 512L; // 0x200L
+    field public static final long NETWORK_TYPE_BITMASK_HSPAP = 16384L; // 0x4000L
+    field public static final long NETWORK_TYPE_BITMASK_HSUPA = 256L; // 0x100L
+    field public static final long NETWORK_TYPE_BITMASK_IWLAN = 131072L; // 0x20000L
+    field public static final long NETWORK_TYPE_BITMASK_LTE = 4096L; // 0x1000L
+    field public static final long NETWORK_TYPE_BITMASK_LTE_CA = 262144L; // 0x40000L
+    field public static final long NETWORK_TYPE_BITMASK_NR = 524288L; // 0x80000L
+    field public static final long NETWORK_TYPE_BITMASK_TD_SCDMA = 65536L; // 0x10000L
+    field public static final long NETWORK_TYPE_BITMASK_UMTS = 4L; // 0x4L
+    field public static final long NETWORK_TYPE_BITMASK_UNKNOWN = 0L; // 0x0L
     field public static final int RADIO_POWER_OFF = 0; // 0x0
     field public static final int RADIO_POWER_ON = 1; // 0x1
     field public static final int RADIO_POWER_UNAVAILABLE = 2; // 0x2
@@ -7894,18 +7903,6 @@
     field public static final android.os.Parcelable.Creator<android.telephony.UiccAccessRule> CREATOR;
   }
 
-  public class UiccCardInfo implements android.os.Parcelable {
-    ctor public UiccCardInfo(boolean, int, String, String, int);
-    method public int describeContents();
-    method public int getCardId();
-    method public String getEid();
-    method public String getIccId();
-    method public int getSlotIndex();
-    method public boolean isEuicc();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.telephony.UiccCardInfo> CREATOR;
-  }
-
   public class UiccSlotInfo implements android.os.Parcelable {
     ctor public UiccSlotInfo(boolean, boolean, String, int, int, boolean);
     method public int describeContents();
@@ -9283,15 +9280,9 @@
     field public static final int TYPE_VIEW_TEXT_CHANGED = 3; // 0x3
   }
 
-  public final class UserDataRemovalRequest implements android.os.Parcelable {
-    method @NonNull public String getPackageName();
-    method @NonNull public java.util.List<android.view.contentcapture.UserDataRemovalRequest.UriRequest> getUriRequests();
-    method public boolean isForEverything();
-  }
-
-  public final class UserDataRemovalRequest.UriRequest {
-    method @NonNull public android.net.Uri getUri();
-    method @NonNull public boolean isRecursive();
+  public final class ContentCaptureManager {
+    method public boolean isContentCaptureFeatureEnabled();
+    method public void setContentCaptureFeatureEnabled(boolean);
   }
 
   public final class ViewNode extends android.app.assist.AssistStructure.ViewNode {
diff --git a/api/test-current.txt b/api/test-current.txt
index 049e002..81eb1eb 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -4,6 +4,7 @@
   public static final class Manifest.permission {
     field public static final String ACCESS_NOTIFICATIONS = "android.permission.ACCESS_NOTIFICATIONS";
     field public static final String ACTIVITY_EMBEDDING = "android.permission.ACTIVITY_EMBEDDING";
+    field public static final String APPROVE_INCIDENT_REPORTS = "android.permission.APPROVE_INCIDENT_REPORTS";
     field public static final String BRIGHTNESS_SLIDER_USAGE = "android.permission.BRIGHTNESS_SLIDER_USAGE";
     field public static final String CHANGE_APP_IDLE_STATE = "android.permission.CHANGE_APP_IDLE_STATE";
     field public static final String CLEAR_APP_USER_DATA = "android.permission.CLEAR_APP_USER_DATA";
@@ -163,10 +164,11 @@
     field public static final int OP_COARSE_LOCATION = 0; // 0x0
     field public static final int OP_RECORD_AUDIO = 27; // 0x1b
     field public static final int OP_SYSTEM_ALERT_WINDOW = 24; // 0x18
-    field public static final int UID_STATE_BACKGROUND = 4; // 0x4
-    field public static final int UID_STATE_CACHED = 5; // 0x5
-    field public static final int UID_STATE_FOREGROUND = 3; // 0x3
-    field public static final int UID_STATE_FOREGROUND_SERVICE = 2; // 0x2
+    field public static final int UID_STATE_BACKGROUND = 5; // 0x5
+    field public static final int UID_STATE_CACHED = 6; // 0x6
+    field public static final int UID_STATE_FOREGROUND = 4; // 0x4
+    field public static final int UID_STATE_FOREGROUND_SERVICE = 3; // 0x3
+    field public static final int UID_STATE_FOREGROUND_SERVICE_LOCATION = 2; // 0x2
     field public static final int UID_STATE_PERSISTENT = 0; // 0x0
     field public static final int UID_STATE_TOP = 1; // 0x1
   }
@@ -240,6 +242,7 @@
 
   public class NotificationManager {
     method public android.content.ComponentName getEffectsSuppressor();
+    method public boolean matchesCallFilter(android.os.Bundle);
   }
 
   public final class PictureInPictureParams implements android.os.Parcelable {
@@ -330,6 +333,91 @@
 
 }
 
+package android.app.prediction {
+
+  public final class AppPredictionContext implements android.os.Parcelable {
+    method public int describeContents();
+    method @Nullable public android.os.Bundle getExtras();
+    method @NonNull public String getPackageName();
+    method public int getPredictedTargetCount();
+    method public String getUiSurface();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.app.prediction.AppPredictionContext> CREATOR;
+  }
+
+  public static final class AppPredictionContext.Builder {
+    ctor public AppPredictionContext.Builder(@NonNull android.content.Context);
+    method public android.app.prediction.AppPredictionContext build();
+    method public android.app.prediction.AppPredictionContext.Builder setExtras(@Nullable android.os.Bundle);
+    method public android.app.prediction.AppPredictionContext.Builder setPredictedTargetCount(int);
+    method public android.app.prediction.AppPredictionContext.Builder setUiSurface(@Nullable String);
+  }
+
+  public final class AppPredictionManager {
+    method public android.app.prediction.AppPredictor createAppPredictionSession(@NonNull android.app.prediction.AppPredictionContext);
+  }
+
+  public final class AppPredictionSessionId implements android.os.Parcelable {
+    method public int describeContents();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.app.prediction.AppPredictionSessionId> CREATOR;
+  }
+
+  public final class AppPredictor {
+    method public void destroy();
+    method public android.app.prediction.AppPredictionSessionId getSessionId();
+    method public void notifyAppTargetEvent(@NonNull android.app.prediction.AppTargetEvent);
+    method public void notifyLocationShown(@NonNull String, @NonNull java.util.List<android.app.prediction.AppTargetId>);
+    method public void registerPredictionUpdates(@NonNull java.util.concurrent.Executor, @NonNull android.app.prediction.AppPredictor.Callback);
+    method public void requestPredictionUpdate();
+    method @Nullable public void sortTargets(@NonNull java.util.List<android.app.prediction.AppTarget>, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.util.List<android.app.prediction.AppTarget>>);
+    method public void unregisterPredictionUpdates(@NonNull android.app.prediction.AppPredictor.Callback);
+  }
+
+  public static interface AppPredictor.Callback {
+    method public void onTargetsAvailable(@NonNull java.util.List<android.app.prediction.AppTarget>);
+  }
+
+  public final class AppTarget implements android.os.Parcelable {
+    ctor public AppTarget(@NonNull android.app.prediction.AppTargetId, @NonNull String, @Nullable String, @NonNull android.os.UserHandle);
+    method public int describeContents();
+    method @Nullable public String getClassName();
+    method @NonNull public android.app.prediction.AppTargetId getId();
+    method @NonNull public String getPackageName();
+    method public int getRank();
+    method @Nullable public android.content.pm.ShortcutInfo getShortcutInfo();
+    method @NonNull public android.os.UserHandle getUser();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.app.prediction.AppTarget> CREATOR;
+  }
+
+  public final class AppTargetEvent implements android.os.Parcelable {
+    method public int describeContents();
+    method @NonNull public int getAction();
+    method @NonNull public String getLaunchLocation();
+    method @Nullable public android.app.prediction.AppTarget getTarget();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final int ACTION_DISMISS = 2; // 0x2
+    field public static final int ACTION_LAUNCH = 1; // 0x1
+    field public static final int ACTION_PIN = 3; // 0x3
+    field public static final android.os.Parcelable.Creator<android.app.prediction.AppTargetEvent> CREATOR;
+  }
+
+  public static final class AppTargetEvent.Builder {
+    ctor public AppTargetEvent.Builder(@Nullable android.app.prediction.AppTarget, int);
+    method public android.app.prediction.AppTargetEvent build();
+    method public android.app.prediction.AppTargetEvent.Builder setLaunchLocation(String);
+  }
+
+  public final class AppTargetId implements android.os.Parcelable {
+    ctor public AppTargetId(@NonNull String);
+    method public int describeContents();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.app.prediction.AppTargetId> CREATOR;
+  }
+
+}
+
 package android.app.role {
 
   public final class RoleManager {
@@ -413,6 +501,7 @@
   public abstract class PackageManager {
     method public abstract boolean arePermissionsIndividuallyControlled();
     method @RequiresPermission("android.permission.INTERACT_ACROSS_USERS_FULL") public abstract String getDefaultBrowserPackageNameAsUser(int);
+    method public String getIncidentReportApproverPackageName();
     method public abstract int getInstallReason(String, @NonNull android.os.UserHandle);
     method public abstract java.util.List<android.content.pm.ApplicationInfo> getInstalledApplicationsAsUser(int, int);
     method @RequiresPermission("android.permission.INTERACT_ACROSS_USERS_FULL") public abstract java.util.List<android.content.pm.PackageInfo> getInstalledPackagesAsUser(int, int);
@@ -432,8 +521,10 @@
   }
 
   public class PermissionInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
+    field public static final int PROTECTION_FLAG_APP_PREDICTOR = 2097152; // 0x200000
     field public static final int PROTECTION_FLAG_CONFIGURATOR = 524288; // 0x80000
     field public static final int PROTECTION_FLAG_DOCUMENTER = 262144; // 0x40000
+    field public static final int PROTECTION_FLAG_INCIDENT_REPORT_APPROVER = 1048576; // 0x100000
     field public static final int PROTECTION_FLAG_OEM = 16384; // 0x4000
     field public static final int PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER = 65536; // 0x10000
     field public static final int PROTECTION_FLAG_VENDOR_PRIVILEGED = 32768; // 0x8000
@@ -514,21 +605,10 @@
 
 package android.graphics {
 
-  public final class Bitmap implements android.os.Parcelable {
-    method public void eraseColor(@ColorLong long);
-  }
-
   public final class ImageDecoder implements java.lang.AutoCloseable {
     method @AnyThread @NonNull public static android.graphics.ImageDecoder.Source createSource(android.content.res.Resources, java.io.InputStream, int);
   }
 
-  public class Paint {
-    method @ColorLong public long getColorLong();
-    method @ColorLong public long getShadowLayerColorLong();
-    method public void setColor(@ColorLong long);
-    method public void setShadowLayer(float, float, float, @ColorLong long);
-  }
-
 }
 
 package android.graphics.drawable {
@@ -580,7 +660,9 @@
     field public static final android.os.Parcelable.Creator<android.hardware.display.BrightnessChangeEvent> CREATOR;
     field public final float batteryLevel;
     field public final float brightness;
+    field public final long colorSampleDuration;
     field public final int colorTemperature;
+    field @Nullable public final long[] colorValueBuckets;
     field public final boolean isDefaultBrightnessConfig;
     field public final boolean isUserSetBrightness;
     field public final float lastBrightness;
@@ -748,6 +830,17 @@
     method public android.media.BufferingParams.Builder setResumePlaybackMarkMs(int);
   }
 
+  public class MediaPlayer2 implements android.media.AudioRouting java.lang.AutoCloseable {
+    method public android.media.MediaPlayer2.DrmInfo getDrmInfo(@NonNull android.media.DataSourceDesc);
+    method public android.media.MediaDrm.KeyRequest getDrmKeyRequest(@NonNull android.media.DataSourceDesc, @Nullable byte[], @Nullable byte[], @Nullable String, int, @Nullable java.util.Map<java.lang.String,java.lang.String>) throws android.media.MediaPlayer2.NoDrmSchemeException;
+    method public String getDrmPropertyString(@NonNull android.media.DataSourceDesc, @NonNull String) throws android.media.MediaPlayer2.NoDrmSchemeException;
+    method public Object prepareDrm(@NonNull android.media.DataSourceDesc, @NonNull java.util.UUID);
+    method public byte[] provideDrmKeyResponse(@NonNull android.media.DataSourceDesc, @Nullable byte[], @NonNull byte[]) throws android.media.DeniedByServerException, android.media.MediaPlayer2.NoDrmSchemeException;
+    method public void releaseDrm(@NonNull android.media.DataSourceDesc) throws android.media.MediaPlayer2.NoDrmSchemeException;
+    method public void restoreDrmKeys(@NonNull android.media.DataSourceDesc, @NonNull byte[]) throws android.media.MediaPlayer2.NoDrmSchemeException;
+    method public void setDrmPropertyString(@NonNull android.media.DataSourceDesc, @NonNull String, @NonNull String) throws android.media.MediaPlayer2.NoDrmSchemeException;
+  }
+
   public final class PlaybackParams implements android.os.Parcelable {
     method public int getAudioStretchMode();
     method public android.media.PlaybackParams setAudioStretchMode(int);
@@ -798,6 +891,7 @@
 
   public class CaptivePortal implements android.os.Parcelable {
     ctor public CaptivePortal(android.os.IBinder);
+    method public void logEvent(int, String);
     method public void useNetwork();
     field public static final int APP_RETURN_DISMISSED = 0; // 0x0
     field public static final int APP_RETURN_UNWANTED = 1; // 0x1
@@ -811,6 +905,7 @@
 
   public final class IpPrefix implements android.os.Parcelable {
     ctor public IpPrefix(java.net.InetAddress, int);
+    ctor public IpPrefix(String);
   }
 
   public final class IpSecManager {
@@ -819,6 +914,9 @@
 
   public class LinkAddress implements android.os.Parcelable {
     ctor public LinkAddress(java.net.InetAddress, int, int, int);
+    ctor public LinkAddress(java.net.InetAddress, int);
+    ctor public LinkAddress(String);
+    ctor public LinkAddress(String, int, int);
     method public boolean isGlobalPreferred();
     method public boolean isIPv4();
     method public boolean isIPv6();
@@ -828,6 +926,7 @@
   public final class LinkProperties implements android.os.Parcelable {
     ctor public LinkProperties(android.net.LinkProperties);
     method public boolean addDnsServer(java.net.InetAddress);
+    method public boolean addLinkAddress(android.net.LinkAddress);
     method @Nullable public android.net.IpPrefix getNat64Prefix();
     method public java.util.List<java.net.InetAddress> getPcscfServers();
     method public String getTcpBufferSizes();
@@ -840,6 +939,7 @@
     method public boolean isProvisioned();
     method public boolean isReachable(java.net.InetAddress);
     method public boolean removeDnsServer(java.net.InetAddress);
+    method public boolean removeLinkAddress(android.net.LinkAddress);
     method public boolean removeRoute(android.net.RouteInfo);
     method public void setNat64Prefix(android.net.IpPrefix);
     method public void setPcscfServers(java.util.Collection<java.net.InetAddress>);
@@ -850,6 +950,7 @@
   }
 
   public class Network implements android.os.Parcelable {
+    ctor public Network(android.net.Network);
     method public android.net.Network getPrivateDnsBypassingCopy();
   }
 
@@ -859,6 +960,10 @@
     method public boolean satisfiedByNetworkCapabilities(android.net.NetworkCapabilities);
   }
 
+  public class NetworkStack {
+    field public static final String PERMISSION_MAINLINE_NETWORK_STACK = "android.permission.MAINLINE_NETWORK_STACK";
+  }
+
   public final class RouteInfo implements android.os.Parcelable {
     ctor public RouteInfo(android.net.IpPrefix, java.net.InetAddress, String, int);
     method public int getType();
@@ -890,6 +995,9 @@
     method public static long getLoopbackRxPackets();
     method public static long getLoopbackTxBytes();
     method public static long getLoopbackTxPackets();
+    field public static final int TAG_SYSTEM_DHCP = -192; // 0xffffff40
+    field public static final int TAG_SYSTEM_DHCP_SERVER = -186; // 0xffffff46
+    field public static final int TAG_SYSTEM_PROBE = -190; // 0xffffff42
   }
 
 }
@@ -898,6 +1006,8 @@
 
   public class ApfCapabilities {
     ctor public ApfCapabilities(int, int, int);
+    method public static boolean getApfDrop8023Frames(android.content.Context);
+    method public static int[] getApfEthTypeBlackList(android.content.Context);
     method public boolean hasDataAccess();
     field public final int apfPacketFormat;
     field public final int apfVersionSupported;
@@ -1091,6 +1201,26 @@
 
 }
 
+package android.net.util {
+
+  public class SocketUtils {
+    method public static void addArpEntry(java.net.Inet4Address, android.net.MacAddress, String, java.io.FileDescriptor) throws java.io.IOException;
+    method public static void attachControlPacketFilter(java.io.FileDescriptor, int) throws java.net.SocketException;
+    method public static void attachDhcpFilter(java.io.FileDescriptor) throws java.net.SocketException;
+    method public static void attachRaFilter(java.io.FileDescriptor, int) throws java.net.SocketException;
+    method public static void bindSocket(java.io.FileDescriptor, java.net.SocketAddress) throws android.system.ErrnoException, java.net.SocketException;
+    method public static void bindSocketToInterface(java.io.FileDescriptor, String) throws android.system.ErrnoException;
+    method public static void closeSocket(java.io.FileDescriptor) throws java.io.IOException;
+    method public static void connectSocket(java.io.FileDescriptor, java.net.SocketAddress) throws android.system.ErrnoException, java.net.SocketException;
+    method public static java.net.SocketAddress makeNetlinkSocketAddress(int, int);
+    method public static java.net.SocketAddress makePacketSocketAddress(short, int);
+    method public static java.net.SocketAddress makePacketSocketAddress(int, byte[]);
+    method public static void sendTo(java.io.FileDescriptor, byte[], int, int, int, java.net.SocketAddress) throws android.system.ErrnoException, java.net.SocketException;
+    method public static void setSocketTimeValueOption(java.io.FileDescriptor, int, int, long) throws android.system.ErrnoException;
+  }
+
+}
+
 package android.os {
 
   public class Build {
@@ -1246,7 +1376,44 @@
   }
 
   public class IncidentManager {
+    method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public void approveReport(android.net.Uri);
+    method @RequiresPermission("android.permission.REQUEST_INCIDENT_REPORT_APPROVAL") public void cancelAuthorization(android.os.IncidentManager.AuthListener);
+    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void deleteIncidentReports(android.net.Uri);
+    method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public void denyReport(android.net.Uri);
+    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) @Nullable public android.os.IncidentManager.IncidentReport getIncidentReport(android.net.Uri);
+    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) @NonNull public java.util.List<android.net.Uri> getIncidentReportList(String);
+    method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public java.util.List<android.os.IncidentManager.PendingReport> getPendingReports();
     method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void reportIncident(android.os.IncidentReportArgs);
+    method @RequiresPermission("android.permission.REQUEST_INCIDENT_REPORT_APPROVAL") public void requestAuthorization(int, String, int, android.os.IncidentManager.AuthListener);
+    field public static final int FLAG_CONFIRMATION_DIALOG = 1; // 0x1
+    field public static final int PRIVACY_POLICY_AUTO = 200; // 0xc8
+    field public static final int PRIVACY_POLICY_EXPLICIT = 100; // 0x64
+    field public static final int PRIVACY_POLICY_LOCAL = 0; // 0x0
+  }
+
+  public static class IncidentManager.AuthListener {
+    ctor public IncidentManager.AuthListener();
+    method public void onReportApproved();
+    method public void onReportDenied();
+  }
+
+  public static class IncidentManager.IncidentReport implements java.io.Closeable android.os.Parcelable {
+    ctor public IncidentManager.IncidentReport(android.os.Parcel);
+    method public void close();
+    method public int describeContents();
+    method public java.io.InputStream getInputStream() throws java.io.IOException;
+    method public long getPrivacyPolicy();
+    method public long getTimestamp();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.os.IncidentManager.IncidentReport> CREATOR;
+  }
+
+  public static class IncidentManager.PendingReport {
+    ctor public IncidentManager.PendingReport(@NonNull android.net.Uri);
+    method public int getFlags();
+    method @NonNull public String getRequestingPackage();
+    method public long getTimestamp();
+    method @NonNull public android.net.Uri getUri();
   }
 
   public final class IncidentReportArgs implements android.os.Parcelable {
@@ -1577,6 +1744,16 @@
     field public static final android.net.Uri CORP_CONTENT_URI;
   }
 
+  public final class DeviceConfig {
+    method @RequiresPermission("android.permission.WRITE_DEVICE_CONFIG") public static void resetToDefaults(int, @Nullable String);
+    method @RequiresPermission("android.permission.WRITE_DEVICE_CONFIG") public static boolean setProperty(String, String, String, boolean);
+  }
+
+  public static interface DeviceConfig.Privacy {
+    field public static final String NAMESPACE = "privacy";
+    field public static final String PROPERTY_LOCATION_ACCESS_CHECK_ENABLED = "location_access_check_enabled";
+  }
+
   public final class MediaStore {
     method @RequiresPermission(android.Manifest.permission.CLEAR_APP_USER_DATA) public static void deleteContributedMedia(android.content.Context, String, android.os.UserHandle) throws java.io.IOException;
     method @RequiresPermission(android.Manifest.permission.CLEAR_APP_USER_DATA) public static long getContributedMediaSize(android.content.Context, String, android.os.UserHandle) throws java.io.IOException;
@@ -1588,6 +1765,7 @@
 
   public final class Settings {
     field public static final String ACTION_ENTERPRISE_PRIVACY_SETTINGS = "android.settings.ENTERPRISE_PRIVACY_SETTINGS";
+    field public static final int RESET_MODE_PACKAGE_DEFAULTS = 1; // 0x1
   }
 
   public static final class Settings.Global extends android.provider.Settings.NameValueTable {
@@ -1630,6 +1808,7 @@
     field public static final String AUTOFILL_USER_DATA_MAX_USER_DATA_SIZE = "autofill_user_data_max_user_data_size";
     field public static final String AUTOFILL_USER_DATA_MAX_VALUE_LENGTH = "autofill_user_data_max_value_length";
     field public static final String AUTOFILL_USER_DATA_MIN_VALUE_LENGTH = "autofill_user_data_min_value_length";
+    field public static final String CONTENT_CAPTURE_ENABLED = "content_capture_enabled";
     field public static final String DISABLED_PRINT_SERVICES = "disabled_print_services";
     field @Deprecated public static final String ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES = "enabled_notification_policy_access_packages";
     field public static final String LOCATION_ACCESS_CHECK_DELAY_MILLIS = "location_access_check_delay_millis";
@@ -1686,6 +1865,24 @@
 
 }
 
+package android.service.appprediction {
+
+  public abstract class AppPredictionService extends android.app.Service {
+    ctor public AppPredictionService();
+    method @MainThread public abstract void onAppTargetEvent(@NonNull android.app.prediction.AppPredictionSessionId, @NonNull android.app.prediction.AppTargetEvent);
+    method public final android.os.IBinder onBind(android.content.Intent);
+    method public void onCreatePredictionSession(@NonNull android.app.prediction.AppPredictionContext, @NonNull android.app.prediction.AppPredictionSessionId);
+    method @MainThread public void onDestroyPredictionSession(@NonNull android.app.prediction.AppPredictionSessionId);
+    method @MainThread public abstract void onLocationShown(@NonNull android.app.prediction.AppPredictionSessionId, @NonNull String, @NonNull java.util.List<android.app.prediction.AppTargetId>);
+    method @MainThread public abstract void onRequestPredictionUpdate(@NonNull android.app.prediction.AppPredictionSessionId);
+    method @MainThread public abstract void onSortAppTargets(@NonNull android.app.prediction.AppPredictionSessionId, @NonNull java.util.List<android.app.prediction.AppTarget>, @NonNull android.os.CancellationSignal, @NonNull java.util.function.Consumer<java.util.List<android.app.prediction.AppTarget>>);
+    method @MainThread public void onStartPredictionUpdates();
+    method @MainThread public void onStopPredictionUpdates();
+    method public final void updatePredictions(@NonNull android.app.prediction.AppPredictionSessionId, @NonNull java.util.List<android.app.prediction.AppTarget>);
+  }
+
+}
+
 package android.service.autofill {
 
   public abstract class AutofillFieldClassificationService extends android.app.Service {
@@ -2077,6 +2274,7 @@
     method public static int getRawZigZag64Size(long);
     method public int getReadPos();
     method public int getReadableSize();
+    method public int getSize();
     method public int getWriteBufIndex();
     method public int getWriteIndex();
     method public int getWritePos();
@@ -2136,6 +2334,7 @@
     method @Deprecated public void endRepeatedObject(long);
     method public void flush();
     method public byte[] getBytes();
+    method public int getRawSize();
     method public static long makeFieldId(int, long);
     method public long start(long);
     method @Deprecated public long startObject(long);
@@ -2297,6 +2496,10 @@
     method public boolean isSystemGroup();
   }
 
+  public abstract class LayoutInflater {
+    method public void setPrecompiledLayoutsEnabledForTesting(boolean);
+  }
+
   public final class MotionEvent extends android.view.InputEvent implements android.os.Parcelable {
     method public void setActionButton(int);
     method public void setButtonState(int);
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index e84eced..9a6387a 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -24,9 +24,11 @@
 import "frameworks/base/core/proto/android/app/enums.proto";
 import "frameworks/base/core/proto/android/app/settings_enums.proto";
 import "frameworks/base/core/proto/android/app/job/enums.proto";
+import "frameworks/base/core/proto/android/bluetooth/a2dp/enums.proto";
 import "frameworks/base/core/proto/android/bluetooth/enums.proto";
 import "frameworks/base/core/proto/android/bluetooth/hci/enums.proto";
 import "frameworks/base/core/proto/android/bluetooth/hfp/enums.proto";
+import "frameworks/base/core/proto/android/bluetooth/smp/enums.proto";
 import "frameworks/base/core/proto/android/debug/enums.proto";
 import "frameworks/base/core/proto/android/hardware/biometrics/enums.proto";
 import "frameworks/base/core/proto/android/net/networkcapabilities.proto";
@@ -215,6 +217,25 @@
         BiometricHalDeathReported biometric_hal_death_reported = 148;
         BubbleUIChanged bubble_ui_changed = 149;
         ScheduledJobConstraintChanged scheduled_job_constraint_changed = 150;
+        BluetoothActiveDeviceChanged bluetooth_active_device_changed = 151;
+        BluetoothA2dpPlaybackStateChanged bluetooth_a2dp_playback_state_changed = 152;
+        BluetoothA2dpCodecConfigChanged bluetooth_a2dp_codec_config_changed = 153;
+        BluetoothA2dpCodecCapabilityChanged bluetooth_a2dp_codec_capability_changed = 154;
+        BluetoothA2dpAudioUnderrunReported bluetooth_a2dp_audio_underrun_reported = 155;
+        BluetoothA2dpAudioOverrunReported bluetooth_a2dp_audio_overrun_reported = 156;
+        BluetoothDeviceRssiReported bluetooth_device_rssi_reported = 157;
+        BluetoothDeviceFailedContactCounterReported bluetooth_device_failed_contact_counter_reported = 158;
+        BluetoothDeviceTxPowerLevelReported bluetooth_device_tx_power_level_reported = 159;
+        BluetoothHciTimeoutReported bluetooth_hci_timeout_reported = 160;
+        BluetoothQualityReportReported bluetooth_quality_report_reported = 161;
+        BluetoothManufacturerInfoReported bluetooth_device_info_reported = 162;
+        BluetoothRemoteVersionInfoReported bluetooth_remote_version_info_reported = 163;
+        BluetoothSdpAttributeReported bluetooth_sdp_attribute_reported = 164;
+        BluetoothBondStateChanged bluetooth_bond_state_changed = 165;
+        BluetoothClassicPairingEventReported bluetooth_classic_pairing_event_reported = 166;
+        BluetoothSmpPairingEventReported bluetooth_smp_pairing_event_reported = 167;
+        ScreenTimeoutExtensionReported screen_timeout_extension_reported = 168;
+        ProcessStartTime process_start_time = 169;
     }
 
     // Pulled events will start at field 10000.
@@ -269,6 +290,7 @@
         DebugElapsedClock debug_elapsed_clock = 10046;
         DebugFailingElapsedClock debug_failing_elapsed_clock = 10047;
         NumBiometricsEnrolled num_faces_enrolled = 10048;
+        RoleHolder role_holder = 10049;
     }
 
     // DO NOT USE field numbers above 100,000 in AOSP.
@@ -1409,6 +1431,27 @@
     optional android.bluetooth.hfp.ScoCodec codec = 3;
 }
 
+/**
+ * Logged when active device of a profile changes
+ *
+ * Logged from:
+ *     packages/apps/Bluetooth/src/com/android/bluetooth/a2dp/A2dpService.java
+ *     packages/apps/Bluetooth/src/com/android/bluetooth/hfp/HeadsetService.java
+ *     packages/apps/Bluetooth/src/com/android/bluetooth/hearingaid/HearingAidService.java
+ */
+message BluetoothActiveDeviceChanged {
+    // The profile whose active device has changed. Eg. A2DP, HEADSET, HEARING_AID
+    // From android.bluetooth.BluetoothProfile
+    optional int32 bt_profile = 1;
+    // An identifier that can be used to match events for this new active device.
+    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
+    // Salt: Randomly generated 256 bit value
+    // Hash algorithm: HMAC-SHA256
+    // Size: 32 byte
+    // Default: null or empty if there is no active device for this profile
+    optional bytes obfuscated_id = 2 [(android.os.statsd.log_mode) = MODE_BYTES];
+}
+
 // Logs when there is an event affecting Bluetooth device's link layer connection.
 // - This event is triggered when there is a related HCI command or event
 // - Users of this metrics can deduce Bluetooth device's connection state from these events
@@ -1511,6 +1554,516 @@
     optional int32 package_version_code = 3;
 }
 
+/**
+ * Logs when there is a change in Bluetooth A2DP playback state
+ *
+ * Logged from:
+ *     packages/apps/Bluetooth/src/com/android/bluetooth/a2dp/A2dpService.java
+ */
+message BluetoothA2dpPlaybackStateChanged {
+    // An identifier that can be used to match events for this device.
+    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
+    // Salt: Randomly generated 256 bit value
+    // Hash algorithm: HMAC-SHA256
+    // Size: 32 byte
+    // Default: null or empty if the device identifier is not known
+    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
+    // Current playback state
+    // Default: PLAYBACK_STATE_UNKNOWN
+    optional android.bluetooth.a2dp.PlaybackStateEnum playback_state = 2;
+    // Current audio coding mode
+    // Default: AUDIO_CODING_MODE_UNKNOWN
+    optional android.bluetooth.a2dp.AudioCodingModeEnum audio_coding_mode = 3;
+}
+
+/**
+ * Logs when there is a change in A2DP codec config for a particular remote device
+ *
+ * Logged from:
+ *     frameworks/base/core/java/android/bluetooth/BluetoothCodecConfig.java
+ *     packages/apps/Bluetooth/src/com/android/bluetooth/a2dp/A2dpService.java
+ */
+message BluetoothA2dpCodecConfigChanged {
+    // An identifier that can be used to match events for this device.
+    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
+    // Salt: Randomly generated 256 bit value
+    // Hash algorithm: HMAC-SHA256
+    // Size: 32 byte
+    // Default: null or empty if the device identifier is not known
+    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
+    // Type of codec as defined by various SOURCE_CODEC_TYPE_* constants in BluetoothCodecConfig
+    // Default SOURCE_CODEC_TYPE_INVALID
+    optional int32 codec_type = 2;
+    // Codec priroity, the higher the more preferred, -1 for disabled
+    // Default: CODEC_PRIORITY_DEFAULT
+    optional int32 codec_priority = 3;
+    // Sample rate in Hz as defined by various SAMPLE_RATE_* constants in BluetoothCodecConfig
+    // Default: SAMPLE_RATE_NONE
+    optional int32 sample_rate = 4;
+    // Bits per sample as defined by various BITS_PER_SAMPLE_* constants in BluetoothCodecConfig
+    // Default: BITS_PER_SAMPLE_NONE
+    optional int32 bits_per_sample = 5;
+    // Channel mode as defined by various CHANNEL_MODE_* constants in BluetoothCodecConfig
+    // Default: CHANNEL_MODE_NONE
+    optional int32 channel_mode = 6;
+    // Codec specific values
+    // Default 0
+    optional int64 codec_specific_1 = 7;
+    optional int64 codec_specific_2 = 8;
+    optional int64 codec_specific_3 = 9;
+    optional int64 codec_specific_4 = 10;
+}
+
+/**
+ * Logs when there is a change in selectable A2DP codec capability for a paricular remote device
+ * Each codec's capability is logged separately due to statsd restriction
+ *
+ * Logged from:
+ *     frameworks/base/core/java/android/bluetooth/BluetoothCodecConfig.java
+ *     packages/apps/Bluetooth/src/com/android/bluetooth/a2dp/A2dpService.java
+ */
+message BluetoothA2dpCodecCapabilityChanged {
+    // An identifier that can be used to match events for this device.
+    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
+    // Salt: Randomly generated 256 bit value
+    // Hash algorithm: HMAC-SHA256
+    // Size: 32 byte
+    // Default: null or empty if the device identifier is not known
+    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
+    // Type of codec as defined by various SOURCE_CODEC_TYPE_* constants in BluetoothCodecConfig
+    // Default SOURCE_CODEC_TYPE_INVALID
+    optional int32 codec_type = 2;
+    // Codec priroity, the higher the more preferred, -1 for disabled
+    // Default: CODEC_PRIORITY_DEFAULT
+    optional int32 codec_priority = 3;
+    // A bit field of supported sample rates as defined by various SAMPLE_RATE_* constants
+    // in BluetoothCodecConfig
+    // Default: empty and SAMPLE_RATE_NONE for individual item
+    optional int32 sample_rate = 4;
+    // A bit field of supported bits per sample as defined by various BITS_PER_SAMPLE_* constants
+    // in BluetoothCodecConfig
+    // Default: empty and BITS_PER_SAMPLE_NONE for individual item
+    optional int32 bits_per_sample = 5;
+    // A bit field of supported channel mode as defined by various CHANNEL_MODE_* constants in
+    // BluetoothCodecConfig
+    // Default: empty and CHANNEL_MODE_NONE for individual item
+    optional int32 channel_mode = 6;
+    // Codec specific values
+    // Default 0
+    optional int64 codec_specific_1 = 7;
+    optional int64 codec_specific_2 = 8;
+    optional int64 codec_specific_3 = 9;
+    optional int64 codec_specific_4 = 10;
+}
+
+/**
+ * Logs when A2DP failed to read from PCM source.
+ * This typically happens when audio HAL cannot supply A2DP with data fast enough for encoding.
+ *
+ * Logged from:
+ *     system/bt
+ */
+message BluetoothA2dpAudioUnderrunReported {
+    // An identifier that can be used to match events for this device.
+    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
+    // Salt: Randomly generated 256 bit value
+    // Hash algorithm: HMAC-SHA256
+    // Size: 32 byte
+    // Default: null or empty if the device identifier is not known
+    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
+    // Encoding interval in nanoseconds
+    // Default: 0
+    optional int64 encoding_interval_nanos = 2;
+    // Number of bytes of PCM data that could not be read from the source
+    // Default: 0
+    optional int32 num_missing_pcm_bytes = 3;
+}
+
+/**
+ * Logs when A2DP failed send encoded data to the remote device fast enough such that the transmit
+ * buffer queue is full and we have to drop data
+ *
+ * Logged from:
+ *     system/bt
+ */
+message BluetoothA2dpAudioOverrunReported {
+    // An identifier that can be used to match events for this device.
+    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
+    // Salt: Randomly generated 256 bit value
+    // Hash algorithm: HMAC-SHA256
+    // Size: 32 byte
+    // Default: null or empty if the device identifier is not known
+    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
+    // Encoding interval in nanoseconds
+    // Default: 0
+    optional int64 encoding_interval_nanos = 2;
+    // Number of buffers dropped in this event
+    // Each buffer is encoded in one encoding interval and consists of multiple encoded frames
+    // Default: 0
+    optional int32 num_dropped_buffers = 3;
+    // Number of encoded buffers dropped in this event
+    // Default 0
+    optional int32 num_dropped_encoded_frames = 4;
+    // Number of encoded bytes dropped in this event
+    // Default: 0
+    optional int32 num_dropped_encoded_bytes = 5;
+}
+
+/**
+ * Logs when we receive reports regarding a device's RSSI value
+ *
+ * Logged from:
+ *     system/bt
+ */
+message BluetoothDeviceRssiReported {
+    // An identifier that can be used to match events for this device.
+    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
+    // Salt: Randomly generated 256 bit value
+    // Hash algorithm: HMAC-SHA256
+    // Size: 32 byte
+    // Default: null or empty if the device identifier is not known
+    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
+    // Connection handle of this connection if available
+    // Range: 0x0000 - 0x0EFF (12 bits)
+    // Default: 0xFFFF if the handle is unknown
+    optional int32 connection_handle = 2;
+    // HCI command status code if this is triggerred by hci_cmd
+    // Default: STATUS_UNKNOWN
+    optional android.bluetooth.hci.StatusEnum hci_status = 3;
+    // BR/EDR
+    //   Range: -128 ≤ N ≤ 127 (signed integer)
+    //   Units: dB
+    // LE:
+    //   Range: -127 to 20, 127 (signed integer)
+    //   Units: dBm
+    // Invalid when an out of range value is reported
+    optional int32 rssi = 4;
+}
+
+/**
+ * Logs when we receive reports regarding how many consecutive failed contacts for a connection
+ *
+ * Logged from:
+ *     system/bt
+ */
+message BluetoothDeviceFailedContactCounterReported {
+    // An identifier that can be used to match events for this device.
+    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
+    // Salt: Randomly generated 256 bit value
+    // Hash algorithm: HMAC-SHA256
+    // Size: 32 byte
+    // Default: null or empty if the device identifier is not known
+    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
+    // Connection handle of this connection if available
+    // Range: 0x0000 - 0x0EFF (12 bits)
+    // Default: 0xFFFF if the handle is unknown
+    optional int32 connection_handle = 2;
+    // HCI command status code if this is triggerred by hci_cmd
+    // Default: STATUS_UNKNOWN
+    optional android.bluetooth.hci.StatusEnum cmd_status = 3;
+    // Number of consecutive failed contacts for a connection corresponding to the Handle
+    // Range: uint16_t, 0-0xFFFF
+    // Default: 0xFFFFF
+    optional int32 failed_contact_counter = 4;
+}
+
+/**
+ * Logs when we receive reports regarding the tranmit power level used for a specific connection
+ *
+ * Logged from:
+ *     system/bt
+ */
+message BluetoothDeviceTxPowerLevelReported {
+    // An identifier that can be used to match events for this device.
+    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
+    // Salt: Randomly generated 256 bit value
+    // Hash algorithm: HMAC-SHA256
+    // Size: 32 byte
+    // Default: null or empty if the device identifier is not known
+    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
+    // Connection handle of this connection if available
+    // Range: 0x0000 - 0x0EFF (12 bits)
+    // Default: 0xFFFF if the handle is unknown
+    optional int32 connection_handle = 2;
+    // HCI command status code if this is triggered by hci_cmd
+    // Default: STATUS_UNKNOWN
+    optional android.bluetooth.hci.StatusEnum hci_status = 3;
+    // Range: -30 ≤ N ≤ 20
+    // Units: dBm
+    // Invalid when an out of range value is reported
+    optional int32 transmit_power_level = 4;
+}
+
+/**
+ * Logs when Bluetooth controller failed to reply with command status within a timeout period after
+ * receiving an HCI command from the host
+ *
+ * Logged from: system/bt
+ */
+message BluetoothHciTimeoutReported {
+    // HCI command associated with this event
+    // Default: CMD_UNKNOWN
+    optional android.bluetooth.hci.CommandEnum hci_command = 1;
+}
+
+/**
+ * Logs when we receive Bluetooth Link Quality Report event from the controller
+ * See Android Bluetooth HCI specification for more details
+ *
+ * Note: all count and bytes field are counted since last event
+ *
+ * Logged from: system/bt
+ */
+message BluetoothQualityReportReported {
+    // Quality report ID
+    // Original type: uint8_t
+    // Default: BQR_ID_UNKNOWN
+    optional android.bluetooth.hci.BqrIdEnum quality_report_id = 1;
+    // Packet type of the connection
+    // Original type: uint8_t
+    // Default: BQR_PACKET_TYPE_UNKNOWN
+    optional android.bluetooth.hci.BqrPacketTypeEnum packet_types = 2;
+    // Connection handle of the connection
+    // Original type: uint16_t
+    optional int32 connection_handle = 3;
+    // Performing Role for the connection
+    // Original type: uint8_t
+    optional int32 connection_role = 4;
+    // Current Transmit Power Level for the connection. This value is the same as the controller's
+    // response to the HCI_Read_Transmit_Power_Level HCI command
+    // Original type: uint8_t
+    optional int32 tx_power_level = 5;
+    // Received Signal Strength Indication (RSSI) value for the connection. This value is an
+    // absolute receiver signal strength value
+    // Original type: int8_t
+    optional int32 rssi = 6;
+    // Signal-to-Noise Ratio (SNR) value for the connection. It is the average SNR of all the
+    // channels used by the link currently
+    // Original type: uint8_t
+    optional int32 snr = 7;
+    // Indicates the number of unused channels in AFH_channel_map
+    // Original type: uint8_t
+    optional int32 unused_afh_channel_count = 8;
+    // Indicates the number of the channels which are interfered and quality is bad but are still
+    // selected for AFH
+    // Original type: uint8_t
+    optional int32 afh_select_unideal_channel_count = 9;
+    // Current Link Supervision Timeout Setting
+    // Unit: N * 0.3125 ms (1 Bluetooth Clock)
+    // Original type: uint16_t
+    optional int32 lsto = 10;
+    // Piconet Clock for the specified Connection_Handle. This value is the same as the controller's
+    // response to HCI_Read_Clock HCI command with the parameter "Which_Clock" of
+    // 0x01 (Piconet Clock)
+    // Unit: N * 0.3125 ms (1 Bluetooth Clock)
+    // Original type: uint32_t
+    optional int64 connection_piconet_clock = 11;
+    // The count of retransmission
+    // Original type: uint32_t
+    optional int64 retransmission_count = 12;
+    // The count of no RX
+    // Original type: uint32_t
+    optional int64 no_rx_count = 13;
+    // The count of NAK (Negative Acknowledge)
+    // Original type: uint32_t
+    optional int64 nak_count = 14;
+    // Controller timestamp of last TX ACK
+    // Unit: N * 0.3125 ms (1 Bluetooth Clock)
+    // Original type: uint32_t
+    optional int64 last_tx_ack_timestamp = 15;
+    // The count of Flow-off (STOP)
+    // Original type: uint32_t
+    optional int64 flow_off_count = 16;
+    // Controller timestamp of last Flow-on (GO)
+    // Unit: N * 0.3125 ms (1 Bluetooth Clock)
+    // Original type: uint32_t
+    optional int64 last_flow_on_timestamp = 17;
+    // Buffer overflow count (how many bytes of TX data are dropped) since the last event
+    // Original type: uint32_t
+    optional int64 buffer_overflow_bytes = 18;
+    // Buffer underflow count (in byte) since last event
+    // Original type: uint32_t
+    optional int64 buffer_underflow_bytes = 19;
+}
+
+/**
+ * Logs when a Bluetooth device's manufacturer information is learnt by the Bluetooth stack
+ *
+ * Notes:
+ * - Each event can be partially filled as we might learn different pieces of device
+ *   information at different time
+ * - Multiple device info events can be combined to give more complete picture
+ * - When multiple device info events tries to describe the same information, the
+ *   later one wins
+ *
+ * Logged from:
+ *     packages/apps/Bluetooth
+ */
+message BluetoothManufacturerInfoReported {
+    // An identifier that can be used to match events for this device.
+    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
+    // Salt: Randomly generated 256 bit value
+    // Hash algorithm: HMAC-SHA256
+    // Size: 32 byte
+    // Default: null or empty if the device identifier is not known
+    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
+    // Where is this device info obtained from
+    optional android.bluetooth.DeviceInfoSrcEnum source_type = 2;
+    // Name of the data source
+    // For EXTERNAL: package name of the data source
+    // For INTERNAL: null for general case, component name otherwise
+    optional string source_name = 3;
+    // Name of the manufacturer of this device
+    optional string manufacturer = 4;
+    // Model of this device
+    optional string model = 5;
+    // Hardware version of this device
+    optional string hardware_version = 6;
+    // Software version of this device
+    optional string software_version = 7;
+}
+
+/**
+ * Logs when we receive Bluetooth Read Remote Version Information Complete Event from the remote
+ * device, as documented by the Bluetooth Core HCI specification
+ * Reference: https://www.bluetooth.com/specifications/bluetooth-core-specification
+ * Vol 2, Part E, Page 1118
+ *
+ * Logged from:
+ *     system/bt
+ */
+message BluetoothRemoteVersionInfoReported {
+    // Connection handle of the connection
+    // Original type: uint16_t
+    optional int32 connection_handle = 1;
+    // HCI command status code
+    // Default: STATUS_UNKNOWN
+    optional android.bluetooth.hci.StatusEnum hci_status = 2;
+    // 1 byte Version of current LMP in the remote controller
+    optional int32 lmp_version = 3;
+    // 2 bytes LMP manufacturer code of the remote controller
+    // https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers
+    optional int32 lmp_manufacturer_code = 4;
+    // 4 bytes subversion of the LMP in the remote controller
+    optional int32 lmp_subversion = 5;
+}
+
+/**
+ * Logs when certain Bluetooth SDP attributes are discovered
+ * Constant definitions are from:
+ *     https://www.bluetooth.com/specifications/assigned-numbers/service-discovery
+ *
+ * Current logged attributes:
+ * - BluetoothProfileDescriptorList
+ * - Supported Features Bitmask
+ *
+ * Logged from:
+ *     system/bt
+ */
+message BluetoothSdpAttributeReported {
+    // An identifier that can be used to match events for this device.
+    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
+    // Salt: Randomly generated 256 bit value
+    // Hash algorithm: HMAC-SHA256
+    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
+    // Short form UUIDs used to identify Bluetooth protocols, profiles, and service classes
+    // Original type: uint16_t
+    optional int32 protocol_uuid = 2;
+    // Short form UUIDs used to identify Bluetooth SDP attribute types
+    // Original type: uint16_t
+    optional int32 attribute_id = 3;
+    // Attribute value for the particular attribute
+    optional bytes attribute_value = 4 [(android.os.statsd.log_mode) = MODE_BYTES];
+}
+
+/**
+ * Logs when bond state of a Bluetooth device changes
+ *
+ * Logged from:
+ *     frameworks/base/core/java/android/bluetooth/BluetoothDevice.java
+ *     packages/apps/Bluetooth/src/com/android/bluetooth/btservice/BondStateMachine.java
+ */
+message BluetoothBondStateChanged {
+    // An identifier that can be used to match events for this device.
+    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
+    // Salt: Randomly generated 256 bit value
+    // Hash algorithm: HMAC-SHA256
+    // Size: 32 byte
+    // Default: null or empty if the device identifier is not known
+    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
+    // Preferred transport type to remote dual mode device
+    // Default: TRANSPORT_AUTO means no preference
+    optional android.bluetooth.TransportTypeEnum transport = 2;
+    // The type of this Bluetooth device (Classic, LE, or Dual mode)
+    // Default: UNKNOWN
+    optional android.bluetooth.DeviceTypeEnum type = 3;
+    // Current bond state (NONE, BONDING, BONDED)
+    // Default: BOND_STATE_UNKNOWN
+    optional android.bluetooth.BondStateEnum bond_state = 4;
+    // Bonding sub state
+    // Default: BOND_SUB_STATE_UNKNOWN
+    optional android.bluetooth.BondSubStateEnum bonding_sub_state = 5;
+    // Unbond Reason
+    // Default: UNBOND_REASON_UNKNOWN
+    optional android.bluetooth.UnbondReasonEnum unbond_reason = 6;
+}
+
+/**
+ * Logs there is an event related Bluetooth classic pairing
+ *
+ * Logged from:
+ *     system/bt
+ */
+message BluetoothClassicPairingEventReported {
+    // An identifier that can be used to match events for this device.
+    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
+    // Salt: Randomly generated 256 bit value
+    // Hash algorithm: HMAC-SHA256
+    // Size: 32 byte
+    // Default: null or empty if the device identifier is not known
+    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
+    // Connection handle of this connection if available
+    // Range: 0x0000 - 0x0EFF (12 bits)
+    // Default: 0xFFFF if the handle is unknown
+    optional int32 connection_handle = 2;
+    // HCI command associated with this event
+    // Default: CMD_UNKNOWN
+    optional android.bluetooth.hci.CommandEnum hci_cmd = 3;
+    // HCI event associated with this event
+    // Default: EVT_UNKNOWN
+    optional android.bluetooth.hci.EventEnum hci_event = 4;
+    // HCI command status code if this is triggerred by hci_cmd
+    // Default: STATUS_UNKNOWN
+    optional android.bluetooth.hci.StatusEnum cmd_status = 5;
+    // HCI reason code associated with this event
+    // Default: STATUS_UNKNOWN
+    optional android.bluetooth.hci.StatusEnum reason_code = 6;
+}
+
+/**
+ * Logs when there is an event related to Bluetooth Security Manager Protocol (SMP)
+ *
+ * Logged from:
+ *     system/bt
+ */
+message BluetoothSmpPairingEventReported {
+    // An identifier that can be used to match events for this device.
+    // Currently, this is a salted hash of the MAC address of this Bluetooth device.
+    // Salt: Randomly generated 256 bit value
+    // Hash algorithm: HMAC-SHA256
+    // Size: 32 byte
+    // Default: null or empty if the device identifier is not known
+    optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES];
+    // SMP command sent or received over L2CAP
+    // Default: CMD_UNKNOWN
+    optional android.bluetooth.smp.CommandEnum smp_command = 2;
+    // Whether this command is sent or received
+    // Default: DIRECTION_UNKNOWN
+    optional android.bluetooth.DirectionEnum direction = 3;
+    // SMP failure reason code
+    // Default: PAIRING_FAIL_REASON_DEFAULT
+    optional android.bluetooth.smp.PairingFailReasonEnum smp_fail_reason = 4;
+}
 
 /**
  * Logs when something is plugged into or removed from the USB-C connector.
@@ -2418,6 +2971,9 @@
     optional bool is_crypto = 3;
     // The client that this acquisition was received for.
     optional android.hardware.biometrics.ClientEnum client = 4;
+    // If authentication requires user confirmation. See BiometricPrompt's
+    // setRequireConfirmation(bool) method.
+    optional bool require_confirmation = 5;
 
     enum State {
         UNKNOWN = 0;
@@ -2427,12 +2983,12 @@
     }
 
     // State of the current auth attempt.
-    optional State state = 5;
+    optional State state = 6;
     // Time it took to authenticate. For BiometricPrompt where setRequireConfirmation(false) is
     // specified and supported by the biometric modality, this is from the first ACQUIRED_GOOD to
     // AUTHENTICATED. for setRequireConfirmation(true), this is from PENDING_CONFIRMATION to
     // CONFIRMED.
-    optional int64 latency_millis = 6;
+    optional int64 latency_millis = 7;
 }
 
 /**
@@ -3420,6 +3976,20 @@
     optional int32 num_enrolled = 2;
 }
 
+/**
+ * A mapping of role holder -> role
+ */
+message RoleHolder {
+    // uid of the role holder
+    optional int32 uid = 1 [(is_uid) = true];
+
+    // package name of the role holder
+    optional string package_name = 2;
+
+    // the role held
+    optional string role = 3;
+}
+
 message AggStats {
     optional int64 min = 1;
 
@@ -4415,17 +4985,17 @@
  *     packages/apps/Nfc/src/com/android/nfc/cardemulation/AidRoutingManager.java
  */
 message NfcErrorOccurred {
-  enum Type {
-    UNKNOWN = 0;
-    CMD_TIMEOUT = 1;
-    ERROR_NOTIFICATION = 2;
-    AID_OVERFLOW = 3;
-  }
-  optional Type type = 1;
-  // If it's nci cmd timeout, log the timeout command.
-  optional uint32 nci_cmd = 2;
+    enum Type {
+        UNKNOWN = 0;
+        CMD_TIMEOUT = 1;
+        ERROR_NOTIFICATION = 2;
+        AID_OVERFLOW = 3;
+    }
+    optional Type type = 1;
+    // If it's nci cmd timeout, log the timeout command.
+    optional uint32 nci_cmd = 2;
 
-  optional uint32 error_ntf_status_code = 3;
+    optional uint32 error_ntf_status_code = 3;
 }
 
 /**
@@ -4434,14 +5004,14 @@
  *     packages/apps/Nfc/src/com/android/nfc/NfcService.java
  */
 message NfcStateChanged {
-  enum State {
-    UNKNOWN = 0;
-    OFF = 1;
-    ON = 2;
-    ON_LOCKED = 3; // Secure Nfc enabled.
-    CRASH_RESTART = 4; // NfcService watchdog timeout restart.
-  }
-  optional State state = 1;
+    enum State {
+        UNKNOWN = 0;
+        OFF = 1;
+        ON = 2;
+        ON_LOCKED = 3; // Secure Nfc enabled.
+        CRASH_RESTART = 4; // NfcService watchdog timeout restart.
+    }
+    optional State state = 1;
 }
 
 /**
@@ -4450,12 +5020,12 @@
  *     packages/apps/Nfc/src/com/android/nfc/P2pLinkManager.java
  */
 message NfcBeamOccurred {
-  enum Operation {
-      UNKNOWN = 0;
-      SEND = 1;
-      RECEIVE = 2;
-  }
-  optional Operation operation = 1;
+    enum Operation {
+        UNKNOWN = 0;
+        SEND = 1;
+        RECEIVE = 2;
+    }
+    optional Operation operation = 1;
 }
 
 /**
@@ -4465,16 +5035,16 @@
  *     packages/apps/Nfc/src/com/android/nfc/cardemulation/HostNfcFEmulationManager.java
  */
 message NfcCardemulationOccurred {
-  enum Category {
-      UNKNOWN = 0;
-      HCE_PAYMENT = 1;
-      HCE_OTHER = 2;
-      OFFHOST = 3;
-  }
-  // Transaction belongs to HCE payment or HCE other category, or offhost.
-  optional Category category = 1;
-  // SeName from transaction: SIMx, eSEx, HCE, HCEF.
-  optional string se_name = 2;
+    enum Category {
+        UNKNOWN = 0;
+        HCE_PAYMENT = 1;
+        HCE_OTHER = 2;
+        OFFHOST = 3;
+    }
+    // Transaction belongs to HCE payment or HCE other category, or offhost.
+    optional Category category = 1;
+    // SeName from transaction: SIMx, eSEx, HCE, HCEF.
+    optional string se_name = 2;
 }
 
 /**
@@ -4483,16 +5053,16 @@
  *     packages/apps/Nfc/src/com/android/nfc/NfcDispatcher.java
  */
 message NfcTagOccurred {
-  enum Type {
-      UNKNOWN = 0;
-      URL = 1;
-      BT_PAIRING = 2;
-      PROVISION = 3;
-      WIFI_CONNECT = 4;
-      APP_LAUNCH = 5;
-      OTHERS = 6;
-  }
-  optional Type type = 1;
+    enum Type {
+        UNKNOWN = 0;
+        URL = 1;
+        BT_PAIRING = 2;
+        PROVISION = 3;
+        WIFI_CONNECT = 4;
+        APP_LAUNCH = 5;
+        OTHERS = 6;
+    }
+    optional Type type = 1;
 }
 
 /**
@@ -4512,18 +5082,18 @@
  *     packages/apps/SecureElement/src/com/android/se/Terminal.java
  */
 message SeStateChanged {
-  enum State {
-    UNKNOWN = 0;
-    INITIALIZED = 1;
-    DISCONNECTED = 2;
-    CONNECTED = 3;
-    HALCRASH = 4;
-  }
-  optional State state = 1;
+    enum State {
+        UNKNOWN = 0;
+        INITIALIZED = 1;
+        DISCONNECTED = 2;
+        CONNECTED = 3;
+        HALCRASH = 4;
+    }
+    optional State state = 1;
 
-  optional string state_change_reason = 2;
-  // SIMx or eSEx.
-  optional string terminal = 3;
+    optional string state_change_reason = 2;
+    // SIMx or eSEx.
+    optional string terminal = 3;
 }
 
 /**
@@ -4532,15 +5102,15 @@
  *     packages/apps/SecureElement/src/com/android/se/Terminal.java
  */
 message SeOmapiReported {
-  enum Operation {
-    UNKNOWN = 0;
-    OPEN_CHANNEL = 1;
-  }
-  optional Operation operation = 1;
-  // SIMx or eSEx.
-  optional string terminal = 2;
+    enum Operation {
+        UNKNOWN = 0;
+        OPEN_CHANNEL = 1;
+    }
+    optional Operation operation = 1;
+    // SIMx or eSEx.
+    optional string terminal = 2;
 
-  optional string package_name = 3;
+    optional string package_name = 3;
 }
 
 /**
@@ -4694,6 +5264,7 @@
         PERMISSION_IGNORED = 12;
         SWIPE_LEFT = 13;
         SWIPE_RIGHT = 14;
+        STACK_EXPANDED = 15;
     }
     optional Action action = 6;
 
@@ -4722,3 +5293,71 @@
     }
     optional State state = 4;
 }
+
+/**
+ * Logs PowerManagerService screen timeout resets (extensions) that happen when an attention check
+ * returns true.
+ *
+ * Logged from:
+ *   frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java
+ */
+message ScreenTimeoutExtensionReported {
+    // Describes how many times in a row did the power manager reset the screen off timeout.
+    optional uint32 consecutive_timeout_extended_count = 1;
+}
+
+/*
+* Logs number of milliseconds it takes to start a process.
+* The definition of app process start time is from the app launch time to
+* the time that Zygote finished forking the app process and loaded the
+* application package's java classes.
+
+* This metric is different from AppStartOccurred which is for foreground
+* activity only.
+
+* ProcessStartTime can report all processes (both foreground and background)
+* start time.
+*
+* Logged from:
+*   frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
+*/
+message ProcessStartTime {
+    // The uid of the ProcessRecord.
+    optional int32 uid = 1 [(is_uid) = true];
+
+    // The process pid.
+    optional int32 pid = 2;
+
+    // The process name.
+    // Usually package name, "system" for system server.
+    // Provided by ActivityManagerService.
+    optional string process_name = 3;
+
+    enum StartType {
+        UNKNOWN = 0;
+        WARM = 1;
+        HOT = 2;
+        COLD = 3;
+    }
+
+    // The start type.
+    optional StartType type = 4;
+
+    // The elapsed realtime at the start of the process.
+    optional int64 process_start_time_millis = 5;
+
+    // Number of milliseconds it takes to reach bind application.
+    optional int32 bind_application_delay_millis = 6;
+
+    // Number of milliseconds it takes to finish start of the process.
+    optional int32 process_start_delay_millis = 7;
+
+    // hostingType field in ProcessRecord, the component type such as "activity",
+    // "service", "content provider", "broadcast" or other strings.
+    optional string hosting_type = 8;
+
+    // hostingNameStr field in ProcessRecord. The component class name that runs
+    // in this process.
+    optional string hosting_name = 9;
+}
+
diff --git a/cmds/statsd/src/external/StatsCompanionServicePuller.cpp b/cmds/statsd/src/external/StatsCompanionServicePuller.cpp
index 4e4b8f3..f37d2be 100644
--- a/cmds/statsd/src/external/StatsCompanionServicePuller.cpp
+++ b/cmds/statsd/src/external/StatsCompanionServicePuller.cpp
@@ -55,6 +55,10 @@
         Status status = statsCompanionServiceCopy->pullData(mTagId, &returned_value);
         if (!status.isOk()) {
             ALOGW("StatsCompanionServicePuller::pull failed for %d", mTagId);
+            StatsdStats::getInstance().noteStatsCompanionPullFailed(mTagId);
+            if (status.exceptionCode() == Status::Exception::EX_TRANSACTION_FAILED) {
+                StatsdStats::getInstance().noteStatsCompanionPullBinderTransactionFailed(mTagId);
+            }
             return false;
         }
         data->clear();
diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp
index ba7bcc4..6f3eeaa 100644
--- a/cmds/statsd/src/external/StatsPullerManager.cpp
+++ b/cmds/statsd/src/external/StatsPullerManager.cpp
@@ -220,6 +220,9 @@
         // BuildInformation.
         {android::util::BUILD_INFORMATION,
          {.puller = new StatsCompanionServicePuller(android::util::BUILD_INFORMATION)}},
+        // RoleHolder.
+        {android::util::ROLE_HOLDER,
+         {.puller = new StatsCompanionServicePuller(android::util::ROLE_HOLDER)}},
 };
 
 StatsPullerManager::StatsPullerManager() : mNextPullTimeNs(NO_ALARM_UPDATE) {
@@ -231,6 +234,9 @@
     if (kAllPullAtomInfo.find(tagId) != kAllPullAtomInfo.end()) {
         bool ret = kAllPullAtomInfo.find(tagId)->second.puller->Pull(data);
         VLOG("pulled %d items", (int)data->size());
+        if (!ret) {
+            StatsdStats::getInstance().notePullFailed(tagId);
+        }
         return ret;
     } else {
         VLOG("Unknown tagId %d", tagId);
diff --git a/cmds/statsd/src/guardrail/StatsdStats.cpp b/cmds/statsd/src/guardrail/StatsdStats.cpp
index f4d0144..37ccad5 100644
--- a/cmds/statsd/src/guardrail/StatsdStats.cpp
+++ b/cmds/statsd/src/guardrail/StatsdStats.cpp
@@ -403,6 +403,60 @@
     mSystemServerRestartSec.push_back(timeSec);
 }
 
+void StatsdStats::notePullFailed(int atomId) {
+    lock_guard<std::mutex> lock(mLock);
+    mPulledAtomStats[atomId].pullFailed++;
+}
+
+void StatsdStats::noteStatsCompanionPullFailed(int atomId) {
+    lock_guard<std::mutex> lock(mLock);
+    mPulledAtomStats[atomId].statsCompanionPullFailed++;
+}
+
+void StatsdStats::noteStatsCompanionPullBinderTransactionFailed(int atomId) {
+    lock_guard<std::mutex> lock(mLock);
+    mPulledAtomStats[atomId].statsCompanionPullBinderTransactionFailed++;
+}
+
+void StatsdStats::noteEmptyData(int atomId) {
+    lock_guard<std::mutex> lock(mLock);
+    mPulledAtomStats[atomId].emptyData++;
+}
+
+void StatsdStats::noteHardDimensionLimitReached(int metricId) {
+    lock_guard<std::mutex> lock(mLock);
+    getAtomMetricStats(metricId).hardDimensionLimitReached++;
+}
+
+void StatsdStats::noteLateLogEventSkipped(int metricId) {
+    lock_guard<std::mutex> lock(mLock);
+    getAtomMetricStats(metricId).lateLogEventSkipped++;
+}
+
+void StatsdStats::noteSkippedForwardBuckets(int metricId) {
+    lock_guard<std::mutex> lock(mLock);
+    getAtomMetricStats(metricId).skippedForwardBuckets++;
+}
+
+void StatsdStats::noteBadValueType(int metricId) {
+    lock_guard<std::mutex> lock(mLock);
+    getAtomMetricStats(metricId).badValueType++;
+}
+
+void StatsdStats::noteConditionChangeInNextBucket(int metricId) {
+    lock_guard<std::mutex> lock(mLock);
+    getAtomMetricStats(metricId).conditionChangeInNextBucket++;
+}
+
+StatsdStats::AtomMetricStats& StatsdStats::getAtomMetricStats(int metricId) {
+    auto atomMetricStatsIter = mAtomMetricStats.find(metricId);
+    if (atomMetricStatsIter != mAtomMetricStats.end()) {
+        return atomMetricStatsIter->second;
+    }
+    auto emplaceResult = mAtomMetricStats.emplace(metricId, AtomMetricStats());
+    return emplaceResult.first->second;
+}
+
 void StatsdStats::reset() {
     lock_guard<std::mutex> lock(mLock);
     resetInternalLocked();
@@ -442,6 +496,7 @@
         pullStats.second.pullTimeout = 0;
         pullStats.second.pullExceedMaxDelay = 0;
     }
+    mAtomMetricStats.clear();
 }
 
 string buildTimeString(int64_t timeSec) {
@@ -713,6 +768,10 @@
         android::os::statsd::writePullerStatsToStream(pair, &proto);
     }
 
+    for (const auto& pair : mAtomMetricStats) {
+        android::os::statsd::writeAtomMetricStatsToStream(pair, &proto);
+    }
+
     if (mAnomalyAlarmRegisteredStats > 0) {
         uint64_t token = proto.start(FIELD_TYPE_MESSAGE | FIELD_ID_ANOMALY_ALARM_STATS);
         proto.write(FIELD_TYPE_INT32 | FIELD_ID_ANOMALY_ALARMS_REGISTERED,
diff --git a/cmds/statsd/src/guardrail/StatsdStats.h b/cmds/statsd/src/guardrail/StatsdStats.h
index dc647f8..01e9ca1 100644
--- a/cmds/statsd/src/guardrail/StatsdStats.h
+++ b/cmds/statsd/src/guardrail/StatsdStats.h
@@ -318,6 +318,53 @@
     void noteLogLost(int32_t wallClockTimeSec, int32_t count, int lastError);
 
     /**
+     * Records that the pull of an atom has failed
+     */
+    void notePullFailed(int atomId);
+
+    /**
+     * Records that the pull of StatsCompanionService atom has failed
+     */
+    void noteStatsCompanionPullFailed(int atomId);
+
+    /**
+     * Records that the pull of a StatsCompanionService atom has failed due to a failed binder
+     * transaction. This can happen when StatsCompanionService returns too
+     * much data (the max Binder parcel size is 1MB)
+     */
+    void noteStatsCompanionPullBinderTransactionFailed(int atomId);
+
+    /**
+     * A pull with no data occurred
+     */
+    void noteEmptyData(int atomId);
+
+    /**
+     * Hard limit was reached in the cardinality of an atom
+     */
+    void noteHardDimensionLimitReached(int atomId);
+
+    /**
+     * A log event was too late, arrived in the wrong bucket and was skipped
+     */
+    void noteLateLogEventSkipped(int atomId);
+
+    /**
+     * Buckets were skipped as time elapsed without any data for them
+     */
+    void noteSkippedForwardBuckets(int atomId);
+
+    /**
+     * An unsupported value type was received
+     */
+    void noteBadValueType(int atomId);
+
+    /**
+     * A condition change was too late, arrived in the wrong bucket and was skipped
+     */
+    void noteConditionChangeInNextBucket(int atomId);
+
+    /**
      * Reset the historical stats. Including all stats in icebox, and the tracked stats about
      * metrics, matchers, and atoms. The active configs will be kept and StatsdStats will continue
      * to collect stats after reset() has been called.
@@ -349,8 +396,20 @@
         long dataError = 0;
         long pullTimeout = 0;
         long pullExceedMaxDelay = 0;
+        long pullFailed = 0;
+        long statsCompanionPullFailed = 0;
+        long statsCompanionPullBinderTransactionFailed = 0;
+        long emptyData = 0;
     } PulledAtomStats;
 
+    typedef struct {
+        long hardDimensionLimitReached = 0;
+        long lateLogEventSkipped = 0;
+        long skippedForwardBuckets = 0;
+        long badValueType = 0;
+        long conditionChangeInNextBucket = 0;
+    } AtomMetricStats;
+
 private:
     StatsdStats();
 
@@ -378,6 +437,9 @@
     // Maps PullAtomId to its stats. The size is capped by the puller atom counts.
     std::map<int, PulledAtomStats> mPulledAtomStats;
 
+    // Maps metric ID to its stats. The size is capped by the number of metrics.
+    std::map<int, AtomMetricStats> mAtomMetricStats;
+
     struct LogLossStats {
         LogLossStats(int32_t sec, int32_t count, int32_t error)
             : mWallClockSec(sec), mCount(count), mLastError(error) {
@@ -414,6 +476,12 @@
 
     void addToIceBoxLocked(std::shared_ptr<ConfigStats>& stats);
 
+    /**
+     * Get a reference to AtomMetricStats for a metric. If none exists, create it. The reference
+     * will live as long as `this`.
+     */
+    StatsdStats::AtomMetricStats& getAtomMetricStats(int metricId);
+
     FRIEND_TEST(StatsdStatsTest, TestValidConfigAdd);
     FRIEND_TEST(StatsdStatsTest, TestInvalidConfigAdd);
     FRIEND_TEST(StatsdStatsTest, TestConfigRemove);
diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.cpp b/cmds/statsd/src/metrics/ValueMetricProducer.cpp
index 4122d84..6aa8e84 100644
--- a/cmds/statsd/src/metrics/ValueMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/ValueMetricProducer.cpp
@@ -322,6 +322,7 @@
     if (eventTimeNs < mCurrentBucketStartTimeNs) {
         VLOG("Skip event due to late arrival: %lld vs %lld", (long long)eventTimeNs,
              (long long)mCurrentBucketStartTimeNs);
+        StatsdStats::getInstance().noteConditionChangeInNextBucket(mMetricId);
         return;
     }
 
@@ -359,6 +360,12 @@
     }
     StatsdStats::getInstance().notePullDelay(mPullTagId, pullDelayNs);
 
+    if (timestampNs < mCurrentBucketStartTimeNs) {
+        // The data will be skipped in onMatchedLogEventInternalLocked, but we don't want to report
+        // for every event, just the pull
+        StatsdStats::getInstance().noteLateLogEventSkipped(mMetricId);
+    }
+
     for (const auto& data : allData) {
         // make a copy before doing and changes
         LogEvent localCopy = data->makeCopy();
@@ -380,6 +387,7 @@
     if (mCondition) {
         if (allData.size() == 0) {
             VLOG("Data pulled is empty");
+            StatsdStats::getInstance().noteEmptyData(mPullTagId);
             return;
         }
         // For scheduled pulled data, the effective event time is snap to the nearest
@@ -394,6 +402,7 @@
         if (bucketEndTime < mCurrentBucketStartTimeNs) {
             VLOG("Skip bucket end pull due to late arrival: %lld vs %lld", (long long)bucketEndTime,
                  (long long)mCurrentBucketStartTimeNs);
+            StatsdStats::getInstance().noteLateLogEventSkipped(mMetricId);
             return;
         }
         for (const auto& data : allData) {
@@ -442,6 +451,7 @@
         if (newTupleCount > mDimensionHardLimit) {
             ALOGE("ValueMetric %lld dropping data for dimension key %s", (long long)mMetricId,
                   newKey.toString().c_str());
+            StatsdStats::getInstance().noteHardDimensionLimitReached(mMetricId);
             return true;
         }
     }
@@ -524,6 +534,14 @@
         multiIntervals.resize(mFieldMatchers.size());
     }
 
+    // We only use anomaly detection under certain cases.
+    // N.B.: The anomaly detection cases were modified in order to fix an issue with value metrics
+    // containing multiple values. We tried to retain all previous behaviour, but we are unsure the
+    // previous behaviour was correct. At the time of the fix, anomaly detection had no owner.
+    // Whoever next works on it should look into the cases where it is triggered in this function.
+    // Discussion here: http://ag/6124370.
+    bool useAnomalyDetection = true;
+
     for (int i = 0; i < (int)mFieldMatchers.size(); i++) {
         const Matcher& matcher = mFieldMatchers[i];
         Interval& interval = multiIntervals[i];
@@ -531,6 +549,7 @@
         Value value;
         if (!getDoubleOrLong(event, matcher, value)) {
             VLOG("Failed to get value %d from event %s", i, event.ToString().c_str());
+            StatsdStats::getInstance().noteBadValueType(mMetricId);
             return;
         }
         interval.seenNewData = true;
@@ -546,7 +565,11 @@
                     // no base. just update base and return.
                     interval.base = value;
                     interval.hasBase = true;
-                    return;
+                    // If we're missing a base, do not use anomaly detection on incomplete data
+                    useAnomalyDetection = false;
+                    // Continue (instead of return) here in order to set interval.base and
+                    // interval.hasBase for other intervals
+                    continue;
                 }
             }
             Value diff;
@@ -560,7 +583,9 @@
                         VLOG("Unexpected decreasing value");
                         StatsdStats::getInstance().notePullDataError(mPullTagId);
                         interval.base = value;
-                        return;
+                        // If we've got bad data, do not use anomaly detection
+                        useAnomalyDetection = false;
+                        continue;
                     }
                     break;
                 case ValueMetric::DECREASING:
@@ -572,7 +597,9 @@
                         VLOG("Unexpected increasing value");
                         StatsdStats::getInstance().notePullDataError(mPullTagId);
                         interval.base = value;
-                        return;
+                        // If we've got bad data, do not use anomaly detection
+                        useAnomalyDetection = false;
+                        continue;
                     }
                     break;
                 case ValueMetric::ANY:
@@ -608,14 +635,18 @@
         interval.sampleSize += 1;
     }
 
-    // TODO: propgate proper values down stream when anomaly support doubles
-    long wholeBucketVal = multiIntervals[0].value.long_value;
-    auto prev = mCurrentFullBucket.find(eventKey);
-    if (prev != mCurrentFullBucket.end()) {
-        wholeBucketVal += prev->second;
-    }
-    for (auto& tracker : mAnomalyTrackers) {
-        tracker->detectAndDeclareAnomaly(eventTimeNs, mCurrentBucketNum, eventKey, wholeBucketVal);
+    // Only trigger the tracker if all intervals are correct
+    if (useAnomalyDetection) {
+        // TODO: propgate proper values down stream when anomaly support doubles
+        long wholeBucketVal = multiIntervals[0].value.long_value;
+        auto prev = mCurrentFullBucket.find(eventKey);
+        if (prev != mCurrentFullBucket.end()) {
+            wholeBucketVal += prev->second;
+        }
+        for (auto& tracker : mAnomalyTrackers) {
+            tracker->detectAndDeclareAnomaly(
+                eventTimeNs, mCurrentBucketNum, eventKey, wholeBucketVal);
+        }
     }
 }
 
@@ -636,6 +667,7 @@
 
     if (numBucketsForward > 1) {
         VLOG("Skipping forward %lld buckets", (long long)numBucketsForward);
+        StatsdStats::getInstance().noteSkippedForwardBuckets(mMetricId);
         // take base again in future good bucket.
         resetBase();
     }
diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.h b/cmds/statsd/src/metrics/ValueMetricProducer.h
index 69eb0af..a8dfc5b 100644
--- a/cmds/statsd/src/metrics/ValueMetricProducer.h
+++ b/cmds/statsd/src/metrics/ValueMetricProducer.h
@@ -212,6 +212,7 @@
     FRIEND_TEST(ValueMetricProducerTest, TestFirstBucket);
     FRIEND_TEST(ValueMetricProducerTest, TestCalcPreviousBucketEndTime);
     FRIEND_TEST(ValueMetricProducerTest, TestSkipZeroDiffOutput);
+    FRIEND_TEST(ValueMetricProducerTest, TestSkipZeroDiffOutputMultiValue);
     FRIEND_TEST(ValueMetricProducerTest, TestUseZeroDefaultBase);
     FRIEND_TEST(ValueMetricProducerTest, TestUseZeroDefaultBaseWithPullFailures);
     FRIEND_TEST(ValueMetricProducerTest, TestTrimUnusedDimensionKey);
diff --git a/cmds/statsd/src/stats_log.proto b/cmds/statsd/src/stats_log.proto
index e8de875..cca09ac 100644
--- a/cmds/statsd/src/stats_log.proto
+++ b/cmds/statsd/src/stats_log.proto
@@ -403,9 +403,23 @@
         optional int64 data_error = 9;
         optional int64 pull_timeout = 10;
         optional int64 pull_exceed_max_delay = 11;
+        optional int64 pull_failed = 12;
+        optional int64 stats_companion_pull_failed = 13;
+        optional int64 stats_companion_pull_binder_transaction_failed = 14;
+        optional int64 empty_data = 15;
     }
     repeated PulledAtomStats pulled_atom_stats = 10;
 
+    message AtomMetricStats {
+      optional int64 metric_id = 1;
+      optional int64 hard_dimension_limit_reached = 2;
+      optional int64 late_log_event_skipped = 3;
+      optional int64 skipped_forward_buckets = 4;
+      optional int64 bad_value_type = 5;
+      optional int64 condition_change_in_next_bucket = 6;
+    }
+    repeated AtomMetricStats atom_metric_stats = 17;
+
     message LoggerErrorStats {
         optional int32 logger_disconnection_sec = 1;
         optional int32 error_code = 2;
diff --git a/cmds/statsd/src/stats_log_util.cpp b/cmds/statsd/src/stats_log_util.cpp
index 7de0bb3..9c9985e 100644
--- a/cmds/statsd/src/stats_log_util.cpp
+++ b/cmds/statsd/src/stats_log_util.cpp
@@ -66,6 +66,18 @@
 const int FIELD_ID_DATA_ERROR = 9;
 const int FIELD_ID_PULL_TIMEOUT = 10;
 const int FIELD_ID_PULL_EXCEED_MAX_DELAY = 11;
+const int FIELD_ID_PULL_FAILED = 12;
+const int FIELD_ID_STATS_COMPANION_FAILED = 13;
+const int FIELD_ID_STATS_COMPANION_BINDER_TRANSACTION_FAILED = 14;
+const int FIELD_ID_EMPTY_DATA = 15;
+// for AtomMetricStats proto
+const int FIELD_ID_ATOM_METRIC_STATS = 17;
+const int FIELD_ID_METRIC_ID = 1;
+const int FIELD_ID_HARD_DIMENSION_LIMIT_REACHED = 2;
+const int FIELD_ID_LATE_LOG_EVENT_SKIPPED = 3;
+const int FIELD_ID_SKIPPED_FORWARD_BUCKETS = 4;
+const int FIELD_ID_BAD_VALUE_TYPE = 5;
+const int FIELD_ID_CONDITION_CHANGE_IN_NEXT_BUCKET = 6;
 
 namespace {
 
@@ -456,6 +468,32 @@
                        (long long)pair.second.pullTimeout);
     protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_PULL_EXCEED_MAX_DELAY,
                        (long long)pair.second.pullExceedMaxDelay);
+    protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_PULL_FAILED,
+                       (long long)pair.second.pullFailed);
+    protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_STATS_COMPANION_FAILED,
+                       (long long)pair.second.statsCompanionPullFailed);
+    protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_STATS_COMPANION_BINDER_TRANSACTION_FAILED,
+                       (long long)pair.second.statsCompanionPullBinderTransactionFailed);
+    protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_EMPTY_DATA,
+                       (long long)pair.second.emptyData);
+    protoOutput->end(token);
+}
+
+void writeAtomMetricStatsToStream(const std::pair<int, StatsdStats::AtomMetricStats> &pair,
+                                  util::ProtoOutputStream *protoOutput) {
+    uint64_t token = protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_ID_ATOM_METRIC_STATS |
+                                        FIELD_COUNT_REPEATED);
+    protoOutput->write(FIELD_TYPE_INT32 | FIELD_ID_METRIC_ID, (int32_t)pair.first);
+    protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_HARD_DIMENSION_LIMIT_REACHED,
+                       (long long)pair.second.hardDimensionLimitReached);
+    protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_LATE_LOG_EVENT_SKIPPED,
+                       (long long)pair.second.lateLogEventSkipped);
+    protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_SKIPPED_FORWARD_BUCKETS,
+                       (long long)pair.second.skippedForwardBuckets);
+    protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_BAD_VALUE_TYPE,
+                       (long long)pair.second.badValueType);
+    protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_CONDITION_CHANGE_IN_NEXT_BUCKET,
+                       (long long)pair.second.conditionChangeInNextBucket);
     protoOutput->end(token);
 }
 
diff --git a/cmds/statsd/src/stats_log_util.h b/cmds/statsd/src/stats_log_util.h
index 61f31eb..dcea0e6 100644
--- a/cmds/statsd/src/stats_log_util.h
+++ b/cmds/statsd/src/stats_log_util.h
@@ -73,6 +73,10 @@
 void writePullerStatsToStream(const std::pair<int, StatsdStats::PulledAtomStats>& pair,
                               util::ProtoOutputStream* protoOutput);
 
+// Helper function to write AtomMetricStats to ProtoOutputStream
+void writeAtomMetricStatsToStream(const std::pair<int, StatsdStats::AtomMetricStats> &pair,
+                                  util::ProtoOutputStream *protoOutput);
+
 template<class T>
 bool parseProtoOutputStream(util::ProtoOutputStream& protoOutput, T* message) {
     std::string pbBytes;
diff --git a/cmds/statsd/tests/e2e/GaugeMetric_e2e_pull_test.cpp b/cmds/statsd/tests/e2e/GaugeMetric_e2e_pull_test.cpp
index d5c358d..24a9980 100644
--- a/cmds/statsd/tests/e2e/GaugeMetric_e2e_pull_test.cpp
+++ b/cmds/statsd/tests/e2e/GaugeMetric_e2e_pull_test.cpp
@@ -31,8 +31,8 @@
 StatsdConfig CreateStatsdConfig(const GaugeMetric::SamplingType sampling_type) {
     StatsdConfig config;
     config.add_allowed_log_source("AID_ROOT"); // LogEvent defaults to UID of root.
-    auto temperatureAtomMatcher = CreateTemperatureAtomMatcher();
-    *config.add_atom_matcher() = temperatureAtomMatcher;
+    auto atomMatcher = CreateSimpleAtomMatcher("TestMatcher", android::util::SUBSYSTEM_SLEEP_STATE);
+    *config.add_atom_matcher() = atomMatcher;
     *config.add_atom_matcher() = CreateScreenTurnedOnAtomMatcher();
     *config.add_atom_matcher() = CreateScreenTurnedOffAtomMatcher();
 
@@ -41,12 +41,12 @@
 
     auto gaugeMetric = config.add_gauge_metric();
     gaugeMetric->set_id(123456);
-    gaugeMetric->set_what(temperatureAtomMatcher.id());
+    gaugeMetric->set_what(atomMatcher.id());
     gaugeMetric->set_condition(screenIsOffPredicate.id());
     gaugeMetric->set_sampling_type(sampling_type);
     gaugeMetric->mutable_gauge_fields_filter()->set_include_all(true);
     *gaugeMetric->mutable_dimensions_in_what() =
-        CreateDimensions(android::util::TEMPERATURE, {2/* sensor name field */ });
+            CreateDimensions(android::util::SUBSYSTEM_SLEEP_STATE, {1 /* subsystem name */});
     gaugeMetric->set_bucket(FIVE_MINUTES);
     gaugeMetric->set_max_pull_delay_sec(INT_MAX);
     config.set_hash_strings_in_metric_report(false);
@@ -139,9 +139,9 @@
     EXPECT_GT((int)gaugeMetrics.data_size(), 1);
 
     auto data = gaugeMetrics.data(0);
-    EXPECT_EQ(android::util::TEMPERATURE, data.dimensions_in_what().field());
+    EXPECT_EQ(android::util::SUBSYSTEM_SLEEP_STATE, data.dimensions_in_what().field());
     EXPECT_EQ(1, data.dimensions_in_what().value_tuple().dimensions_value_size());
-    EXPECT_EQ(2 /* sensor name field */,
+    EXPECT_EQ(1 /* subsystem name field */,
               data.dimensions_in_what().value_tuple().dimensions_value(0).field());
     EXPECT_FALSE(data.dimensions_in_what().value_tuple().dimensions_value(0).value_str().empty());
     EXPECT_EQ(6, data.bucket_info_size());
@@ -152,8 +152,8 @@
     EXPECT_EQ(0, data.bucket_info(0).wall_clock_timestamp_nanos_size());
     EXPECT_EQ(baseTimeNs + 2 * bucketSizeNs, data.bucket_info(0).start_bucket_elapsed_nanos());
     EXPECT_EQ(baseTimeNs + 3 * bucketSizeNs, data.bucket_info(0).end_bucket_elapsed_nanos());
-    EXPECT_TRUE(data.bucket_info(0).atom(0).temperature().sensor_name().empty());
-    EXPECT_GT(data.bucket_info(0).atom(0).temperature().temperature_deci_celsius(), 0);
+    EXPECT_TRUE(data.bucket_info(0).atom(0).subsystem_sleep_state().subsystem_name().empty());
+    EXPECT_GT(data.bucket_info(0).atom(0).subsystem_sleep_state().time_millis(), 0);
 
     EXPECT_EQ(1, data.bucket_info(1).atom_size());
     EXPECT_EQ(baseTimeNs + 3 * bucketSizeNs + 1,
@@ -161,8 +161,8 @@
     EXPECT_EQ(configAddedTimeNs + 55, data.bucket_info(0).elapsed_timestamp_nanos(0));
     EXPECT_EQ(baseTimeNs + 3 * bucketSizeNs, data.bucket_info(1).start_bucket_elapsed_nanos());
     EXPECT_EQ(baseTimeNs + 4 * bucketSizeNs, data.bucket_info(1).end_bucket_elapsed_nanos());
-    EXPECT_TRUE(data.bucket_info(1).atom(0).temperature().sensor_name().empty());
-    EXPECT_GT(data.bucket_info(1).atom(0).temperature().temperature_deci_celsius(), 0);
+    EXPECT_TRUE(data.bucket_info(1).atom(0).subsystem_sleep_state().subsystem_name().empty());
+    EXPECT_GT(data.bucket_info(1).atom(0).subsystem_sleep_state().time_millis(), 0);
 
     EXPECT_EQ(1, data.bucket_info(2).atom_size());
     EXPECT_EQ(1, data.bucket_info(2).elapsed_timestamp_nanos_size());
@@ -170,8 +170,8 @@
               data.bucket_info(2).elapsed_timestamp_nanos(0));
     EXPECT_EQ(baseTimeNs + 4 * bucketSizeNs, data.bucket_info(2).start_bucket_elapsed_nanos());
     EXPECT_EQ(baseTimeNs + 5 * bucketSizeNs, data.bucket_info(2).end_bucket_elapsed_nanos());
-    EXPECT_TRUE(data.bucket_info(2).atom(0).temperature().sensor_name().empty());
-    EXPECT_GT(data.bucket_info(2).atom(0).temperature().temperature_deci_celsius(), 0);
+    EXPECT_TRUE(data.bucket_info(2).atom(0).subsystem_sleep_state().subsystem_name().empty());
+    EXPECT_GT(data.bucket_info(2).atom(0).subsystem_sleep_state().time_millis(), 0);
 
     EXPECT_EQ(1, data.bucket_info(3).atom_size());
     EXPECT_EQ(1, data.bucket_info(3).elapsed_timestamp_nanos_size());
@@ -179,8 +179,8 @@
               data.bucket_info(3).elapsed_timestamp_nanos(0));
     EXPECT_EQ(baseTimeNs + 5 * bucketSizeNs, data.bucket_info(3).start_bucket_elapsed_nanos());
     EXPECT_EQ(baseTimeNs + 6 * bucketSizeNs, data.bucket_info(3).end_bucket_elapsed_nanos());
-    EXPECT_TRUE(data.bucket_info(3).atom(0).temperature().sensor_name().empty());
-    EXPECT_GT(data.bucket_info(3).atom(0).temperature().temperature_deci_celsius(), 0);
+    EXPECT_TRUE(data.bucket_info(3).atom(0).subsystem_sleep_state().subsystem_name().empty());
+    EXPECT_GT(data.bucket_info(3).atom(0).subsystem_sleep_state().time_millis(), 0);
 
     EXPECT_EQ(1, data.bucket_info(4).atom_size());
     EXPECT_EQ(1, data.bucket_info(4).elapsed_timestamp_nanos_size());
@@ -188,8 +188,8 @@
               data.bucket_info(4).elapsed_timestamp_nanos(0));
     EXPECT_EQ(baseTimeNs + 7 * bucketSizeNs, data.bucket_info(4).start_bucket_elapsed_nanos());
     EXPECT_EQ(baseTimeNs + 8 * bucketSizeNs, data.bucket_info(4).end_bucket_elapsed_nanos());
-    EXPECT_TRUE(data.bucket_info(4).atom(0).temperature().sensor_name().empty());
-    EXPECT_GT(data.bucket_info(4).atom(0).temperature().temperature_deci_celsius(), 0);
+    EXPECT_TRUE(data.bucket_info(4).atom(0).subsystem_sleep_state().subsystem_name().empty());
+    EXPECT_GT(data.bucket_info(4).atom(0).subsystem_sleep_state().time_millis(), 0);
 
     EXPECT_EQ(1, data.bucket_info(5).atom_size());
     EXPECT_EQ(1, data.bucket_info(5).elapsed_timestamp_nanos_size());
@@ -197,8 +197,8 @@
               data.bucket_info(5).elapsed_timestamp_nanos(0));
     EXPECT_EQ(baseTimeNs + 8 * bucketSizeNs, data.bucket_info(5).start_bucket_elapsed_nanos());
     EXPECT_EQ(baseTimeNs + 9 * bucketSizeNs, data.bucket_info(5).end_bucket_elapsed_nanos());
-    EXPECT_TRUE(data.bucket_info(5).atom(0).temperature().sensor_name().empty());
-    EXPECT_GT(data.bucket_info(5).atom(0).temperature().temperature_deci_celsius(), 0);
+    EXPECT_TRUE(data.bucket_info(5).atom(0).subsystem_sleep_state().subsystem_name().empty());
+    EXPECT_GT(data.bucket_info(5).atom(0).subsystem_sleep_state().time_millis(), 0);
 }
 
 TEST(GaugeMetricE2eTest, TestConditionChangeToTrueSamplePulledEvents) {
@@ -262,9 +262,9 @@
     EXPECT_GT((int)gaugeMetrics.data_size(), 1);
 
     auto data = gaugeMetrics.data(0);
-    EXPECT_EQ(android::util::TEMPERATURE, data.dimensions_in_what().field());
+    EXPECT_EQ(android::util::SUBSYSTEM_SLEEP_STATE, data.dimensions_in_what().field());
     EXPECT_EQ(1, data.dimensions_in_what().value_tuple().dimensions_value_size());
-    EXPECT_EQ(2 /* sensor name field */,
+    EXPECT_EQ(1 /* subsystem name field */,
               data.dimensions_in_what().value_tuple().dimensions_value(0).field());
     EXPECT_FALSE(data.dimensions_in_what().value_tuple().dimensions_value(0).value_str().empty());
     EXPECT_EQ(3, data.bucket_info_size());
@@ -275,8 +275,8 @@
     EXPECT_EQ(0, data.bucket_info(0).wall_clock_timestamp_nanos_size());
     EXPECT_EQ(baseTimeNs + 2 * bucketSizeNs, data.bucket_info(0).start_bucket_elapsed_nanos());
     EXPECT_EQ(baseTimeNs + 3 * bucketSizeNs, data.bucket_info(0).end_bucket_elapsed_nanos());
-    EXPECT_TRUE(data.bucket_info(0).atom(0).temperature().sensor_name().empty());
-    EXPECT_GT(data.bucket_info(0).atom(0).temperature().temperature_deci_celsius(), 0);
+    EXPECT_TRUE(data.bucket_info(0).atom(0).subsystem_sleep_state().subsystem_name().empty());
+    EXPECT_GT(data.bucket_info(0).atom(0).subsystem_sleep_state().time_millis(), 0);
 
     EXPECT_EQ(1, data.bucket_info(1).atom_size());
     EXPECT_EQ(baseTimeNs + 3 * bucketSizeNs + 100,
@@ -284,8 +284,8 @@
     EXPECT_EQ(configAddedTimeNs + 55, data.bucket_info(0).elapsed_timestamp_nanos(0));
     EXPECT_EQ(baseTimeNs + 3 * bucketSizeNs, data.bucket_info(1).start_bucket_elapsed_nanos());
     EXPECT_EQ(baseTimeNs + 4 * bucketSizeNs, data.bucket_info(1).end_bucket_elapsed_nanos());
-    EXPECT_TRUE(data.bucket_info(1).atom(0).temperature().sensor_name().empty());
-    EXPECT_GT(data.bucket_info(1).atom(0).temperature().temperature_deci_celsius(), 0);
+    EXPECT_TRUE(data.bucket_info(1).atom(0).subsystem_sleep_state().subsystem_name().empty());
+    EXPECT_GT(data.bucket_info(1).atom(0).subsystem_sleep_state().time_millis(), 0);
 
     EXPECT_EQ(2, data.bucket_info(2).atom_size());
     EXPECT_EQ(2, data.bucket_info(2).elapsed_timestamp_nanos_size());
@@ -295,10 +295,10 @@
               data.bucket_info(2).elapsed_timestamp_nanos(1));
     EXPECT_EQ(baseTimeNs + 7 * bucketSizeNs, data.bucket_info(2).start_bucket_elapsed_nanos());
     EXPECT_EQ(baseTimeNs + 8 * bucketSizeNs, data.bucket_info(2).end_bucket_elapsed_nanos());
-    EXPECT_TRUE(data.bucket_info(2).atom(0).temperature().sensor_name().empty());
-    EXPECT_GT(data.bucket_info(2).atom(0).temperature().temperature_deci_celsius(), 0);
-    EXPECT_TRUE(data.bucket_info(2).atom(1).temperature().sensor_name().empty());
-    EXPECT_GT(data.bucket_info(2).atom(1).temperature().temperature_deci_celsius(), 0);
+    EXPECT_TRUE(data.bucket_info(2).atom(0).subsystem_sleep_state().subsystem_name().empty());
+    EXPECT_GT(data.bucket_info(2).atom(0).subsystem_sleep_state().time_millis(), 0);
+    EXPECT_TRUE(data.bucket_info(2).atom(1).subsystem_sleep_state().subsystem_name().empty());
+    EXPECT_GT(data.bucket_info(2).atom(1).subsystem_sleep_state().time_millis(), 0);
 }
 
 
@@ -366,9 +366,9 @@
     EXPECT_GT((int)gaugeMetrics.data_size(), 1);
 
     auto data = gaugeMetrics.data(0);
-    EXPECT_EQ(android::util::TEMPERATURE, data.dimensions_in_what().field());
+    EXPECT_EQ(android::util::SUBSYSTEM_SLEEP_STATE, data.dimensions_in_what().field());
     EXPECT_EQ(1, data.dimensions_in_what().value_tuple().dimensions_value_size());
-    EXPECT_EQ(2 /* sensor name field */,
+    EXPECT_EQ(1 /* subsystem name field */,
               data.dimensions_in_what().value_tuple().dimensions_value(0).field());
     EXPECT_FALSE(data.dimensions_in_what().value_tuple().dimensions_value(0).value_str().empty());
     EXPECT_EQ(3, data.bucket_info_size());
@@ -378,8 +378,8 @@
     EXPECT_EQ(configAddedTimeNs + 55, data.bucket_info(0).elapsed_timestamp_nanos(0));
     EXPECT_EQ(baseTimeNs + 2 * bucketSizeNs, data.bucket_info(0).start_bucket_elapsed_nanos());
     EXPECT_EQ(baseTimeNs + 3 * bucketSizeNs, data.bucket_info(0).end_bucket_elapsed_nanos());
-    EXPECT_TRUE(data.bucket_info(0).atom(0).temperature().sensor_name().empty());
-    EXPECT_GT(data.bucket_info(0).atom(0).temperature().temperature_deci_celsius(), 0);
+    EXPECT_TRUE(data.bucket_info(0).atom(0).subsystem_sleep_state().subsystem_name().empty());
+    EXPECT_GT(data.bucket_info(0).atom(0).subsystem_sleep_state().time_millis(), 0);
 
     EXPECT_EQ(1, data.bucket_info(1).atom_size());
     EXPECT_EQ(configAddedTimeNs + 3 * bucketSizeNs + 11,
@@ -387,8 +387,8 @@
     EXPECT_EQ(configAddedTimeNs + 55, data.bucket_info(0).elapsed_timestamp_nanos(0));
     EXPECT_EQ(baseTimeNs + 5 * bucketSizeNs, data.bucket_info(1).start_bucket_elapsed_nanos());
     EXPECT_EQ(baseTimeNs + 6 * bucketSizeNs, data.bucket_info(1).end_bucket_elapsed_nanos());
-    EXPECT_TRUE(data.bucket_info(1).atom(0).temperature().sensor_name().empty());
-    EXPECT_GT(data.bucket_info(1).atom(0).temperature().temperature_deci_celsius(), 0);
+    EXPECT_TRUE(data.bucket_info(1).atom(0).subsystem_sleep_state().subsystem_name().empty());
+    EXPECT_GT(data.bucket_info(1).atom(0).subsystem_sleep_state().time_millis(), 0);
 
     EXPECT_EQ(1, data.bucket_info(2).atom_size());
     EXPECT_EQ(1, data.bucket_info(2).elapsed_timestamp_nanos_size());
@@ -396,9 +396,8 @@
               data.bucket_info(2).elapsed_timestamp_nanos(0));
     EXPECT_EQ(baseTimeNs + 6 * bucketSizeNs, data.bucket_info(2).start_bucket_elapsed_nanos());
     EXPECT_EQ(baseTimeNs + 7 * bucketSizeNs, data.bucket_info(2).end_bucket_elapsed_nanos());
-    EXPECT_TRUE(data.bucket_info(2).atom(0).temperature().sensor_name().empty());
-    EXPECT_GT(data.bucket_info(2).atom(0).temperature().temperature_deci_celsius(), 0);
-
+    EXPECT_TRUE(data.bucket_info(2).atom(0).subsystem_sleep_state().subsystem_name().empty());
+    EXPECT_GT(data.bucket_info(2).atom(0).subsystem_sleep_state().time_millis(), 0);
 }
 
 #else
diff --git a/cmds/statsd/tests/e2e/PartialBucket_e2e_test.cpp b/cmds/statsd/tests/e2e/PartialBucket_e2e_test.cpp
index 370c36c..aee0c1f 100644
--- a/cmds/statsd/tests/e2e/PartialBucket_e2e_test.cpp
+++ b/cmds/statsd/tests/e2e/PartialBucket_e2e_test.cpp
@@ -70,18 +70,19 @@
     StatsdConfig config;
     config.add_allowed_log_source("AID_ROOT");  // LogEvent defaults to UID of root.
 
-    auto temperatureAtomMatcher = CreateTemperatureAtomMatcher();
-    *config.add_atom_matcher() = temperatureAtomMatcher;
+    auto pulledAtomMatcher =
+            CreateSimpleAtomMatcher("TestMatcher", android::util::SUBSYSTEM_SLEEP_STATE);
+    *config.add_atom_matcher() = pulledAtomMatcher;
     *config.add_atom_matcher() = CreateScreenTurnedOnAtomMatcher();
     *config.add_atom_matcher() = CreateScreenTurnedOffAtomMatcher();
 
     auto valueMetric = config.add_value_metric();
     valueMetric->set_id(123456);
-    valueMetric->set_what(temperatureAtomMatcher.id());
+    valueMetric->set_what(pulledAtomMatcher.id());
     *valueMetric->mutable_value_field() =
-            CreateDimensions(android::util::TEMPERATURE, {3 /* temperature degree field */});
+            CreateDimensions(android::util::SUBSYSTEM_SLEEP_STATE, {4 /* time sleeping field */});
     *valueMetric->mutable_dimensions_in_what() =
-            CreateDimensions(android::util::TEMPERATURE, {2 /* sensor name field */});
+            CreateDimensions(android::util::SUBSYSTEM_SLEEP_STATE, {1 /* subsystem name */});
     valueMetric->set_bucket(FIVE_MINUTES);
     valueMetric->set_min_bucket_size_nanos(minTime);
     valueMetric->set_use_absolute_value_on_reset(true);
@@ -92,17 +93,18 @@
     StatsdConfig config;
     config.add_allowed_log_source("AID_ROOT");  // LogEvent defaults to UID of root.
 
-    auto temperatureAtomMatcher = CreateTemperatureAtomMatcher();
-    *config.add_atom_matcher() = temperatureAtomMatcher;
+    auto pulledAtomMatcher =
+                CreateSimpleAtomMatcher("TestMatcher", android::util::SUBSYSTEM_SLEEP_STATE);
+    *config.add_atom_matcher() = pulledAtomMatcher;
     *config.add_atom_matcher() = CreateScreenTurnedOnAtomMatcher();
     *config.add_atom_matcher() = CreateScreenTurnedOffAtomMatcher();
 
     auto gaugeMetric = config.add_gauge_metric();
     gaugeMetric->set_id(123456);
-    gaugeMetric->set_what(temperatureAtomMatcher.id());
+    gaugeMetric->set_what(pulledAtomMatcher.id());
     gaugeMetric->mutable_gauge_fields_filter()->set_include_all(true);
     *gaugeMetric->mutable_dimensions_in_what() =
-            CreateDimensions(android::util::TEMPERATURE, {2 /* sensor name field */});
+            CreateDimensions(android::util::SUBSYSTEM_SLEEP_STATE, {1 /* subsystem name */});
     gaugeMetric->set_bucket(FIVE_MINUTES);
     gaugeMetric->set_min_bucket_size_nanos(minTime);
     return config;
diff --git a/cmds/statsd/tests/e2e/ValueMetric_pull_e2e_test.cpp b/cmds/statsd/tests/e2e/ValueMetric_pull_e2e_test.cpp
index cab6eac..f3c4e12 100644
--- a/cmds/statsd/tests/e2e/ValueMetric_pull_e2e_test.cpp
+++ b/cmds/statsd/tests/e2e/ValueMetric_pull_e2e_test.cpp
@@ -31,8 +31,9 @@
 StatsdConfig CreateStatsdConfig() {
     StatsdConfig config;
     config.add_allowed_log_source("AID_ROOT"); // LogEvent defaults to UID of root.
-    auto temperatureAtomMatcher = CreateTemperatureAtomMatcher();
-    *config.add_atom_matcher() = temperatureAtomMatcher;
+    auto pulledAtomMatcher =
+            CreateSimpleAtomMatcher("TestMatcher", android::util::SUBSYSTEM_SLEEP_STATE);
+    *config.add_atom_matcher() = pulledAtomMatcher;
     *config.add_atom_matcher() = CreateScreenTurnedOnAtomMatcher();
     *config.add_atom_matcher() = CreateScreenTurnedOffAtomMatcher();
 
@@ -41,12 +42,12 @@
 
     auto valueMetric = config.add_value_metric();
     valueMetric->set_id(123456);
-    valueMetric->set_what(temperatureAtomMatcher.id());
+    valueMetric->set_what(pulledAtomMatcher.id());
     valueMetric->set_condition(screenIsOffPredicate.id());
     *valueMetric->mutable_value_field() =
-        CreateDimensions(android::util::TEMPERATURE, {3/* temperature degree field */ });
+            CreateDimensions(android::util::SUBSYSTEM_SLEEP_STATE, {4 /* time sleeping field */});
     *valueMetric->mutable_dimensions_in_what() =
-        CreateDimensions(android::util::TEMPERATURE, {2/* sensor name field */ });
+            CreateDimensions(android::util::SUBSYSTEM_SLEEP_STATE, {1 /* subsystem name */});
     valueMetric->set_bucket(FIVE_MINUTES);
     valueMetric->set_use_absolute_value_on_reset(true);
     valueMetric->set_skip_zero_diff_output(false);
@@ -134,9 +135,9 @@
     EXPECT_GT((int)valueMetrics.data_size(), 1);
 
     auto data = valueMetrics.data(0);
-    EXPECT_EQ(android::util::TEMPERATURE, data.dimensions_in_what().field());
+    EXPECT_EQ(android::util::SUBSYSTEM_SLEEP_STATE, data.dimensions_in_what().field());
     EXPECT_EQ(1, data.dimensions_in_what().value_tuple().dimensions_value_size());
-    EXPECT_EQ(2 /* sensor name field */,
+    EXPECT_EQ(1 /* subsystem name field */,
               data.dimensions_in_what().value_tuple().dimensions_value(0).field());
     EXPECT_FALSE(data.dimensions_in_what().value_tuple().dimensions_value(0).value_str().empty());
     EXPECT_EQ(5, data.bucket_info_size());
@@ -241,9 +242,9 @@
     EXPECT_GT((int)valueMetrics.data_size(), 1);
 
     auto data = valueMetrics.data(0);
-    EXPECT_EQ(android::util::TEMPERATURE, data.dimensions_in_what().field());
+    EXPECT_EQ(android::util::SUBSYSTEM_SLEEP_STATE, data.dimensions_in_what().field());
     EXPECT_EQ(1, data.dimensions_in_what().value_tuple().dimensions_value_size());
-    EXPECT_EQ(2 /* sensor name field */,
+    EXPECT_EQ(1 /* subsystem name field */,
               data.dimensions_in_what().value_tuple().dimensions_value(0).field());
     EXPECT_FALSE(data.dimensions_in_what().value_tuple().dimensions_value(0).value_str().empty());
     EXPECT_EQ(3, data.bucket_info_size());
diff --git a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
index 9cfe343..c0648ee 100644
--- a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
+++ b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
@@ -1508,6 +1508,113 @@
     EXPECT_EQ(5, valueProducer.mPastBuckets.begin()->second.back().values[0].long_value);
 }
 
+TEST(ValueMetricProducerTest, TestSkipZeroDiffOutputMultiValue) {
+    ValueMetric metric;
+    metric.set_id(metricId);
+    metric.set_bucket(ONE_MINUTE);
+    metric.mutable_value_field()->set_field(tagId);
+    metric.mutable_value_field()->add_child()->set_field(2);
+    metric.mutable_value_field()->add_child()->set_field(3);
+    metric.set_aggregation_type(ValueMetric::MIN);
+    metric.set_use_diff(true);
+
+    UidMap uidMap;
+    SimpleAtomMatcher atomMatcher;
+    atomMatcher.set_atom_id(tagId);
+    sp<EventMatcherWizard> eventMatcherWizard =
+            new EventMatcherWizard({new SimpleLogMatchingTracker(
+                    atomMatcherId, logEventMatcherIndex, atomMatcher, uidMap)});
+    sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
+    sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
+
+    ValueMetricProducer valueProducer(kConfigKey, metric, -1, wizard, logEventMatcherIndex,
+                                      eventMatcherWizard, -1, bucketStartTimeNs, bucketStartTimeNs,
+                                      pullerManager);
+
+    shared_ptr<LogEvent> event1 = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
+    event1->write(1);
+    event1->write(10);
+    event1->write(20);
+    event1->init();
+    shared_ptr<LogEvent> event2 = make_shared<LogEvent>(tagId, bucketStartTimeNs + 15);
+    event2->write(1);
+    event2->write(15);
+    event2->write(22);
+    event2->init();
+    valueProducer.onMatchedLogEvent(1 /*log matcher index*/, *event1);
+    // has one slice
+    EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
+    ValueMetricProducer::Interval curInterval0 =
+        valueProducer.mCurrentSlicedBucket.begin()->second[0];
+    ValueMetricProducer::Interval curInterval1 =
+        valueProducer.mCurrentSlicedBucket.begin()->second[1];
+    EXPECT_EQ(true, curInterval0.hasBase);
+    EXPECT_EQ(10, curInterval0.base.long_value);
+    EXPECT_EQ(false, curInterval0.hasValue);
+    EXPECT_EQ(true, curInterval1.hasBase);
+    EXPECT_EQ(20, curInterval1.base.long_value);
+    EXPECT_EQ(false, curInterval1.hasValue);
+
+    valueProducer.onMatchedLogEvent(1 /*log matcher index*/, *event2);
+
+    // has one slice
+    EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
+    curInterval0 = valueProducer.mCurrentSlicedBucket.begin()->second[0];
+    curInterval1 = valueProducer.mCurrentSlicedBucket.begin()->second[1];
+    EXPECT_EQ(true, curInterval0.hasValue);
+    EXPECT_EQ(5, curInterval0.value.long_value);
+    EXPECT_EQ(true, curInterval1.hasValue);
+    EXPECT_EQ(2, curInterval1.value.long_value);
+
+    // no change in first value field
+    shared_ptr<LogEvent> event3 = make_shared<LogEvent>(tagId, bucket2StartTimeNs + 10);
+    event3->write(1);
+    event3->write(15);
+    event3->write(25);
+    event3->init();
+    valueProducer.onMatchedLogEvent(1 /*log matcher index*/, *event3);
+    EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
+    curInterval0 = valueProducer.mCurrentSlicedBucket.begin()->second[0];
+    curInterval1 = valueProducer.mCurrentSlicedBucket.begin()->second[1];
+    EXPECT_EQ(true, curInterval0.hasBase);
+    EXPECT_EQ(15, curInterval0.base.long_value);
+    EXPECT_EQ(true, curInterval0.hasValue);
+    EXPECT_EQ(true, curInterval1.hasBase);
+    EXPECT_EQ(25, curInterval1.base.long_value);
+    EXPECT_EQ(true, curInterval1.hasValue);
+
+    shared_ptr<LogEvent> event4 = make_shared<LogEvent>(tagId, bucket2StartTimeNs + 15);
+    event4->write(1);
+    event4->write(15);
+    event4->write(29);
+    event4->init();
+    valueProducer.onMatchedLogEvent(1 /*log matcher index*/, *event4);
+    EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
+    curInterval0 = valueProducer.mCurrentSlicedBucket.begin()->second[0];
+    curInterval1 = valueProducer.mCurrentSlicedBucket.begin()->second[1];
+    EXPECT_EQ(true, curInterval0.hasBase);
+    EXPECT_EQ(15, curInterval0.base.long_value);
+    EXPECT_EQ(true, curInterval0.hasValue);
+    EXPECT_EQ(true, curInterval1.hasBase);
+    EXPECT_EQ(29, curInterval1.base.long_value);
+    EXPECT_EQ(true, curInterval1.hasValue);
+
+    valueProducer.flushIfNeededLocked(bucket3StartTimeNs);
+
+    EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
+    EXPECT_EQ(2UL, valueProducer.mPastBuckets.begin()->second.size());
+    EXPECT_EQ(2UL, valueProducer.mPastBuckets.begin()->second[0].values.size());
+    EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second[1].values.size());
+
+    EXPECT_EQ(5, valueProducer.mPastBuckets.begin()->second[0].values[0].long_value);
+    EXPECT_EQ(0, valueProducer.mPastBuckets.begin()->second[0].valueIndex[0]);
+    EXPECT_EQ(2, valueProducer.mPastBuckets.begin()->second[0].values[1].long_value);
+    EXPECT_EQ(1, valueProducer.mPastBuckets.begin()->second[0].valueIndex[1]);
+
+    EXPECT_EQ(3, valueProducer.mPastBuckets.begin()->second[1].values[0].long_value);
+    EXPECT_EQ(1, valueProducer.mPastBuckets.begin()->second[1].valueIndex[0]);
+}
+
 /*
  * Tests zero default base.
  */
diff --git a/config/boot-image-profile.txt b/config/boot-image-profile.txt
index c2e441b..7f4d1d0 100644
--- a/config/boot-image-profile.txt
+++ b/config/boot-image-profile.txt
@@ -19875,7 +19875,6 @@
 HSPLandroid/graphics/Bitmap;->createBitmap(Landroid/util/DisplayMetrics;IILandroid/graphics/Bitmap$Config;ZLandroid/graphics/ColorSpace;)Landroid/graphics/Bitmap;
 HSPLandroid/graphics/Bitmap;->createBitmap(Landroid/util/DisplayMetrics;[IIIIILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;
 HSPLandroid/graphics/Bitmap;->createBitmap([IIILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;
-HSPLandroid/graphics/Bitmap;->createHardwareBitmap(Landroid/graphics/GraphicBuffer;)Landroid/graphics/Bitmap;
 HSPLandroid/graphics/Bitmap;->createScaledBitmap(Landroid/graphics/Bitmap;IIZ)Landroid/graphics/Bitmap;
 HSPLandroid/graphics/Bitmap;->eraseColor(I)V
 HSPLandroid/graphics/Bitmap;->extractAlpha(Landroid/graphics/Paint;[I)Landroid/graphics/Bitmap;
diff --git a/config/hiddenapi-greylist.txt b/config/hiddenapi-greylist.txt
index 8e7a58b..a748959 100644
--- a/config/hiddenapi-greylist.txt
+++ b/config/hiddenapi-greylist.txt
@@ -1942,7 +1942,6 @@
 Lcom/android/internal/R$id;->titleDivider:I
 Lcom/android/internal/R$id;->titleDividerTop:I
 Lcom/android/internal/R$id;->title_container:I
-Lcom/android/internal/R$id;->title_icon:I
 Lcom/android/internal/R$id;->title_template:I
 Lcom/android/internal/R$id;->topPanel:I
 Lcom/android/internal/R$id;->up:I
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index e77e212..aac8f08 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -1768,7 +1768,7 @@
     protected void onResume() {
         if (DEBUG_LIFECYCLE) Slog.v(TAG, "onResume " + this);
         dispatchActivityResumed();
-        mActivityTransitionState.onResume(this, isTopOfTask());
+        mActivityTransitionState.onResume(this);
         enableAutofillCompatibilityIfNeeded();
         if (mAutoFillResetNeeded) {
             if (!mAutoFillIgnoreFirstResumePause) {
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 1045b7a..db3b720 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -42,6 +42,7 @@
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.Color;
+import android.graphics.ColorSpace;
 import android.graphics.GraphicBuffer;
 import android.graphics.Matrix;
 import android.graphics.Point;
@@ -505,71 +506,74 @@
     @UnsupportedAppUsage
     public static final int PROCESS_STATE_TOP = 2;
 
+    /** @hide Process is hosting a foreground service with location type. */
+    public static final int PROCESS_STATE_FOREGROUND_SERVICE_LOCATION = 3;
+
     /** @hide Process is hosting a foreground service. */
     @UnsupportedAppUsage
-    public static final int PROCESS_STATE_FOREGROUND_SERVICE = 3;
+    public static final int PROCESS_STATE_FOREGROUND_SERVICE = 4;
 
     /** @hide Process is hosting a foreground service due to a system binding. */
     @UnsupportedAppUsage
-    public static final int PROCESS_STATE_BOUND_FOREGROUND_SERVICE = 4;
+    public static final int PROCESS_STATE_BOUND_FOREGROUND_SERVICE = 5;
 
     /** @hide Process is important to the user, and something they are aware of. */
-    public static final int PROCESS_STATE_IMPORTANT_FOREGROUND = 5;
+    public static final int PROCESS_STATE_IMPORTANT_FOREGROUND = 6;
 
     /** @hide Process is important to the user, but not something they are aware of. */
     @UnsupportedAppUsage
-    public static final int PROCESS_STATE_IMPORTANT_BACKGROUND = 6;
+    public static final int PROCESS_STATE_IMPORTANT_BACKGROUND = 7;
 
     /** @hide Process is in the background transient so we will try to keep running. */
-    public static final int PROCESS_STATE_TRANSIENT_BACKGROUND = 7;
+    public static final int PROCESS_STATE_TRANSIENT_BACKGROUND = 8;
 
     /** @hide Process is in the background running a backup/restore operation. */
-    public static final int PROCESS_STATE_BACKUP = 8;
+    public static final int PROCESS_STATE_BACKUP = 9;
 
     /** @hide Process is in the background running a service.  Unlike oom_adj, this level
      * is used for both the normal running in background state and the executing
      * operations state. */
     @UnsupportedAppUsage
-    public static final int PROCESS_STATE_SERVICE = 9;
+    public static final int PROCESS_STATE_SERVICE = 10;
 
     /** @hide Process is in the background running a receiver.   Note that from the
      * perspective of oom_adj, receivers run at a higher foreground level, but for our
      * prioritization here that is not necessary and putting them below services means
      * many fewer changes in some process states as they receive broadcasts. */
     @UnsupportedAppUsage
-    public static final int PROCESS_STATE_RECEIVER = 10;
+    public static final int PROCESS_STATE_RECEIVER = 11;
 
     /** @hide Same as {@link #PROCESS_STATE_TOP} but while device is sleeping. */
-    public static final int PROCESS_STATE_TOP_SLEEPING = 11;
+    public static final int PROCESS_STATE_TOP_SLEEPING = 12;
 
     /** @hide Process is in the background, but it can't restore its state so we want
      * to try to avoid killing it. */
-    public static final int PROCESS_STATE_HEAVY_WEIGHT = 12;
+    public static final int PROCESS_STATE_HEAVY_WEIGHT = 13;
 
     /** @hide Process is in the background but hosts the home activity. */
     @UnsupportedAppUsage
-    public static final int PROCESS_STATE_HOME = 13;
+    public static final int PROCESS_STATE_HOME = 14;
 
     /** @hide Process is in the background but hosts the last shown activity. */
-    public static final int PROCESS_STATE_LAST_ACTIVITY = 14;
+    public static final int PROCESS_STATE_LAST_ACTIVITY = 15;
 
     /** @hide Process is being cached for later use and contains activities. */
     @UnsupportedAppUsage
-    public static final int PROCESS_STATE_CACHED_ACTIVITY = 15;
+    public static final int PROCESS_STATE_CACHED_ACTIVITY = 16;
 
     /** @hide Process is being cached for later use and is a client of another cached
      * process that contains activities. */
-    public static final int PROCESS_STATE_CACHED_ACTIVITY_CLIENT = 16;
+    public static final int PROCESS_STATE_CACHED_ACTIVITY_CLIENT = 17;
 
     /** @hide Process is being cached for later use and has an activity that corresponds
      * to an existing recent task. */
-    public static final int PROCESS_STATE_CACHED_RECENT = 17;
+    public static final int PROCESS_STATE_CACHED_RECENT = 18;
 
     /** @hide Process is being cached for later use and is empty. */
-    public static final int PROCESS_STATE_CACHED_EMPTY = 18;
+    public static final int PROCESS_STATE_CACHED_EMPTY = 19;
 
     /** @hide Process does not exist. */
-    public static final int PROCESS_STATE_NONEXISTENT = 19;
+    public static final int PROCESS_STATE_NONEXISTENT = 20;
 
     // NOTE: If PROCESS_STATEs are added, then new fields must be added
     // to frameworks/base/core/proto/android/app/enums.proto and the following method must
@@ -594,6 +598,7 @@
                 return AppProtoEnums.PROCESS_STATE_PERSISTENT_UI;
             case PROCESS_STATE_TOP:
                 return AppProtoEnums.PROCESS_STATE_TOP;
+            case PROCESS_STATE_FOREGROUND_SERVICE_LOCATION:
             case PROCESS_STATE_FOREGROUND_SERVICE:
                 return AppProtoEnums.PROCESS_STATE_FOREGROUND_SERVICE;
             case PROCESS_STATE_BOUND_FOREGROUND_SERVICE:
@@ -646,6 +651,12 @@
         return procState >= PROCESS_STATE_TRANSIENT_BACKGROUND;
     }
 
+    /** @hide Is this a foreground service type? */
+    public static boolean isForegroundService(int procState) {
+        return procState == PROCESS_STATE_FOREGROUND_SERVICE_LOCATION
+                || procState == PROCESS_STATE_FOREGROUND_SERVICE;
+    }
+
     /** @hide requestType for assist context: only basic information. */
     public static final int ASSIST_CONTEXT_BASIC = 0;
 
@@ -1767,6 +1778,10 @@
         private final int mSystemUiVisibility;
         private final boolean mIsTranslucent;
 
+        // TODO(b/116112787) TaskSnapshot must also book keep the color space from hardware bitmap
+        // when created.
+        private final ColorSpace mColorSpace = ColorSpace.get(ColorSpace.Named.SRGB);
+
         public TaskSnapshot(@NonNull ComponentName topActivityComponent, GraphicBuffer snapshot,
                 int orientation, Rect contentInsets, boolean reducedResolution, float scale,
                 boolean isRealSnapshot, int windowingMode, int systemUiVisibility,
@@ -1812,6 +1827,13 @@
         }
 
         /**
+         * @return The color space of graphic buffer representing the screenshot.
+         */
+        public ColorSpace getColorSpace() {
+            return mColorSpace;
+        }
+
+        /**
          * @return The screen orientation the screenshot was taken in.
          */
         @UnsupportedAppUsage
@@ -2874,7 +2896,7 @@
                 return IMPORTANCE_PERCEPTIBLE;
             } else if (procState >= PROCESS_STATE_IMPORTANT_FOREGROUND) {
                 return IMPORTANCE_VISIBLE;
-            } else if (procState >= PROCESS_STATE_FOREGROUND_SERVICE) {
+            } else if (procState >= PROCESS_STATE_FOREGROUND_SERVICE_LOCATION) {
                 return IMPORTANCE_FOREGROUND_SERVICE;
             } else {
                 return IMPORTANCE_FOREGROUND;
@@ -2936,6 +2958,7 @@
                 return PROCESS_STATE_IMPORTANT_FOREGROUND;
             } else if (importance >= IMPORTANCE_FOREGROUND_SERVICE) {
                 return PROCESS_STATE_FOREGROUND_SERVICE;
+                // TODO: Asymmetrical mapping for LOCATION service type. Ok?
             } else {
                 return PROCESS_STATE_TOP;
             }
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java
index 86e658d..69c450c 100644
--- a/core/java/android/app/ActivityManagerInternal.java
+++ b/core/java/android/app/ActivityManagerInternal.java
@@ -23,6 +23,7 @@
 import android.content.IIntentSender;
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
+import android.content.pm.ActivityPresentationInfo;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.UserInfo;
 import android.os.Bundle;
@@ -247,6 +248,9 @@
     /** Gets the task id for a given activity. */
     public abstract int getTaskIdForActivity(@NonNull IBinder token, boolean onlyRoot);
 
+    /** Gets the basic info for a given activity. */
+    public abstract ActivityPresentationInfo getActivityPresentationInfo(@NonNull IBinder token);
+
     public abstract void setBooting(boolean booting);
     public abstract boolean isBooting();
     public abstract void setBooted(boolean booted);
diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java
index 94b42ff..e2d868f 100644
--- a/core/java/android/app/ActivityOptions.java
+++ b/core/java/android/app/ActivityOptions.java
@@ -33,6 +33,7 @@
 import android.graphics.Bitmap.Config;
 import android.graphics.GraphicBuffer;
 import android.graphics.Rect;
+import android.hardware.HardwareBuffer;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.IRemoteCallback;
@@ -916,7 +917,8 @@
                 // Unpackage the GraphicBuffer from the parceled thumbnail
                 final GraphicBuffer buffer = opts.getParcelable(KEY_ANIM_THUMBNAIL);
                 if (buffer != null) {
-                    mThumbnail = Bitmap.createHardwareBitmap(buffer);
+                    mThumbnail = Bitmap.wrapHardwareBuffer(
+                            HardwareBuffer.createFromGraphicBuffer(buffer), null);
                 }
                 mStartX = opts.getInt(KEY_ANIM_START_X, 0);
                 mStartY = opts.getInt(KEY_ANIM_START_Y, 0);
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 03a09ee..21d66e5 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -129,6 +129,7 @@
 import android.util.Pair;
 import android.util.PrintWriterPrinter;
 import android.util.Slog;
+import android.util.SparseArray;
 import android.util.SparseIntArray;
 import android.util.SuperNotCalledException;
 import android.util.proto.ProtoOutputStream;
@@ -177,7 +178,6 @@
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.lang.ref.WeakReference;
-import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.net.InetAddress;
 import java.text.DateFormat;
@@ -306,8 +306,14 @@
     @UnsupportedAppUsage
     final ArrayList<Application> mAllApplications
             = new ArrayList<Application>();
-    // set of instantiated backup agents, keyed by package name
-    final ArrayMap<String, BackupAgent> mBackupAgents = new ArrayMap<String, BackupAgent>();
+    /**
+     * Bookkeeping of instantiated backup agents indexed first by user id, then by package name.
+     * Indexing by user id supports parallel backups across users on system packages as they run in
+     * the same process with the same package name. Indexing by package name supports multiple
+     * distinct applications running in the same process.
+     */
+    private final SparseArray<ArrayMap<String, BackupAgent>> mBackupAgentsByUser =
+            new SparseArray<>();
     /** Reference to singleton {@link ActivityThread} */
     @UnsupportedAppUsage
     private static volatile ActivityThread sCurrentActivityThread;
@@ -660,10 +666,11 @@
         ApplicationInfo appInfo;
         CompatibilityInfo compatInfo;
         int backupMode;
+        int userId;
         public String toString() {
             return "CreateBackupAgentData{appInfo=" + appInfo
                     + " backupAgent=" + appInfo.backupAgentName
-                    + " mode=" + backupMode + "}";
+                    + " mode=" + backupMode + " userId=" + userId + "}";
         }
     }
 
@@ -878,20 +885,22 @@
         }
 
         public final void scheduleCreateBackupAgent(ApplicationInfo app,
-                CompatibilityInfo compatInfo, int backupMode) {
+                CompatibilityInfo compatInfo, int backupMode, int userId) {
             CreateBackupAgentData d = new CreateBackupAgentData();
             d.appInfo = app;
             d.compatInfo = compatInfo;
             d.backupMode = backupMode;
+            d.userId = userId;
 
             sendMessage(H.CREATE_BACKUP_AGENT, d);
         }
 
         public final void scheduleDestroyBackupAgent(ApplicationInfo app,
-                CompatibilityInfo compatInfo) {
+                CompatibilityInfo compatInfo, int userId) {
             CreateBackupAgentData d = new CreateBackupAgentData();
             d.appInfo = app;
             d.compatInfo = compatInfo;
+            d.userId = userId;
 
             sendMessage(H.DESTROY_BACKUP_AGENT, d);
         }
@@ -3617,7 +3626,8 @@
 
         try {
             IBinder binder = null;
-            BackupAgent agent = mBackupAgents.get(packageName);
+            ArrayMap<String, BackupAgent> backupAgents = getBackupAgentsForUser(data.userId);
+            BackupAgent agent = backupAgents.get(packageName);
             if (agent != null) {
                 // reusing the existing instance
                 if (DEBUG_BACKUP) {
@@ -3636,9 +3646,9 @@
                     context.setOuterContext(agent);
                     agent.attach(context);
 
-                    agent.onCreate();
+                    agent.onCreate(UserHandle.of(data.userId));
                     binder = agent.onBind();
-                    mBackupAgents.put(packageName, agent);
+                    backupAgents.put(packageName, agent);
                 } catch (Exception e) {
                     // If this is during restore, fail silently; otherwise go
                     // ahead and let the user see the crash.
@@ -3654,7 +3664,7 @@
 
             // tell the OS that we're live now
             try {
-                ActivityManager.getService().backupAgentCreated(packageName, binder);
+                ActivityManager.getService().backupAgentCreated(packageName, binder, data.userId);
             } catch (RemoteException e) {
                 throw e.rethrowFromSystemServer();
             }
@@ -3670,7 +3680,8 @@
 
         LoadedApk packageInfo = getPackageInfoNoCheck(data.appInfo, data.compatInfo);
         String packageName = packageInfo.mPackageName;
-        BackupAgent agent = mBackupAgents.get(packageName);
+        ArrayMap<String, BackupAgent> backupAgents = getBackupAgentsForUser(data.userId);
+        BackupAgent agent = backupAgents.get(packageName);
         if (agent != null) {
             try {
                 agent.onDestroy();
@@ -3678,12 +3689,21 @@
                 Slog.w(TAG, "Exception thrown in onDestroy by backup agent of " + data.appInfo);
                 e.printStackTrace();
             }
-            mBackupAgents.remove(packageName);
+            backupAgents.remove(packageName);
         } else {
             Slog.w(TAG, "Attempt to destroy unknown backup agent " + data);
         }
     }
 
+    private ArrayMap<String, BackupAgent> getBackupAgentsForUser(int userId) {
+        ArrayMap<String, BackupAgent> backupAgents = mBackupAgentsByUser.get(userId);
+        if (backupAgents == null) {
+            backupAgents = new ArrayMap<>();
+            mBackupAgentsByUser.put(userId, backupAgents);
+        }
+        return backupAgents;
+    }
+
     @UnsupportedAppUsage
     private void handleCreateService(CreateServiceData data) {
         // If we are getting ready to gc after going to the background, well
@@ -5936,18 +5956,6 @@
         StrictMode.initThreadDefaults(data.appInfo);
         StrictMode.initVmDefaults(data.appInfo);
 
-        // We deprecated Build.SERIAL and only apps that target pre NMR1
-        // SDK can see it. Since access to the serial is now behind a
-        // permission we push down the value and here we fix it up
-        // before any app code has been loaded.
-        try {
-            Field field = Build.class.getDeclaredField("SERIAL");
-            field.setAccessible(true);
-            field.set(Build.class, data.buildSerial);
-        } catch (NoSuchFieldException | IllegalAccessException e) {
-            /* ignore */
-        }
-
         if (data.debugMode != ApplicationThreadConstants.DEBUG_OFF) {
             // XXX should have option to change the port.
             Debug.changeDebugPort(8100);
@@ -6083,7 +6091,12 @@
             instrApp.initForUser(UserHandle.myUserId());
             final LoadedApk pi = getPackageInfo(instrApp, data.compatInfo,
                     appContext.getClassLoader(), false, true, false);
-            final ContextImpl instrContext = ContextImpl.createAppContext(this, pi);
+
+            // The test context's op package name == the target app's op package name, because
+            // the app ops manager checks the op package name against the real calling UID,
+            // which is what the target package name is associated with.
+            final ContextImpl instrContext = ContextImpl.createAppContext(this, pi,
+                    appContext.getOpPackageName());
 
             try {
                 final ClassLoader cl = instrContext.getClassLoader();
diff --git a/core/java/android/app/ActivityTransitionState.java b/core/java/android/app/ActivityTransitionState.java
index 3201feb..3a95839 100644
--- a/core/java/android/app/ActivityTransitionState.java
+++ b/core/java/android/app/ActivityTransitionState.java
@@ -258,10 +258,10 @@
         }
     }
 
-    public void onResume(Activity activity, boolean isTopOfTask) {
+    public void onResume(Activity activity) {
         // After orientation change, the onResume can come in before the top Activity has
         // left, so if the Activity is not top, wait a second for the top Activity to exit.
-        if (isTopOfTask || mEnterTransitionCoordinator == null) {
+        if (mEnterTransitionCoordinator == null || activity.isTopOfTask()) {
             restoreExitedViews();
             restoreReenteringViews();
         } else {
diff --git a/core/java/android/app/ActivityView.java b/core/java/android/app/ActivityView.java
index 4739867..5814e69 100644
--- a/core/java/android/app/ActivityView.java
+++ b/core/java/android/app/ActivityView.java
@@ -28,15 +28,12 @@
 import android.content.Intent;
 import android.hardware.display.DisplayManager;
 import android.hardware.display.VirtualDisplay;
-import android.hardware.input.InputManager;
 import android.os.RemoteException;
 import android.os.UserHandle;
 import android.util.AttributeSet;
 import android.util.DisplayMetrics;
 import android.util.Log;
 import android.view.IWindowManager;
-import android.view.InputDevice;
-import android.view.MotionEvent;
 import android.view.SurfaceControl;
 import android.view.SurfaceHolder;
 import android.view.SurfaceSession;
@@ -51,9 +48,7 @@
 import java.util.List;
 
 /**
- * Activity container that allows launching activities into itself and does input forwarding.
- * <p>Creation of this view is only allowed to callers who have
- * {@link android.Manifest.permission#INJECT_EVENTS} permission.
+ * Activity container that allows launching activities into itself.
  * <p>Activity launching into this container is restricted by the same rules that apply to launching
  * on VirtualDisplays.
  * @hide
@@ -76,9 +71,8 @@
     private StateCallback mActivityViewCallback;
 
     private IActivityTaskManager mActivityTaskManager;
-    private IInputForwarder mInputForwarder;
-    // Temp container to store view coordinates on screen.
-    private final int[] mLocationOnScreen = new int[2];
+    // Temp container to store view coordinates in window.
+    private final int[] mLocationInWindow = new int[2];
 
     private TaskStackListener mTaskStackListener;
 
@@ -280,7 +274,7 @@
     }
 
     /**
-     * Triggers an update of {@link ActivityView}'s location on screen to properly set touch exclude
+     * Triggers an update of {@link ActivityView}'s location in window to properly set touch exclude
      * regions and avoid focus switches by touches on this view.
      */
     public void onLocationChanged() {
@@ -295,45 +289,14 @@
     /** Send current location and size to the WM to set tap exclude region for this view. */
     private void updateLocation() {
         try {
-            getLocationOnScreen(mLocationOnScreen);
+            getLocationInWindow(mLocationInWindow);
             WindowManagerGlobal.getWindowSession().updateTapExcludeRegion(getWindow(), hashCode(),
-                    mLocationOnScreen[0], mLocationOnScreen[1], getWidth(), getHeight());
+                    mLocationInWindow[0], mLocationInWindow[1], getWidth(), getHeight());
         } catch (RemoteException e) {
             e.rethrowAsRuntimeException();
         }
     }
 
-    @Override
-    public boolean onTouchEvent(MotionEvent event) {
-        return injectInputEvent(event) || super.onTouchEvent(event);
-    }
-
-    @Override
-    public boolean onGenericMotionEvent(MotionEvent event) {
-        if (event.isFromSource(InputDevice.SOURCE_CLASS_POINTER)) {
-            if (injectInputEvent(event)) {
-                return true;
-            }
-        }
-        return super.onGenericMotionEvent(event);
-    }
-
-    private boolean injectInputEvent(MotionEvent event) {
-        if (mInputForwarder != null) {
-            try {
-                // The touch event that the ActivityView gets is in View space, but the event needs
-                // to get forwarded in screen space. This offsets the touch event by the location
-                // the ActivityView is on screen and sends it to the input forwarder.
-                getLocationOnScreen(mLocationOnScreen);
-                event.offsetLocation(mLocationOnScreen[0], mLocationOnScreen[1]);
-                return mInputForwarder.forwardEvent(event);
-            } catch (RemoteException e) {
-                e.rethrowAsRuntimeException();
-            }
-        }
-        return false;
-    }
-
     private class SurfaceCallback implements SurfaceHolder.Callback {
         @Override
         public void surfaceCreated(SurfaceHolder surfaceHolder) {
@@ -416,7 +379,6 @@
         }
 
         mTmpTransaction.show(mRootSurfaceControl).apply();
-        mInputForwarder = InputManager.getInstance().createInputForwarder(displayId);
         mTaskStackListener = new TaskStackListenerImpl();
         try {
             mActivityTaskManager.registerTaskStackListener(mTaskStackListener);
@@ -432,9 +394,6 @@
 
         mSurfaceView.getHolder().removeCallback(mSurfaceCallback);
 
-        if (mInputForwarder != null) {
-            mInputForwarder = null;
-        }
         cleanTapExcludeRegion();
 
         if (mTaskStackListener != null) {
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index 364d3c9..9ee2f03 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -218,6 +218,7 @@
     @IntDef(flag = true, prefix = { "UID_STATE_" }, value = {
             UID_STATE_PERSISTENT,
             UID_STATE_TOP,
+            UID_STATE_FOREGROUND_SERVICE_LOCATION,
             UID_STATE_FOREGROUND_SERVICE,
             UID_STATE_FOREGROUND,
             UID_STATE_BACKGROUND,
@@ -248,18 +249,26 @@
     public static final int UID_STATE_TOP = 1;
 
     /**
+     * Metrics about an op when its uid is running a foreground service with location type.
+     * @hide
+     */
+    @TestApi
+    @SystemApi
+    public static final int UID_STATE_FOREGROUND_SERVICE_LOCATION = 2;
+
+    /**
      * Metrics about an op when its uid is running a foreground service.
      * @hide
      */
     @TestApi
     @SystemApi
-    public static final int UID_STATE_FOREGROUND_SERVICE = 2;
+    public static final int UID_STATE_FOREGROUND_SERVICE = 3;
 
     /**
      * Last UID state in which we don't restrict what an op can do.
      * @hide
      */
-    public static final int UID_STATE_LAST_NON_RESTRICTED = UID_STATE_FOREGROUND_SERVICE;
+    public static final int UID_STATE_LAST_NON_RESTRICTED = UID_STATE_FOREGROUND_SERVICE_LOCATION;
 
     /**
      * Metrics about an op when its uid is in the foreground for any other reasons.
@@ -267,7 +276,7 @@
      */
     @TestApi
     @SystemApi
-    public static final int UID_STATE_FOREGROUND = 3;
+    public static final int UID_STATE_FOREGROUND = 4;
 
     /**
      * Metrics about an op when its uid is in the background for any reason.
@@ -275,7 +284,7 @@
      */
     @TestApi
     @SystemApi
-    public static final int UID_STATE_BACKGROUND = 4;
+    public static final int UID_STATE_BACKGROUND = 5;
 
     /**
      * Metrics about an op when its uid is cached.
@@ -283,13 +292,13 @@
      */
     @TestApi
     @SystemApi
-    public static final int UID_STATE_CACHED = 5;
+    public static final int UID_STATE_CACHED = 6;
 
     /**
      * Number of uid states we track.
      * @hide
      */
-    public static final int _NUM_UID_STATE = 6;
+    public static final int _NUM_UID_STATE = 7;
 
     // when adding one of these:
     //  - increment _NUM_OP
@@ -555,9 +564,11 @@
     public static final int OP_WRITE_MEDIA_IMAGES = 86;
     /** @hide Has a legacy (non-isolated) view of storage. */
     public static final int OP_LEGACY_STORAGE = 87;
+    /** @hide Accessing accessibility features */
+    public static final int OP_ACCESS_ACCESSIBILITY = 88;
     /** @hide */
     @UnsupportedAppUsage
-    public static final int _NUM_OP = 88;
+    public static final int _NUM_OP = 89;
 
     /** Access to coarse location information. */
     public static final String OPSTR_COARSE_LOCATION = "android:coarse_location";
@@ -826,6 +837,8 @@
     public static final String OPSTR_WRITE_MEDIA_IMAGES = "android:write_media_images";
     /** @hide Has a legacy (non-isolated) view of storage. */
     public static final String OPSTR_LEGACY_STORAGE = "android:legacy_storage";
+    /** @hide Interact with accessibility. */
+    public static final String OPSTR_ACCESS_ACCESSIBILITY = "android:access_accessibility";
 
     // Warning: If an permission is added here it also has to be added to
     // com.android.packageinstaller.permission.utils.EventLogger
@@ -985,6 +998,7 @@
             OP_READ_MEDIA_IMAGES,               // READ_MEDIA_IMAGES
             OP_WRITE_MEDIA_IMAGES,              // WRITE_MEDIA_IMAGES
             OP_LEGACY_STORAGE,                  // LEGACY_STORAGE
+            OP_ACCESS_ACCESSIBILITY,            // ACCESS_ACCESSIBILITY
     };
 
     /**
@@ -1079,6 +1093,7 @@
             OPSTR_READ_MEDIA_IMAGES,
             OPSTR_WRITE_MEDIA_IMAGES,
             OPSTR_LEGACY_STORAGE,
+            OPSTR_ACCESS_ACCESSIBILITY,
     };
 
     /**
@@ -1174,6 +1189,7 @@
             "READ_MEDIA_IMAGES",
             "WRITE_MEDIA_IMAGES",
             "LEGACY_STORAGE",
+            "ACCESS_ACCESSIBILITY",
     };
 
     /**
@@ -1270,6 +1286,7 @@
             Manifest.permission.READ_MEDIA_IMAGES,
             null, // no permission for OP_WRITE_MEDIA_IMAGES
             null, // no permission for OP_LEGACY_STORAGE
+            null, // no permission for OP_ACCESS_ACCESSIBILITY
     };
 
     /**
@@ -1366,6 +1383,7 @@
             null, // READ_MEDIA_IMAGES
             null, // WRITE_MEDIA_IMAGES
             null, // LEGACY_STORAGE
+            null, // ACCESS_ACCESSIBILITY
     };
 
     /**
@@ -1461,6 +1479,7 @@
             false, // READ_MEDIA_IMAGES
             false, // WRITE_MEDIA_IMAGES
             false, // LEGACY_STORAGE
+            false, // ACCESS_ACCESSIBILITY
     };
 
     /**
@@ -1555,6 +1574,7 @@
             AppOpsManager.MODE_ALLOWED, // READ_MEDIA_IMAGES
             AppOpsManager.MODE_ERRORED, // WRITE_MEDIA_IMAGES
             AppOpsManager.MODE_DEFAULT, // LEGACY_STORAGE
+            AppOpsManager.MODE_ALLOWED, // ACCESS_ACCESSIBILITY
     };
 
     /**
@@ -1653,6 +1673,7 @@
             false, // READ_MEDIA_IMAGES
             false, // WRITE_MEDIA_IMAGES
             false, // LEGACY_STORAGE
+            false, // ACCESS_ACCESSIBILITY
     };
 
     /**
@@ -3258,6 +3279,7 @@
          *
          * @param uidState The UID state for which to query. Could be one of
          * {@link #UID_STATE_PERSISTENT}, {@link #UID_STATE_TOP},
+         * {@link #UID_STATE_FOREGROUND_SERVICE_LOCATION},
          * {@link #UID_STATE_FOREGROUND_SERVICE}, {@link #UID_STATE_FOREGROUND},
          * {@link #UID_STATE_BACKGROUND}, {@link #UID_STATE_CACHED}.
          *
@@ -3308,6 +3330,7 @@
          *
          * @param uidState The UID state for which to query. Could be one of
          * {@link #UID_STATE_PERSISTENT}, {@link #UID_STATE_TOP},
+         * {@link #UID_STATE_FOREGROUND_SERVICE_LOCATION},
          * {@link #UID_STATE_FOREGROUND_SERVICE}, {@link #UID_STATE_FOREGROUND},
          * {@link #UID_STATE_BACKGROUND}, {@link #UID_STATE_CACHED}.
          *
@@ -3358,6 +3381,7 @@
          *
          * @param uidState The UID state for which to query. Could be one of
          * {@link #UID_STATE_PERSISTENT}, {@link #UID_STATE_TOP},
+         * {@link #UID_STATE_FOREGROUND_SERVICE_LOCATION},
          * {@link #UID_STATE_FOREGROUND_SERVICE}, {@link #UID_STATE_FOREGROUND},
          * {@link #UID_STATE_BACKGROUND}, {@link #UID_STATE_CACHED}.
          *
@@ -4775,6 +4799,9 @@
             case UID_STATE_TOP: {
                 return "UID_STATE_TOP";
             }
+            case UID_STATE_FOREGROUND_SERVICE_LOCATION: {
+                return "UID_STATE_FOREGROUND_SERVICE_LOCATION";
+            }
             case UID_STATE_FOREGROUND_SERVICE: {
                 return "UID_STATE_FOREGROUND_SERVICE";
             }
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index 9bcb36f..98032dc 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -3017,6 +3017,33 @@
     }
 
     @Override
+    public String getAppPredictionServicePackageName() {
+        try {
+            return mPM.getAppPredictionServicePackageName();
+        } catch (RemoteException e) {
+            throw e.rethrowAsRuntimeException();
+        }
+    }
+
+    @Override
+    public String getContentCaptureServicePackageName() {
+        try {
+            return mPM.getContentCaptureServicePackageName();
+        } catch (RemoteException e) {
+            throw e.rethrowAsRuntimeException();
+        }
+    }
+
+    @Override
+    public String getIncidentReportApproverPackageName() {
+        try {
+            return mPM.getIncidentReportApproverPackageName();
+        } catch (RemoteException e) {
+            throw e.rethrowAsRuntimeException();
+        }
+    }
+
+    @Override
     public boolean isPackageStateProtected(String packageName, int userId) {
         try {
             return mPM.isPackageStateProtected(packageName, userId);
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 92cdb20..1a728c1 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -2128,7 +2128,7 @@
                 flags | CONTEXT_REGISTER_PACKAGE);
         if (pi != null) {
             ContextImpl c = new ContextImpl(this, mMainThread, pi, null, mActivityToken,
-                    new UserHandle(UserHandle.getUserId(application.uid)), flags, null);
+                    new UserHandle(UserHandle.getUserId(application.uid)), flags, null, null);
 
             final int displayId = getDisplayId();
 
@@ -2156,14 +2156,14 @@
             // The system resources are loaded in every application, so we can safely copy
             // the context without reloading Resources.
             return new ContextImpl(this, mMainThread, mPackageInfo, null, mActivityToken, user,
-                    flags, null);
+                    flags, null, null);
         }
 
         LoadedApk pi = mMainThread.getPackageInfo(packageName, mResources.getCompatibilityInfo(),
                 flags | CONTEXT_REGISTER_PACKAGE, user.getIdentifier());
         if (pi != null) {
             ContextImpl c = new ContextImpl(this, mMainThread, pi, null, mActivityToken, user,
-                    flags, null);
+                    flags, null, null);
 
             final int displayId = getDisplayId();
 
@@ -2190,7 +2190,7 @@
         final String[] paths = mPackageInfo.getSplitPaths(splitName);
 
         final ContextImpl context = new ContextImpl(this, mMainThread, mPackageInfo, splitName,
-                mActivityToken, mUser, mFlags, classLoader);
+                mActivityToken, mUser, mFlags, classLoader, null);
 
         final int displayId = getDisplayId();
 
@@ -2214,7 +2214,7 @@
         }
 
         ContextImpl context = new ContextImpl(this, mMainThread, mPackageInfo, mSplitName,
-                mActivityToken, mUser, mFlags, mClassLoader);
+                mActivityToken, mUser, mFlags, mClassLoader, null);
 
         final int displayId = getDisplayId();
         context.setResources(createResources(mActivityToken, mPackageInfo, mSplitName, displayId,
@@ -2229,7 +2229,7 @@
         }
 
         ContextImpl context = new ContextImpl(this, mMainThread, mPackageInfo, mSplitName,
-                mActivityToken, mUser, mFlags, mClassLoader);
+                mActivityToken, mUser, mFlags, mClassLoader, null);
 
         final int displayId = display.getDisplayId();
         context.setResources(createResources(mActivityToken, mPackageInfo, mSplitName, displayId,
@@ -2243,7 +2243,7 @@
         final int flags = (mFlags & ~Context.CONTEXT_CREDENTIAL_PROTECTED_STORAGE)
                 | Context.CONTEXT_DEVICE_PROTECTED_STORAGE;
         return new ContextImpl(this, mMainThread, mPackageInfo, mSplitName, mActivityToken, mUser,
-                flags, mClassLoader);
+                flags, mClassLoader, null);
     }
 
     @Override
@@ -2251,7 +2251,7 @@
         final int flags = (mFlags & ~Context.CONTEXT_DEVICE_PROTECTED_STORAGE)
                 | Context.CONTEXT_CREDENTIAL_PROTECTED_STORAGE;
         return new ContextImpl(this, mMainThread, mPackageInfo, mSplitName, mActivityToken, mUser,
-                flags, mClassLoader);
+                flags, mClassLoader, null);
     }
 
     @Override
@@ -2397,7 +2397,7 @@
     static ContextImpl createSystemContext(ActivityThread mainThread) {
         LoadedApk packageInfo = new LoadedApk(mainThread);
         ContextImpl context = new ContextImpl(null, mainThread, packageInfo, null, null, null, 0,
-                null);
+                null, null);
         context.setResources(packageInfo.getResources());
         context.mResources.updateConfiguration(context.mResourcesManager.getConfiguration(),
                 context.mResourcesManager.getDisplayMetrics());
@@ -2414,7 +2414,7 @@
     static ContextImpl createSystemUiContext(ContextImpl systemContext, int displayId) {
         final LoadedApk packageInfo = systemContext.mPackageInfo;
         ContextImpl context = new ContextImpl(null, systemContext.mMainThread, packageInfo, null,
-                null, null, 0, null);
+                null, null, 0, null, null);
         context.setResources(createResources(null, packageInfo, null, displayId, null,
                 packageInfo.getCompatibilityInfo()));
         context.updateDisplay(displayId);
@@ -2431,9 +2431,14 @@
 
     @UnsupportedAppUsage
     static ContextImpl createAppContext(ActivityThread mainThread, LoadedApk packageInfo) {
+        return createAppContext(mainThread, packageInfo, null);
+    }
+
+    static ContextImpl createAppContext(ActivityThread mainThread, LoadedApk packageInfo,
+            String opPackageName) {
         if (packageInfo == null) throw new IllegalArgumentException("packageInfo");
         ContextImpl context = new ContextImpl(null, mainThread, packageInfo, null, null, null, 0,
-                null);
+                null, opPackageName);
         context.setResources(packageInfo.getResources());
         return context;
     }
@@ -2461,7 +2466,7 @@
         }
 
         ContextImpl context = new ContextImpl(null, mainThread, packageInfo, activityInfo.splitName,
-                activityToken, null, 0, classLoader);
+                activityToken, null, 0, classLoader, null);
 
         // Clamp display ID to DEFAULT_DISPLAY if it is INVALID_DISPLAY.
         displayId = (displayId != Display.INVALID_DISPLAY) ? displayId : Display.DEFAULT_DISPLAY;
@@ -2491,7 +2496,7 @@
     private ContextImpl(@Nullable ContextImpl container, @NonNull ActivityThread mainThread,
             @NonNull LoadedApk packageInfo, @Nullable String splitName,
             @Nullable IBinder activityToken, @Nullable UserHandle user, int flags,
-            @Nullable ClassLoader classLoader) {
+            @Nullable ClassLoader classLoader, @Nullable String overrideOpPackageName) {
         mOuterContext = this;
 
         // If creator didn't specify which storage to use, use the default
@@ -2520,9 +2525,11 @@
         mClassLoader = classLoader;
         mResourcesManager = ResourcesManager.getInstance();
 
+        String opPackageName;
+
         if (container != null) {
             mBasePackageName = container.mBasePackageName;
-            mOpPackageName = container.mOpPackageName;
+            opPackageName = container.mOpPackageName;
             setResources(container.mResources);
             mDisplay = container.mDisplay;
         } else {
@@ -2533,12 +2540,14 @@
                 // processes.  For purposes of app ops, we must then consider the context as
                 // belonging to the package of this process, not the system itself, otherwise
                 // the package+uid verifications in app ops will fail.
-                mOpPackageName = ActivityThread.currentPackageName();
+                opPackageName = ActivityThread.currentPackageName();
             } else {
-                mOpPackageName = mBasePackageName;
+                opPackageName = mBasePackageName;
             }
         }
 
+        mOpPackageName = overrideOpPackageName != null ? overrideOpPackageName : opPackageName;
+
         mContentResolver = new ApplicationContentResolver(this, mainThread);
     }
 
diff --git a/core/java/android/app/DownloadManager.java b/core/java/android/app/DownloadManager.java
index 853b45e..fde1d29e 100644
--- a/core/java/android/app/DownloadManager.java
+++ b/core/java/android/app/DownloadManager.java
@@ -26,7 +26,6 @@
 import android.content.ContentUris;
 import android.content.ContentValues;
 import android.content.Context;
-import android.content.Intent;
 import android.database.Cursor;
 import android.database.CursorWrapper;
 import android.net.ConnectivityManager;
@@ -37,7 +36,6 @@
 import android.os.FileUtils;
 import android.os.ParcelFileDescriptor;
 import android.provider.Downloads;
-import android.provider.MediaStore.Images;
 import android.provider.Settings;
 import android.provider.Settings.SettingNotFoundException;
 import android.text.TextUtils;
@@ -399,14 +397,14 @@
         /** if a file is designated as a MediaScanner scannable file, the following value is
          * stored in the database column {@link Downloads.Impl#COLUMN_MEDIA_SCANNED}.
          */
-        private static final int SCANNABLE_VALUE_YES = 0;
+        private static final int SCANNABLE_VALUE_YES = Downloads.Impl.MEDIA_NOT_SCANNED;
         // value of 1 is stored in the above column by DownloadProvider after it is scanned by
         // MediaScanner
         /** if a file is designated as a file that should not be scanned by MediaScanner,
          * the following value is stored in the database column
          * {@link Downloads.Impl#COLUMN_MEDIA_SCANNED}.
          */
-        private static final int SCANNABLE_VALUE_NO = 2;
+        private static final int SCANNABLE_VALUE_NO = Downloads.Impl.MEDIA_NOT_SCANNABLE;
 
         /**
          * This download is visible but only shows in the notifications
@@ -1067,7 +1065,12 @@
      * COLUMN_* constants.
      */
     public Cursor query(Query query) {
-        Cursor underlyingCursor = query.runQuery(mResolver, UNDERLYING_COLUMNS, mBaseUri);
+        return query(query, UNDERLYING_COLUMNS);
+    }
+
+    /** @hide */
+    public Cursor query(Query query, String[] projection) {
+        Cursor underlyingCursor = query.runQuery(mResolver, projection, mBaseUri);
         if (underlyingCursor == null) {
             return null;
         }
@@ -1259,19 +1262,6 @@
             throw new IllegalStateException("Failed to rename to " + after);
         }
 
-        // Update MediaProvider if necessary
-        if (mimeType.startsWith("image/")) {
-            context.getContentResolver().delete(Images.Media.EXTERNAL_CONTENT_URI,
-                    Images.Media.DATA + "=?",
-                    new String[] {
-                            before.getAbsolutePath()
-                    });
-
-            Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
-            intent.setData(Uri.fromFile(after));
-            context.sendBroadcast(intent);
-        }
-
         ContentValues values = new ContentValues();
         values.put(Downloads.Impl.COLUMN_TITLE, displayName);
         values.put(Downloads.Impl._DATA, after.toString());
@@ -1324,8 +1314,7 @@
      * @param description the description that would appear for this file in Downloads App.
      * @param isMediaScannerScannable true if the file is to be scanned by MediaScanner. Files
      * scanned by MediaScanner appear in the applications used to view media (for example,
-     * Gallery app). Starting from {@link android.os.Build.VERSION_CODES#Q}, this argument is
-     * ignored and the file is always scanned by MediaScanner.
+     * Gallery app).
      * @param mimeType mimetype of the file.
      * @param path absolute pathname to the file. The file should be world-readable, so that it can
      * be managed by the Downloads App and any other app that is used to read it (for example,
@@ -1354,8 +1343,7 @@
      * @param description the description that would appear for this file in Downloads App.
      * @param isMediaScannerScannable true if the file is to be scanned by MediaScanner. Files
      * scanned by MediaScanner appear in the applications used to view media (for example,
-     * Gallery app). Starting from {@link android.os.Build.VERSION_CODES#Q}, this argument is
-     * ignored and the file is always scanned by MediaScanner.
+     * Gallery app).
      * @param mimeType mimetype of the file.
      * @param path absolute pathname to the file. The file should be world-readable, so that it can
      * be managed by the Downloads App and any other app that is used to read it (for example,
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index fb65da1..3aa9fa7 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -203,7 +203,7 @@
     void unbindFinished(in IBinder token, in Intent service, boolean doRebind);
     void setProcessImportant(in IBinder token, int pid, boolean isForeground, String reason);
     void setServiceForeground(in ComponentName className, in IBinder token,
-            int id, in Notification notification, int flags);
+            int id, in Notification notification, int flags, int foregroundServiceType);
     boolean moveActivityTaskToBack(in IBinder token, boolean nonRoot);
     void getMemoryInfo(out ActivityManager.MemoryInfo outInfo);
     List<ActivityManager.ProcessErrorStateInfo> getProcessesInErrorState();
@@ -221,8 +221,8 @@
     boolean shutdown(int timeout);
     void stopAppSwitches();
     void resumeAppSwitches();
-    boolean bindBackupAgent(in String packageName, int backupRestoreMode, int userId);
-    void backupAgentCreated(in String packageName, in IBinder agent);
+    boolean bindBackupAgent(in String packageName, int backupRestoreMode, int targetUserId);
+    void backupAgentCreated(in String packageName, in IBinder agent, int userId);
     void unbindBackupAgent(in ApplicationInfo appInfo);
     int getUidForIntentSender(in IIntentSender sender);
     int handleIncomingUser(int callingPid, int callingUid, int userId, boolean allowAll,
@@ -277,6 +277,7 @@
     void unstableProviderDied(in IBinder connection);
     boolean isIntentSenderAnActivity(in IIntentSender sender);
     boolean isIntentSenderAForegroundService(in IIntentSender sender);
+    boolean isIntentSenderABroadcast(in IIntentSender sender);
     int startActivityAsUser(in IApplicationThread caller, in String callingPackage,
             in Intent intent, in String resolvedType, in IBinder resultTo, in String resultWho,
             int requestCode, int flags, in ProfilerInfo profilerInfo,
diff --git a/core/java/android/app/IApplicationThread.aidl b/core/java/android/app/IApplicationThread.aidl
index c64fcf3..e7a8c0e 100644
--- a/core/java/android/app/IApplicationThread.aidl
+++ b/core/java/android/app/IApplicationThread.aidl
@@ -88,9 +88,9 @@
     void profilerControl(boolean start, in ProfilerInfo profilerInfo, int profileType);
     void setSchedulingGroup(int group);
     void scheduleCreateBackupAgent(in ApplicationInfo app, in CompatibilityInfo compatInfo,
-            int backupMode);
+            int backupMode, int userId);
     void scheduleDestroyBackupAgent(in ApplicationInfo app,
-            in CompatibilityInfo compatInfo);
+            in CompatibilityInfo compatInfo, int userId);
     void scheduleOnNewActivityOptions(IBinder token, in Bundle options);
     void scheduleSuicide();
     void dispatchPackageBroadcast(int cmd, in String[] packages);
diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl
index 199c133..df04a6b 100644
--- a/core/java/android/app/INotificationManager.aidl
+++ b/core/java/android/app/INotificationManager.aidl
@@ -65,9 +65,13 @@
     boolean areNotificationsEnabled(String pkg);
     int getPackageImportance(String pkg);
 
+    boolean shouldHideSilentStatusIcons(String callingPkg);
+    void setHideSilentStatusIcons(boolean hide);
+
     void setBubblesAllowed(String pkg, int uid, boolean allowed);
     boolean areBubblesAllowed(String pkg);
     boolean areBubblesAllowedForPackage(String pkg, int uid);
+    boolean hasUserApprovedBubblesForPackage(String pkg, int uid);
 
     void createNotificationChannelGroups(String pkg, in ParceledListSlice channelGroupList);
     void createNotificationChannels(String pkg, in ParceledListSlice channelsList);
@@ -94,6 +98,7 @@
     boolean areChannelsBypassingDnd();
     int getAppsBypassingDndCount(int uid);
     ParceledListSlice getNotificationChannelsBypassingDnd(String pkg, int userId);
+    boolean isPackagePaused(String pkg);
 
     // TODO: Remove this when callers have been migrated to the equivalent
     // INotificationListener method.
@@ -149,6 +154,8 @@
     void setNotificationAssistantAccessGrantedForUser(in ComponentName assistant, int userId, boolean enabled);
     List<String> getEnabledNotificationListenerPackages();
     List<ComponentName> getEnabledNotificationListeners(int userId);
+    ComponentName getAllowedNotificationAssistantForUser(int userId);
+    ComponentName getAllowedNotificationAssistant();
 
     int getZenMode();
     ZenModeConfig getZenModeConfig();
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 7c550d4..028e3ef 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -8122,6 +8122,10 @@
                     big.setViewVisibility(MEDIA_BUTTON_IDS[i], View.GONE);
                 }
             }
+            bindMediaActionButton(big, R.id.media_seamless, new Action(R.drawable.ic_media_seamless,
+                    mBuilder.mContext.getString(
+                            com.android.internal.R.string.ext_media_seamless_action), null), p);
+            big.setViewVisibility(R.id.media_seamless, View.GONE);
             handleImage(big);
             return big;
         }
diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java
index c4b4b40..8207e0a 100644
--- a/core/java/android/app/NotificationManager.java
+++ b/core/java/android/app/NotificationManager.java
@@ -20,6 +20,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.SdkConstant;
+import android.annotation.SystemApi;
 import android.annotation.SystemService;
 import android.annotation.TestApi;
 import android.annotation.UnsupportedAppUsage;
@@ -353,7 +354,8 @@
     public static final int IMPORTANCE_MIN = 1;
 
     /**
-     * Low notification importance: shows everywhere, but is not intrusive.
+     * Low notification importance: Shows in the shade, and potentially in the status bar
+     * (see {@link #shouldHideSilentStatusBarIcons()}), but is not audibly intrusive.
      */
     public static final int IMPORTANCE_LOW = 2;
 
@@ -826,6 +828,7 @@
     /**
      * @hide
      */
+    @TestApi
     public boolean matchesCallFilter(Bundle extras) {
         INotificationManager service = getService();
         try {
@@ -1094,6 +1097,22 @@
     }
 
     /**
+     * Returns whether notifications from this package are temporarily hidden. This
+     * could be done because the package was marked as distracting to the user via
+     * {@code PackageManager#setDistractingPackageRestrictions(String[], int)} or because the
+     * package is {@code PackageManager#setPackagesSuspended(String[], boolean, PersistableBundle,
+     * PersistableBundle, SuspendDialogInfo) suspended}.
+     */
+    public boolean areNotificationsPaused() {
+        INotificationManager service = getService();
+        try {
+            return service.isPackagePaused(mContext.getPackageName());
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
      * Checks the ability to modify notification do not disturb policy for the calling package.
      *
      * <p>
@@ -1137,6 +1156,19 @@
         }
     }
 
+    /**
+     * Checks whether the user has approved a given
+     * {@link android.service.notification.NotificationAssistantService}.
+     *
+     * <p>
+     * The assistant service must belong to the calling app.
+     *
+     * <p>
+     * Apps can request notification assistant access by sending the user to the activity that
+     * matches the system intent action
+     * TODO: STOPSHIP: Add correct intent
+     * {@link android.provider.Settings#ACTION_MANAGE_DEFAULT_APPS_SETTINGS}.
+     */
     public boolean isNotificationAssistantAccessGranted(ComponentName assistant) {
         INotificationManager service = getService();
         try {
@@ -1146,6 +1178,22 @@
         }
     }
 
+    /**
+     * Returns whether the user wants silent notifications (see {@link #IMPORTANCE_LOW} to appear
+     * in the status bar.
+     *
+     * <p>Only available for {@link #isNotificationListenerAccessGranted(ComponentName) notification
+     * listeners}.
+     */
+    public boolean shouldHideSilentStatusBarIcons() {
+        INotificationManager service = getService();
+        try {
+            return service.shouldHideSilentStatusIcons(mContext.getOpPackageName());
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
     /** @hide */
     public boolean isNotificationPolicyAccessGrantedForPackage(String pkg) {
         INotificationManager service = getService();
@@ -1232,6 +1280,45 @@
         }
     }
 
+    /**
+     * Grants/revokes Notification Assistant access to {@code assistant} for current user.
+     *
+     * @param assistant Name of component to grant/revoke access or {@code null} to revoke access to
+     *                  current assistant
+     * @param granted Grant/revoke access
+     * @hide
+     */
+    @SystemApi
+    public void setNotificationAssistantAccessGranted(ComponentName assistant, boolean granted) {
+        INotificationManager service = getService();
+        try {
+            service.setNotificationAssistantAccessGranted(assistant, granted);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * Grants/revokes Notification Assistant access to {@code assistant} for given user.
+     *
+     * @param assistant Name of component to grant/revoke access or {@code null} to revoke access to
+     *                  current assistant
+     * @param user handle to associate assistant with
+     * @param granted Grant/revoke access
+     * @hide
+     */
+    @SystemApi
+    public void setNotificationAssistantAccessGrantedForUser(ComponentName assistant,
+            UserHandle user, boolean granted) {
+        INotificationManager service = getService();
+        try {
+            service.setNotificationAssistantAccessGrantedForUser(assistant, user.getIdentifier(),
+                    granted);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
     /** @hide */
     public List<ComponentName> getEnabledNotificationListeners(int userId) {
         INotificationManager service = getService();
@@ -1242,6 +1329,29 @@
         }
     }
 
+    /** @hide */
+    @SystemApi
+    public @Nullable ComponentName getAllowedNotificationAssistantForUser(UserHandle user) {
+        INotificationManager service = getService();
+        try {
+            return service.getAllowedNotificationAssistantForUser(user.getIdentifier());
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /** @hide */
+    @SystemApi
+    public @Nullable ComponentName getAllowedNotificationAssistant() {
+        INotificationManager service = getService();
+        try {
+            return service.getAllowedNotificationAssistant();
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+
     private Context mContext;
 
     private static void checkRequired(String name, Object value) {
diff --git a/core/java/android/app/PendingIntent.java b/core/java/android/app/PendingIntent.java
index 75d95b2..55014eb 100644
--- a/core/java/android/app/PendingIntent.java
+++ b/core/java/android/app/PendingIntent.java
@@ -1113,6 +1113,19 @@
 
     /**
      * @hide
+     * Check whether this PendingIntent will launch an Activity.
+     */
+    public boolean isBroadcast() {
+        try {
+            return ActivityManager.getService()
+                .isIntentSenderABroadcast(mTarget);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * @hide
      * Return the Intent of this PendingIntent.
      */
     @UnsupportedAppUsage
diff --git a/core/java/android/app/Service.java b/core/java/android/app/Service.java
index 5fa8526..87bf5ed 100644
--- a/core/java/android/app/Service.java
+++ b/core/java/android/app/Service.java
@@ -16,7 +16,10 @@
 
 package android.app;
 
+import static android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_MANIFEST;
+
 import android.annotation.IntDef;
+import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.UnsupportedAppUsage;
 import android.content.ComponentCallbacks2;
@@ -685,12 +688,10 @@
      * the permission {@link android.Manifest.permission#FOREGROUND_SERVICE} in order to use
      * this API.</p>
      *
-     * <p>To use this API, apps targeting API {@link android.os.Build.VERSION_CODES#Q} or later must
-     * specify the foreground service type using attribute
-     * {@link android.R.attr#foregroundServiceType} in service element of manifest file, otherwise
-     * a SecurityException is thrown when this API is called. Apps targeting API older than
-     * {@link android.os.Build.VERSION_CODES#Q} do not need to specify the foreground service type
-     * </p>
+     * <p>Apps built with SDK version {@link android.os.Build.VERSION_CODES#Q} or later can specify
+     * the foreground service types using attribute {@link android.R.attr#foregroundServiceType} in
+     * service element of manifest file. The value of attribute
+     * {@link android.R.attr#foregroundServiceType} can be multiple flags ORed together.</p>
      *
      * @param id The identifier for this notification as per
      * {@link NotificationManager#notify(int, Notification)
@@ -703,7 +704,42 @@
         try {
             mActivityManager.setServiceForeground(
                     new ComponentName(this, mClassName), mToken, id,
-                    notification, 0);
+                    notification, 0, FOREGROUND_SERVICE_TYPE_MANIFEST);
+        } catch (RemoteException ex) {
+        }
+    }
+
+  /**
+   * An overloaded version of {@link #startForeground(int, Notification)} with additional
+   * foregroundServiceType parameter.
+   *
+   * <p>Apps built with SDK version {@link android.os.Build.VERSION_CODES#Q} or later can specify
+   * the foreground service types using attribute {@link android.R.attr#foregroundServiceType} in
+   * service element of manifest file. The value of attribute
+   * {@link android.R.attr#foregroundServiceType} can be multiple flags ORed together.</p>
+   *
+   * <p>The foregroundServiceType parameter must be a subset flags of what is specified in manifest
+   * attribute {@link android.R.attr#foregroundServiceType}, if not, an IllegalArgumentException is
+   * thrown. Specify foregroundServiceType parameter as
+   * {@link android.content.pm.ServiceInfo#FOREGROUND_SERVICE_TYPE_MANIFEST} to use all flags that
+   * is specified in manifest attribute foregroundServiceType.</p>
+   *
+   * @param id The identifier for this notification as per
+   * {@link NotificationManager#notify(int, Notification)
+   * NotificationManager.notify(int, Notification)}; must not be 0.
+   * @param notification The Notification to be displayed.
+   * @param foregroundServiceType must be a subset flags of manifest attribute
+   * {@link android.R.attr#foregroundServiceType} flags.
+   * @throws IllegalArgumentException if param foregroundServiceType is not subset of manifest
+   *     attribute {@link android.R.attr#foregroundServiceType}.
+   * @see {@link android.content.pm.ServiceInfo} for the set of FOREGROUND_SERVICE_TYPE flags.
+   */
+    public final void startForeground(int id, @NonNull Notification notification,
+            int foregroundServiceType) {
+        try {
+            mActivityManager.setServiceForeground(
+                    new ComponentName(this, mClassName), mToken, id,
+                    notification, 0, foregroundServiceType);
         } catch (RemoteException ex) {
         }
     }
@@ -731,7 +767,8 @@
     public final void stopForeground(@StopForegroundFlags int flags) {
         try {
             mActivityManager.setServiceForeground(
-                    new ComponentName(this, mClassName), mToken, 0, null, flags);
+                    new ComponentName(this, mClassName), mToken, 0, null,
+                    flags, 0);
         } catch (RemoteException ex) {
         }
     }
diff --git a/core/java/android/app/SharedElementCallback.java b/core/java/android/app/SharedElementCallback.java
index 80fb805..9fabfde 100644
--- a/core/java/android/app/SharedElementCallback.java
+++ b/core/java/android/app/SharedElementCallback.java
@@ -23,6 +23,7 @@
 import android.graphics.RectF;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
+import android.hardware.HardwareBuffer;
 import android.os.Bundle;
 import android.os.Parcelable;
 import android.transition.TransitionUtils;
@@ -234,7 +235,8 @@
                 return null;
             }
             if (bitmap == null) {
-                bitmap = Bitmap.createHardwareBitmap(buffer);
+                bitmap = Bitmap.wrapHardwareBuffer(HardwareBuffer.createFromGraphicBuffer(buffer),
+                                                   null);
             }
             ImageView imageView = new ImageView(context);
             view = imageView;
diff --git a/core/java/android/app/StatsManager.java b/core/java/android/app/StatsManager.java
index 9b66c92..3119b37 100644
--- a/core/java/android/app/StatsManager.java
+++ b/core/java/android/app/StatsManager.java
@@ -289,20 +289,23 @@
      * @param pendingIntent the PendingIntent to use when broadcasting info to the subscriber
      *                      associated with the given subscriberId. May be null, in which case
      *                      it removes any associated pending intent for this client.
+     * @return A list of configs that are currently active for this client. If the pendingIntent is
+     *         null, this will be an empty list.
      * @throws StatsUnavailableException if unsuccessful due to failing to connect to stats service
      */
     @RequiresPermission(allOf = { DUMP, PACKAGE_USAGE_STATS })
-    public void setActiveConfigsChangedOperation(@Nullable PendingIntent pendingIntent)
+    public long[] setActiveConfigsChangedOperation(@Nullable PendingIntent pendingIntent)
             throws StatsUnavailableException {
         synchronized (this) {
             try {
                 IStatsManager service = getIStatsManagerLocked();
                 if (pendingIntent == null) {
                     service.removeActiveConfigsChangedOperation(mContext.getOpPackageName());
+                    return new long[0];
                 } else {
                     // Extracts IIntentSender from the PendingIntent and turns it into an IBinder.
                     IBinder intentSender = pendingIntent.getTarget().asBinder();
-                    service.setActiveConfigsChangedOperation(intentSender,
+                    return service.setActiveConfigsChangedOperation(intentSender,
                             mContext.getOpPackageName());
                 }
 
diff --git a/core/java/android/app/StatusBarManager.java b/core/java/android/app/StatusBarManager.java
index bbe5b8b..1878d84 100644
--- a/core/java/android/app/StatusBarManager.java
+++ b/core/java/android/app/StatusBarManager.java
@@ -18,6 +18,7 @@
 
 import android.annotation.IntDef;
 import android.annotation.Nullable;
+import android.annotation.SystemApi;
 import android.annotation.SystemService;
 import android.annotation.UnsupportedAppUsage;
 import android.content.Context;
@@ -25,6 +26,7 @@
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.os.ServiceManager;
+import android.util.Pair;
 import android.util.Slog;
 import android.view.View;
 
@@ -35,40 +37,57 @@
 
 /**
  * Allows an app to control the status bar.
- *
- * @hide
  */
 @SystemService(Context.STATUS_BAR_SERVICE)
 public class StatusBarManager {
 
-    @UnsupportedAppUsage
+    /** @hide */
+    @SystemApi
     public static final int DISABLE_EXPAND = View.STATUS_BAR_DISABLE_EXPAND;
+    /** @hide */
     public static final int DISABLE_NOTIFICATION_ICONS = View.STATUS_BAR_DISABLE_NOTIFICATION_ICONS;
+    /** @hide */
+    @SystemApi
     public static final int DISABLE_NOTIFICATION_ALERTS
             = View.STATUS_BAR_DISABLE_NOTIFICATION_ALERTS;
+
+    /** @hide */
     @Deprecated
     @UnsupportedAppUsage
     public static final int DISABLE_NOTIFICATION_TICKER
             = View.STATUS_BAR_DISABLE_NOTIFICATION_TICKER;
+    /** @hide */
     public static final int DISABLE_SYSTEM_INFO = View.STATUS_BAR_DISABLE_SYSTEM_INFO;
+    /** @hide */
+    @SystemApi
     public static final int DISABLE_HOME = View.STATUS_BAR_DISABLE_HOME;
+    /** @hide */
+    @SystemApi
     public static final int DISABLE_RECENT = View.STATUS_BAR_DISABLE_RECENT;
+    /** @hide */
     public static final int DISABLE_BACK = View.STATUS_BAR_DISABLE_BACK;
+    /** @hide */
     public static final int DISABLE_CLOCK = View.STATUS_BAR_DISABLE_CLOCK;
+    /** @hide */
+    @SystemApi
     public static final int DISABLE_SEARCH = View.STATUS_BAR_DISABLE_SEARCH;
 
+    /** @hide */
     @Deprecated
-    public static final int DISABLE_NAVIGATION = 
+    public static final int DISABLE_NAVIGATION =
             View.STATUS_BAR_DISABLE_HOME | View.STATUS_BAR_DISABLE_RECENT;
 
-    @UnsupportedAppUsage
+    /** @hide */
+    @SystemApi
     public static final int DISABLE_NONE = 0x00000000;
 
+    /** @hide */
     public static final int DISABLE_MASK = DISABLE_EXPAND | DISABLE_NOTIFICATION_ICONS
             | DISABLE_NOTIFICATION_ALERTS | DISABLE_NOTIFICATION_TICKER
             | DISABLE_SYSTEM_INFO | DISABLE_RECENT | DISABLE_HOME | DISABLE_BACK | DISABLE_CLOCK
             | DISABLE_SEARCH;
 
+    /** @hide */
     @IntDef(flag = true, prefix = {"DISABLE_"}, value = {
             DISABLE_NONE,
             DISABLE_EXPAND,
@@ -91,17 +110,26 @@
      * Setting this flag disables quick settings completely, but does not disable expanding the
      * notification shade.
      */
+    /** @hide */
     public static final int DISABLE2_QUICK_SETTINGS = 1;
+    /** @hide */
     public static final int DISABLE2_SYSTEM_ICONS = 1 << 1;
+    /** @hide */
     public static final int DISABLE2_NOTIFICATION_SHADE = 1 << 2;
+    /** @hide */
     public static final int DISABLE2_GLOBAL_ACTIONS = 1 << 3;
+    /** @hide */
     public static final int DISABLE2_ROTATE_SUGGESTIONS = 1 << 4;
 
+    /** @hide */
+    @SystemApi
     public static final int DISABLE2_NONE = 0x00000000;
 
+    /** @hide */
     public static final int DISABLE2_MASK = DISABLE2_QUICK_SETTINGS | DISABLE2_SYSTEM_ICONS
             | DISABLE2_NOTIFICATION_SHADE | DISABLE2_GLOBAL_ACTIONS | DISABLE2_ROTATE_SUGGESTIONS;
 
+    /** @hide */
     @IntDef(flag = true, prefix = { "DISABLE2_" }, value = {
             DISABLE2_NONE,
             DISABLE2_MASK,
@@ -114,12 +142,32 @@
     @Retention(RetentionPolicy.SOURCE)
     public @interface Disable2Flags {}
 
+    /**
+     * Default disable flags for setup
+     *
+     * @hide
+     */
+    public static final int DEFAULT_SETUP_DISABLE_FLAGS = DISABLE_NOTIFICATION_ALERTS
+            | DISABLE_HOME | DISABLE_EXPAND | DISABLE_RECENT | DISABLE_CLOCK | DISABLE_SEARCH;
+
+    /**
+     * Default disable2 flags for setup
+     *
+     * @hide
+     */
+    public static final int DEFAULT_SETUP_DISABLE2_FLAGS = DISABLE2_ROTATE_SUGGESTIONS;
+
+    /** @hide */
     public static final int NAVIGATION_HINT_BACK_ALT      = 1 << 0;
+    /** @hide */
     public static final int NAVIGATION_HINT_IME_SHOWN     = 1 << 1;
 
+    /** @hide */
     public static final int WINDOW_STATUS_BAR = 1;
+    /** @hide */
     public static final int WINDOW_NAVIGATION_BAR = 2;
 
+    /** @hide */
     @IntDef(flag = true, prefix = { "WINDOW_" }, value = {
         WINDOW_STATUS_BAR,
         WINDOW_NAVIGATION_BAR
@@ -127,10 +175,14 @@
     @Retention(RetentionPolicy.SOURCE)
     public @interface WindowType {}
 
+    /** @hide */
     public static final int WINDOW_STATE_SHOWING = 0;
+    /** @hide */
     public static final int WINDOW_STATE_HIDING = 1;
+    /** @hide */
     public static final int WINDOW_STATE_HIDDEN = 2;
 
+    /** @hide */
     @IntDef(flag = true, prefix = { "WINDOW_STATE_" }, value = {
             WINDOW_STATE_SHOWING,
             WINDOW_STATE_HIDING,
@@ -139,8 +191,11 @@
     @Retention(RetentionPolicy.SOURCE)
     public @interface WindowVisibleState {}
 
+    /** @hide */
     public static final int CAMERA_LAUNCH_SOURCE_WIGGLE = 0;
+    /** @hide */
     public static final int CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP = 1;
+    /** @hide */
     public static final int CAMERA_LAUNCH_SOURCE_LIFT_TRIGGER = 2;
 
     @UnsupportedAppUsage
@@ -169,6 +224,8 @@
     /**
      * Disable some features in the status bar.  Pass the bitwise-or of the DISABLE_* flags.
      * To re-enable everything, pass {@link #DISABLE_NONE}.
+     *
+     * @hide
      */
     @UnsupportedAppUsage
     public void disable(int what) {
@@ -188,6 +245,8 @@
      * To re-enable everything, pass {@link #DISABLE_NONE}.
      *
      * Warning: Only pass DISABLE2_* flags into this function, do not use DISABLE_* flags.
+     *
+     * @hide
      */
     public void disable2(@Disable2Flags int what) {
         try {
@@ -203,6 +262,8 @@
 
     /**
      * Expand the notifications panel.
+     *
+     * @hide
      */
     @UnsupportedAppUsage
     public void expandNotificationsPanel() {
@@ -215,9 +276,11 @@
             throw ex.rethrowFromSystemServer();
         }
     }
-    
+
     /**
      * Collapse the notifications and settings panels.
+     *
+     * @hide
      */
     @UnsupportedAppUsage
     public void collapsePanels() {
@@ -233,6 +296,8 @@
 
     /**
      * Expand the settings panel.
+     *
+     * @hide
      */
     @UnsupportedAppUsage
     public void expandSettingsPanel() {
@@ -242,6 +307,8 @@
     /**
      * Expand the settings panel and open a subPanel. If the subpanel is null or does not have a
      * corresponding tile, the QS panel is simply expanded
+     *
+     * @hide
      */
     @UnsupportedAppUsage
     public void expandSettingsPanel(@Nullable String subPanel) {
@@ -255,6 +322,7 @@
         }
     }
 
+    /** @hide */
     @UnsupportedAppUsage
     public void setIcon(String slot, int iconId, int iconLevel, String contentDescription) {
         try {
@@ -268,6 +336,7 @@
         }
     }
 
+    /** @hide */
     @UnsupportedAppUsage
     public void removeIcon(String slot) {
         try {
@@ -280,6 +349,7 @@
         }
     }
 
+    /** @hide */
     @UnsupportedAppUsage
     public void setIconVisibility(String slot, boolean visible) {
         try {
@@ -292,6 +362,53 @@
         }
     }
 
+    /**
+     * Enable or disable status bar elements (notifications, clock) which are inappropriate during
+     * device setup.
+     *
+     * @param disabled whether to apply or remove the disabled flags
+     *
+     * @hide
+     */
+    @SystemApi
+    public void setDisabledForSetup(boolean disabled) {
+        try {
+            final int userId = Binder.getCallingUserHandle().getIdentifier();
+            final IStatusBarService svc = getService();
+            if (svc != null) {
+                svc.disableForUser(disabled ? DEFAULT_SETUP_DISABLE_FLAGS : DISABLE_NONE,
+                        mToken, mContext.getPackageName(), userId);
+                svc.disable2ForUser(disabled ? DEFAULT_SETUP_DISABLE2_FLAGS : DISABLE2_NONE,
+                        mToken, mContext.getPackageName(), userId);
+            }
+        } catch (RemoteException ex) {
+            throw ex.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * Get the currently applied StatusBar disable flags
+     *
+     * @return a pair of Integers in the form of (disable, disable2)
+     *
+     * @hide
+     */
+    @SystemApi
+    public Pair<Integer, Integer> getDisableFlags() {
+        try {
+            final int userId = Binder.getCallingUserHandle().getIdentifier();
+            final IStatusBarService svc = getService();
+            int[] flags = new int[] {0, 0};
+            if (svc != null) {
+                flags = svc.getDisableFlags(mToken, userId);
+            }
+
+            return new Pair<Integer, Integer>(flags[0], flags[1]);
+        } catch (RemoteException ex) {
+            throw ex.rethrowFromSystemServer();
+        }
+    }
+
     /** @hide */
     public static String windowStateToString(int state) {
         if (state == WINDOW_STATE_HIDING) return "WINDOW_STATE_HIDING";
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index ee13164..807b7f2 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -30,7 +30,6 @@
 import android.app.slice.SliceManager;
 import android.app.timedetector.TimeDetector;
 import android.app.timezone.RulesManager;
-import android.app.timezonedetector.TimeZoneDetector;
 import android.app.trust.TrustManager;
 import android.app.usage.IStorageStatsManager;
 import android.app.usage.IUsageStatsManager;
@@ -132,11 +131,13 @@
 import android.os.Build;
 import android.os.DeviceIdleManager;
 import android.os.DropBoxManager;
+import android.os.DynamicAndroidManager;
 import android.os.HardwarePropertiesManager;
 import android.os.IBatteryPropertiesRegistrar;
 import android.os.IBinder;
 import android.os.IDeviceIdleController;
 import android.os.IDumpstate;
+import android.os.IDynamicAndroidService;
 import android.os.IHardwarePropertiesManager;
 import android.os.IPowerManager;
 import android.os.IRecoverySystem;
@@ -1221,13 +1222,6 @@
                             throws ServiceNotFoundException {
                         return new TimeDetector();
                     }});
-        registerService(Context.TIME_ZONE_DETECTOR_SERVICE, TimeZoneDetector.class,
-                new CachedServiceFetcher<TimeZoneDetector>() {
-                    @Override
-                    public TimeZoneDetector createService(ContextImpl ctx)
-                            throws ServiceNotFoundException {
-                        return new TimeZoneDetector();
-                    }});
 
         registerService(Context.PERMISSION_SERVICE, PermissionManager.class,
                 new CachedServiceFetcher<PermissionManager>() {
@@ -1260,6 +1254,17 @@
                         return new RollbackManager(ctx.getOuterContext(),
                                 IRollbackManager.Stub.asInterface(b));
                     }});
+
+        registerService(Context.DYNAMIC_ANDROID_SERVICE, DynamicAndroidManager.class,
+                new CachedServiceFetcher<DynamicAndroidManager>() {
+                    @Override
+                    public DynamicAndroidManager createService(ContextImpl ctx)
+                            throws ServiceNotFoundException {
+                        IBinder b = ServiceManager.getServiceOrThrow(
+                                Context.DYNAMIC_ANDROID_SERVICE);
+                        return new DynamicAndroidManager(
+                                IDynamicAndroidService.Stub.asInterface(b));
+                    }});
         //CHECKSTYLE:ON IndentationCheck
     }
 
diff --git a/core/java/android/app/ZygotePreload.java b/core/java/android/app/ZygotePreload.java
new file mode 100644
index 0000000..a295af3
--- /dev/null
+++ b/core/java/android/app/ZygotePreload.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.app;
+
+import android.content.pm.ApplicationInfo;
+
+/**
+ * This is the interface to be implemented for the class that is specified by the
+ * {@link android.R.styleable#AndroidManifestApplication_zygotePreloadName
+ * android:zygotePreloadName} of the &lt;application&gt; tag.
+ *
+ * It is responsible for preloading application code and data, that will be shared by all
+ * isolated services that have the
+ * {@link android.R.styleable#AndroidManifestService_useAppZygote android:useAppZygote} attribute
+ * of the &lt;service&gt; tag set to <code>true</code>.
+ *
+ * Note that this implementations of this class must provide a default constructor with no
+ * arguments.
+ */
+public interface ZygotePreload {
+    /**
+     * This method is called once every time the Application Zygote is started. It is normally
+     * started the first time an isolated service that uses it is started. The Application Zygote
+     * will be stopped when all isolated services that use it are stopped.
+     *
+     * @param appInfo The ApplicationInfo object belonging to the application
+     */
+    void doPreload(ApplicationInfo appInfo);
+}
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 2514eee..428c9b0 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -3149,6 +3149,7 @@
      * @throws SecurityException if {@code admin} is not an active administrator or {@code admin}
      *             does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD}
      */
+    @RequiresFeature(PackageManager.FEATURE_SECURE_LOCK_SCREEN)
     public void setPasswordHistoryLength(@NonNull ComponentName admin, int length) {
         if (mService != null) {
             try {
@@ -5059,11 +5060,16 @@
     }
 
     /**
+     * Service-specific error code used in implementation of {@code setAlwaysOnVpnPackage} methods.
+     * @hide
+     */
+    public static final int ERROR_VPN_PACKAGE_NOT_FOUND = 1;
+
+    /**
      * Called by a device or profile owner to configure an always-on VPN connection through a
      * specific application for the current user. This connection is automatically granted and
      * persisted after a reboot.
-     * <p>
-     * To support the always-on feature, an app must
+     * <p> To support the always-on feature, an app must
      * <ul>
      *     <li>declare a {@link android.net.VpnService} in its manifest, guarded by
      *         {@link android.Manifest.permission#BIND_VPN_SERVICE};</li>
@@ -5072,25 +5078,61 @@
      *         {@link android.net.VpnService#SERVICE_META_DATA_SUPPORTS_ALWAYS_ON}.</li>
      * </ul>
      * The call will fail if called with the package name of an unsupported VPN app.
+     * <p> Enabling lockdown via {@code lockdownEnabled} argument carries the risk that any failure
+     * of the VPN provider could break networking for all apps.
      *
      * @param vpnPackage The package name for an installed VPN app on the device, or {@code null} to
      *        remove an existing always-on VPN configuration.
      * @param lockdownEnabled {@code true} to disallow networking when the VPN is not connected or
-     *        {@code false} otherwise. This carries the risk that any failure of the VPN provider
-     *        could break networking for all apps. This has no effect when clearing.
+     *        {@code false} otherwise. This has no effect when clearing.
      * @throws SecurityException if {@code admin} is not a device or a profile owner.
      * @throws NameNotFoundException if {@code vpnPackage} is not installed.
      * @throws UnsupportedOperationException if {@code vpnPackage} exists but does not support being
      *         set as always-on, or if always-on VPN is not available.
+     * @see #setAlwaysOnVpnPackage(ComponentName, String, boolean, List)
      */
     public void setAlwaysOnVpnPackage(@NonNull ComponentName admin, @Nullable String vpnPackage,
-            boolean lockdownEnabled)
-            throws NameNotFoundException, UnsupportedOperationException {
+            boolean lockdownEnabled) throws NameNotFoundException {
+        setAlwaysOnVpnPackage(admin, vpnPackage, lockdownEnabled, Collections.emptyList());
+    }
+
+    /**
+     * A version of {@link #setAlwaysOnVpnPackage(ComponentName, String, boolean)} that allows the
+     * admin to specify a set of apps that should be able to access the network directly when VPN
+     * is not connected. When VPN connects these apps switch over to VPN if allowed to use that VPN.
+     * System apps can always bypass VPN.
+     * <p> Note that the system doesn't update the whitelist when packages are installed or
+     * uninstalled, the admin app must call this method to keep the list up to date.
+     *
+     * @param vpnPackage package name for an installed VPN app on the device, or {@code null}
+     *         to remove an existing always-on VPN configuration
+     * @param lockdownEnabled {@code true} to disallow networking when the VPN is not connected or
+     *         {@code false} otherwise. This has no effect when clearing.
+     * @param lockdownWhitelist Packages that will be able to access the network directly when VPN
+     *         is in lockdown mode but not connected. Has no effect when clearing.
+     * @throws SecurityException if {@code admin} is not a device or a profile
+     *         owner.
+     * @throws NameNotFoundException if {@code vpnPackage} or one of
+     *         {@code lockdownWhitelist} is not installed.
+     * @throws UnsupportedOperationException if {@code vpnPackage} exists but does
+     *         not support being set as always-on, or if always-on VPN is not
+     *         available.
+     */
+    public void setAlwaysOnVpnPackage(@NonNull ComponentName admin, @Nullable String vpnPackage,
+            boolean lockdownEnabled, @Nullable List<String> lockdownWhitelist)
+            throws NameNotFoundException {
         throwIfParentInstance("setAlwaysOnVpnPackage");
         if (mService != null) {
             try {
-                if (!mService.setAlwaysOnVpnPackage(admin, vpnPackage, lockdownEnabled)) {
-                    throw new NameNotFoundException(vpnPackage);
+                mService.setAlwaysOnVpnPackage(
+                        admin, vpnPackage, lockdownEnabled, lockdownWhitelist);
+            } catch (ServiceSpecificException e) {
+                switch (e.errorCode) {
+                    case ERROR_VPN_PACKAGE_NOT_FOUND:
+                        throw new NameNotFoundException(e.getMessage());
+                    default:
+                        throw new RuntimeException(
+                                "Unknown error setting always-on VPN: " + e.errorCode, e);
                 }
             } catch (RemoteException e) {
                 throw e.rethrowFromSystemServer();
@@ -5099,6 +5141,51 @@
     }
 
     /**
+     * Called by device or profile owner to query whether current always-on VPN is configured in
+     * lockdown mode. Returns {@code false} when no always-on configuration is set.
+     *
+     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
+     *
+     * @throws SecurityException if {@code admin} is not a device or a profile owner.
+     *
+     * @see #setAlwaysOnVpnPackage(ComponentName, String, boolean)
+     */
+    public boolean isAlwaysOnVpnLockdownEnabled(@NonNull ComponentName admin) {
+        throwIfParentInstance("isAlwaysOnVpnLockdownEnabled");
+        if (mService != null) {
+            try {
+                return mService.isAlwaysOnVpnLockdownEnabled(admin);
+            } catch (RemoteException e) {
+                throw e.rethrowFromSystemServer();
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Called by device or profile owner to query the list of packages that are allowed to access
+     * the network directly when always-on VPN is in lockdown mode but not connected. Returns
+     * {@code null} when always-on VPN is not active or not in lockdown mode.
+     *
+     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
+     *
+     * @throws SecurityException if {@code admin} is not a device or a profile owner.
+     *
+     * @see #setAlwaysOnVpnPackage(ComponentName, String, boolean, List)
+     */
+    public @Nullable List<String> getAlwaysOnVpnLockdownWhitelist(@NonNull ComponentName admin) {
+        throwIfParentInstance("getAlwaysOnVpnLockdownWhitelist");
+        if (mService != null) {
+            try {
+                return mService.getAlwaysOnVpnLockdownWhitelist(admin);
+            } catch (RemoteException e) {
+                throw e.rethrowFromSystemServer();
+            }
+        }
+        return null;
+    }
+
+    /**
      * Called by a device or profile owner to read the name of the package administering an
      * always-on VPN connection for the current user. If there is no such package, or the always-on
      * VPN is provided by the system instead of by an application, {@code null} will be returned.
@@ -9528,12 +9615,18 @@
     }
 
     /**
-     * Allows the device owner to enable or disable the backup service.
+     * Allows the device owner or profile owner to enable or disable the backup service.
      *
-     * <p> Backup service manages all backup and restore mechanisms on the device. Setting this to
-     * false will prevent data from being backed up or restored.
+     * <p> Each user has its own backup service which manages the backup and restore mechanisms in
+     * that user. Disabling the backup service will prevent data from being backed up or restored.
      *
-     * <p> Backup service is off by default when device owner is present.
+     * <p> Device owner calls this API to control backup services across all users on the device.
+     * Profile owner can use this API to enable or disable the profile's backup service. However,
+     * for a managed profile its backup functionality is only enabled if both the device owner
+     * and the profile owner have enabled the backup service.
+     *
+     * <p> By default, backup service is disabled on a device with device owner, and within a
+     * managed profile.
      *
      * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
      * @param enabled {@code true} to enable the backup service, {@code false} to disable it.
@@ -9549,7 +9642,12 @@
     }
 
     /**
-     * Return whether the backup service is enabled by the device owner.
+     * Return whether the backup service is enabled by the device owner or profile owner for the
+     * current user, as previously set by {@link #setBackupServiceEnabled(ComponentName, boolean)}.
+     *
+     * <p> Whether the backup functionality is actually enabled or not depends on settings from both
+     * the current user and the device owner, please see
+     * {@link #setBackupServiceEnabled(ComponentName, boolean)} for details.
      *
      * <p> Backup service manages all backup and restore mechanisms on the device.
      *
@@ -10493,14 +10591,19 @@
     }
 
     /**
-     * Returns if a package is whitelisted to access cross-profile calendar APIs.
+     * Returns if a package is allowed to access cross-profile calendar APIs.
+     *
+     * <p>A package is allowed to access cross-profile calendar APIs if it's allowed by
+     * admins via {@link #setCrossProfileCalendarPackages(ComponentName, Set)} and
+     * {@link android.provider.Settings.Secure#CROSS_PROFILE_CALENDAR_ENABLED}
+     * is turned on in the managed profile.
      *
      * <p>To query for a specific user, use
      * {@link Context#createPackageContextAsUser(String, int, UserHandle)} to create a context for
      * that user, and get a {@link DevicePolicyManager} from this context.
      *
      * @param packageName the name of the package
-     * @return {@code true} if the package is whitelisted to access cross-profile calendar APIs.
+     * @return {@code true} if the package is allowed to access cross-profile calendar APIs.
      * {@code false} otherwise.
      *
      * @see #setCrossProfileCalendarPackages(ComponentName, Set)
diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl
index 1751a91c..5790fda 100644
--- a/core/java/android/app/admin/IDevicePolicyManager.aidl
+++ b/core/java/android/app/admin/IDevicePolicyManager.aidl
@@ -187,8 +187,10 @@
     void setCertInstallerPackage(in ComponentName who, String installerPackage);
     String getCertInstallerPackage(in ComponentName who);
 
-    boolean setAlwaysOnVpnPackage(in ComponentName who, String vpnPackage, boolean lockdown);
+    boolean setAlwaysOnVpnPackage(in ComponentName who, String vpnPackage, boolean lockdown, in List<String> lockdownWhitelist);
     String getAlwaysOnVpnPackage(in ComponentName who);
+    boolean isAlwaysOnVpnLockdownEnabled(in ComponentName who);
+    List<String> getAlwaysOnVpnLockdownWhitelist(in ComponentName who);
 
     void addPersistentPreferredActivity(in ComponentName admin, in IntentFilter filter, in ComponentName activity);
     void clearPackagePersistentPreferredActivities(in ComponentName admin, String packageName);
diff --git a/core/java/android/app/prediction/AppPredictionContext.java b/core/java/android/app/prediction/AppPredictionContext.java
index 87ccb66..2fbe6e36 100644
--- a/core/java/android/app/prediction/AppPredictionContext.java
+++ b/core/java/android/app/prediction/AppPredictionContext.java
@@ -18,6 +18,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.SystemApi;
+import android.annotation.TestApi;
 import android.content.Context;
 import android.os.Bundle;
 import android.os.Parcel;
@@ -29,6 +30,7 @@
  * @hide
  */
 @SystemApi
+@TestApi
 public final class AppPredictionContext implements Parcelable {
 
     private final int mPredictedTargetCount;
@@ -73,6 +75,17 @@
     }
 
     @Override
+    public boolean equals(Object o) {
+        if (o == this) return true;
+        if (!getClass().equals(o != null ? o.getClass() : null)) return false;
+
+        AppPredictionContext other = (AppPredictionContext) o;
+        return mPredictedTargetCount == other.mPredictedTargetCount
+                && mUiSurface.equals(other.mUiSurface)
+                && mPackageName.equals(other.mPackageName);
+    }
+
+    @Override
     public int describeContents() {
         return 0;
     }
@@ -104,6 +117,7 @@
      * @hide
      */
     @SystemApi
+    @TestApi
     public static final class Builder {
 
         @NonNull
@@ -116,8 +130,12 @@
         private Bundle mExtras;
 
         /**
+         * TODO(b/123591863): Add java docs
+         *
          * @hide
          */
+        @SystemApi
+        @TestApi
         public Builder(@NonNull Context context) {
             mPackageName = context.getPackageName();
         }
diff --git a/core/java/android/app/prediction/AppPredictionManager.java b/core/java/android/app/prediction/AppPredictionManager.java
index f8578d4..99f78f1 100644
--- a/core/java/android/app/prediction/AppPredictionManager.java
+++ b/core/java/android/app/prediction/AppPredictionManager.java
@@ -17,6 +17,7 @@
 
 import android.annotation.NonNull;
 import android.annotation.SystemApi;
+import android.annotation.TestApi;
 import android.content.Context;
 
 import com.android.internal.util.Preconditions;
@@ -26,6 +27,7 @@
  * @hide
  */
 @SystemApi
+@TestApi
 public final class AppPredictionManager {
 
     private final Context mContext;
diff --git a/core/java/android/app/prediction/AppPredictionSessionId.java b/core/java/android/app/prediction/AppPredictionSessionId.java
index 1d7308e..1e76c24 100644
--- a/core/java/android/app/prediction/AppPredictionSessionId.java
+++ b/core/java/android/app/prediction/AppPredictionSessionId.java
@@ -17,6 +17,7 @@
 
 import android.annotation.NonNull;
 import android.annotation.SystemApi;
+import android.annotation.TestApi;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -26,6 +27,7 @@
  * @hide
  */
 @SystemApi
+@TestApi
 public final class AppPredictionSessionId implements Parcelable {
 
     private final String mId;
diff --git a/core/java/android/app/prediction/AppPredictor.java b/core/java/android/app/prediction/AppPredictor.java
index 2ddbd08..12d6ce3 100644
--- a/core/java/android/app/prediction/AppPredictor.java
+++ b/core/java/android/app/prediction/AppPredictor.java
@@ -19,6 +19,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.SystemApi;
+import android.annotation.TestApi;
 import android.app.prediction.IPredictionCallback.Stub;
 import android.content.Context;
 import android.content.pm.ParceledListSlice;
@@ -63,6 +64,7 @@
  * @hide
  */
 @SystemApi
+@TestApi
 public final class AppPredictor {
 
     private static final String TAG = AppPredictor.class.getSimpleName();
@@ -102,6 +104,10 @@
      * Notifies the prediction service of an app target event.
      */
     public void notifyAppTargetEvent(@NonNull AppTargetEvent event) {
+        if (mIsClosed.get()) {
+            throw new IllegalStateException("This client has already been destroyed.");
+        }
+
         try {
             mPredictionManager.notifyAppTargetEvent(mSessionId, event);
         } catch (RemoteException e) {
@@ -114,6 +120,10 @@
      */
     public void notifyLocationShown(@NonNull String launchLocation,
             @NonNull List<AppTargetId> targetIds) {
+        if (mIsClosed.get()) {
+            throw new IllegalStateException("This client has already been destroyed.");
+        }
+
         try {
             mPredictionManager.notifyLocationShown(mSessionId, launchLocation,
                     new ParceledListSlice<>(targetIds));
@@ -130,6 +140,10 @@
      */
     public void registerPredictionUpdates(@NonNull @CallbackExecutor Executor callbackExecutor,
             @NonNull AppPredictor.Callback callback) {
+        if (mIsClosed.get()) {
+            throw new IllegalStateException("This client has already been destroyed.");
+        }
+
         if (mRegisteredCallbacks.containsKey(callback)) {
             // Skip if this callback is already registered
             return;
@@ -149,6 +163,10 @@
      * callback until the callback is re-registered.
      */
     public void unregisterPredictionUpdates(@NonNull AppPredictor.Callback callback) {
+        if (mIsClosed.get()) {
+            throw new IllegalStateException("This client has already been destroyed.");
+        }
+
         if (!mRegisteredCallbacks.containsKey(callback)) {
             // Skip if this callback was never registered
             return;
@@ -168,6 +186,10 @@
      * @see Callback#onTargetsAvailable(List)
      */
     public void requestPredictionUpdate() {
+        if (mIsClosed.get()) {
+            throw new IllegalStateException("This client has already been destroyed.");
+        }
+
         try {
             mPredictionManager.requestPredictionUpdate(mSessionId);
         } catch (RemoteException e) {
@@ -182,6 +204,10 @@
     @Nullable
     public void sortTargets(@NonNull List<AppTarget> targets,
             @NonNull Executor callbackExecutor, @NonNull Consumer<List<AppTarget>> callback) {
+        if (mIsClosed.get()) {
+            throw new IllegalStateException("This client has already been destroyed.");
+        }
+
         try {
             mPredictionManager.sortAppTargets(mSessionId, new ParceledListSlice(targets),
                     new CallbackWrapper(callbackExecutor, callback));
@@ -206,6 +232,8 @@
             } catch (RemoteException e) {
                 Log.e(TAG, "Failed to notify app target event", e);
             }
+        } else {
+            throw new IllegalStateException("This client has already been destroyed.");
         }
     }
 
@@ -222,6 +250,16 @@
     }
 
     /**
+     * TODO(b/123591863): Add java docs
+     *
+     * @hide
+     */
+    @TestApi
+    public AppPredictionSessionId getSessionId() {
+        return mSessionId;
+    }
+
+    /**
      * Callback for receiving prediction updates.
      */
     public interface Callback {
diff --git a/core/java/android/app/prediction/AppTarget.java b/core/java/android/app/prediction/AppTarget.java
index 99c1c44..b924cec 100644
--- a/core/java/android/app/prediction/AppTarget.java
+++ b/core/java/android/app/prediction/AppTarget.java
@@ -18,6 +18,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.SystemApi;
+import android.annotation.TestApi;
 import android.content.pm.ShortcutInfo;
 import android.os.Parcel;
 import android.os.Parcelable;
@@ -30,6 +31,7 @@
  * @hide
  */
 @SystemApi
+@TestApi
 public final class AppTarget implements Parcelable {
 
     private final AppTargetId mId;
@@ -42,8 +44,12 @@
     private int mRank;
 
     /**
+     * TODO(b/123591863): Add java docs
+     *
      * @hide
      */
+    @SystemApi
+    @TestApi
     public AppTarget(@NonNull AppTargetId id, @NonNull String packageName,
             @Nullable String className, @NonNull UserHandle user) {
         mId = id;
@@ -55,15 +61,19 @@
     }
 
     /**
+     * TODO(b/123591863): Add java docs
+     *
      * @hide
      */
-    public AppTarget(@NonNull AppTargetId id, @NonNull ShortcutInfo shortcutInfo) {
+    @SystemApi
+    public AppTarget(@NonNull AppTargetId id, @NonNull ShortcutInfo shortcutInfo,
+            @Nullable String className) {
         mId = id;
         mShortcutInfo = Preconditions.checkNotNull(shortcutInfo);
 
         mPackageName = mShortcutInfo.getPackage();
         mUser = mShortcutInfo.getUserHandle();
-        mClassName = null;
+        mClassName = className;
     }
 
     private AppTarget(Parcel parcel) {
@@ -71,13 +81,12 @@
         mShortcutInfo = parcel.readTypedObject(ShortcutInfo.CREATOR);
         if (mShortcutInfo == null) {
             mPackageName = parcel.readString();
-            mClassName = parcel.readString();
             mUser = UserHandle.of(parcel.readInt());
         } else {
             mPackageName = mShortcutInfo.getPackage();
             mUser = mShortcutInfo.getUserHandle();
-            mClassName = null;
         }
+        mClassName = parcel.readString();
         mRank = parcel.readInt();
     }
 
@@ -129,11 +138,32 @@
         mRank = rank;
     }
 
+    /**
+     * Returns the rank for the target.
+     */
     public int getRank() {
         return mRank;
     }
 
     @Override
+    public boolean equals(Object o) {
+        if (!getClass().equals(o != null ? o.getClass() : null)) return false;
+
+        AppTarget other = (AppTarget) o;
+        boolean sameClassName = (mClassName == null && other.mClassName == null)
+                || (mClassName != null && mClassName.equals(other.mClassName));
+        boolean sameShortcutInfo = (mShortcutInfo == null && other.mShortcutInfo == null)
+                || (mShortcutInfo != null && other.mShortcutInfo != null
+                        && mShortcutInfo.getId() == other.mShortcutInfo.getId());
+        return mId.equals(other.mId)
+                && mPackageName.equals(other.mPackageName)
+                && sameClassName
+                && mUser.equals(other.mUser)
+                && sameShortcutInfo
+                && mRank == other.mRank;
+    }
+
+    @Override
     public int describeContents() {
         return 0;
     }
@@ -144,9 +174,9 @@
         dest.writeTypedObject(mShortcutInfo, flags);
         if (mShortcutInfo == null) {
             dest.writeString(mPackageName);
-            dest.writeString(mClassName);
             dest.writeInt(mUser.getIdentifier());
         }
+        dest.writeString(mClassName);
         dest.writeInt(mRank);
     }
 
diff --git a/core/java/android/app/prediction/AppTargetEvent.java b/core/java/android/app/prediction/AppTargetEvent.java
index 18317e1..37e41de 100644
--- a/core/java/android/app/prediction/AppTargetEvent.java
+++ b/core/java/android/app/prediction/AppTargetEvent.java
@@ -19,6 +19,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.SystemApi;
+import android.annotation.TestApi;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -30,6 +31,7 @@
  * @hide
  */
 @SystemApi
+@TestApi
 public final class AppTargetEvent implements Parcelable {
 
     /**
@@ -96,6 +98,16 @@
     }
 
     @Override
+    public boolean equals(Object o) {
+        if (!getClass().equals(o != null ? o.getClass() : null)) return false;
+
+        AppTargetEvent other = (AppTargetEvent) o;
+        return mTarget.equals(other.mTarget)
+                && mLocation.equals(other.mLocation)
+                && mAction == other.mAction;
+    }
+
+    @Override
     public int describeContents() {
         return 0;
     }
@@ -126,6 +138,7 @@
      * @hide
      */
     @SystemApi
+    @TestApi
     public static final class Builder {
         private AppTarget mTarget;
         private String mLocation;
diff --git a/core/java/android/app/prediction/AppTargetId.java b/core/java/android/app/prediction/AppTargetId.java
index 0b8fb47..639ba78 100644
--- a/core/java/android/app/prediction/AppTargetId.java
+++ b/core/java/android/app/prediction/AppTargetId.java
@@ -17,6 +17,7 @@
 
 import android.annotation.NonNull;
 import android.annotation.SystemApi;
+import android.annotation.TestApi;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -25,14 +26,19 @@
  * @hide
  */
 @SystemApi
+@TestApi
 public final class AppTargetId implements Parcelable {
 
     @NonNull
     private final String mId;
 
     /**
+     * TODO(b/123591863): Add java docs
+     *
      * @hide
      */
+    @SystemApi
+    @TestApi
     public AppTargetId(@NonNull String id) {
         mId = id;
     }
diff --git a/core/java/android/app/role/RoleManagerCallback.java b/core/java/android/app/role/RoleManagerCallback.java
index d9f0a6c..a92ef32 100644
--- a/core/java/android/app/role/RoleManagerCallback.java
+++ b/core/java/android/app/role/RoleManagerCallback.java
@@ -19,6 +19,8 @@
 import android.annotation.SystemApi;
 import android.annotation.TestApi;
 
+import java.util.concurrent.CompletableFuture;
+
 /**
  * Callback for a {@link RoleManager} request.
  *
@@ -37,4 +39,18 @@
      * Signals a failure.
      */
     void onFailure();
+
+    /** @hide */
+    class Future extends CompletableFuture<Void> implements RoleManagerCallback {
+
+        @Override
+        public void onSuccess() {
+            complete(null);
+        }
+
+        @Override
+        public void onFailure() {
+            completeExceptionally(new RuntimeException());
+        }
+    }
 }
diff --git a/core/java/android/app/timezonedetector/ITimeZoneDetectorService.aidl b/core/java/android/app/timezonedetector/ITimeZoneDetectorService.aidl
deleted file mode 100644
index ef2cbab..0000000
--- a/core/java/android/app/timezonedetector/ITimeZoneDetectorService.aidl
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.app.timezonedetector;
-
-/**
- * System private API to comunicate with time zone detector service.
- *
- * <p>Used by parts of the Android system with signals associated with the device's time zone to
- * provide information to the Time Zone Detector Service.
- *
- * <p>Use the {@link android.app.timezonedetector.TimeZoneDetector} class rather than going through
- * this Binder interface directly. See {@link android.app.timezonedetector.TimeZoneDetectorService}
- * for more complete documentation.
- *
- *
- * {@hide}
- */
-interface ITimeZoneDetectorService {
-  void stubbedCall();
-}
diff --git a/core/java/android/app/timezonedetector/TimeZoneDetector.java b/core/java/android/app/timezonedetector/TimeZoneDetector.java
deleted file mode 100644
index be3c764..0000000
--- a/core/java/android/app/timezonedetector/TimeZoneDetector.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.app.timezonedetector;
-
-import android.annotation.SystemService;
-import android.content.Context;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.os.ServiceManager.ServiceNotFoundException;
-import android.util.Log;
-
-/**
- * The interface through which system components can send signals to the TimeZoneDetectorService.
- * @hide
- */
-@SystemService(Context.TIME_ZONE_DETECTOR_SERVICE)
-public final class TimeZoneDetector {
-
-    private static final String TAG = "timezonedetector.TimeZoneDetector";
-    private static final boolean DEBUG = false;
-
-    private final ITimeZoneDetectorService mITimeZoneDetectorService;
-
-    public TimeZoneDetector() throws ServiceNotFoundException {
-        mITimeZoneDetectorService = ITimeZoneDetectorService.Stub.asInterface(
-                ServiceManager.getServiceOrThrow(Context.TIME_ZONE_DETECTOR_SERVICE));
-
-    }
-    /**
-     * Does nothing.
-     * TODO: Remove this when the service implementation is built out.
-     */
-    public void stubbedCall() {
-        if (DEBUG) {
-            Log.d(TAG, "stubbedCall called");
-        }
-        try {
-            mITimeZoneDetectorService.stubbedCall();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-}
diff --git a/core/java/android/app/usage/UsageEvents.java b/core/java/android/app/usage/UsageEvents.java
index 451f44b..8cbe7a3 100644
--- a/core/java/android/app/usage/UsageEvents.java
+++ b/core/java/android/app/usage/UsageEvents.java
@@ -405,6 +405,16 @@
         }
 
         /**
+         * Indicates whether it is an instant app.
+         * STOPSHIP b/111407095: Add GTS tests for the newly added API method.
+         * @hide
+         */
+        @SystemApi
+        public boolean isInstantApp() {
+            return (mFlags & FLAG_IS_PACKAGE_INSTANT_APP) == FLAG_IS_PACKAGE_INSTANT_APP;
+        }
+
+        /**
          * The class name of the source of this event. This may be null for
          * certain events.
          */
@@ -530,7 +540,7 @@
 
         /** @hide */
         public Event getObfuscatedIfInstantApp() {
-            if ((mFlags & FLAG_IS_PACKAGE_INSTANT_APP) == 0) {
+            if (!isInstantApp()) {
                 return this;
             }
             final Event ret = new Event(this);
@@ -735,6 +745,7 @@
                 p.writeString(event.mNotificationChannelId);
                 break;
         }
+        p.writeInt(event.mFlags);
     }
 
     /**
@@ -802,6 +813,7 @@
                 eventOut.mNotificationChannelId = p.readString();
                 break;
         }
+        eventOut.mFlags = p.readInt();
     }
 
     @Override
diff --git a/core/java/android/app/usage/UsageStatsManagerInternal.java b/core/java/android/app/usage/UsageStatsManagerInternal.java
index 3d3c03a..43ce521 100644
--- a/core/java/android/app/usage/UsageStatsManagerInternal.java
+++ b/core/java/android/app/usage/UsageStatsManagerInternal.java
@@ -287,19 +287,14 @@
 
     /** A class which is used to share the usage limit data for an app or a group of apps. */
     public static class AppUsageLimitData {
-        private final boolean mGroupLimit;
         private final long mTotalUsageLimit;
         private final long mUsageRemaining;
 
-        public AppUsageLimitData(boolean groupLimit, long totalUsageLimit, long usageRemaining) {
-            this.mGroupLimit = groupLimit;
+        public AppUsageLimitData(long totalUsageLimit, long usageRemaining) {
             this.mTotalUsageLimit = totalUsageLimit;
             this.mUsageRemaining = usageRemaining;
         }
 
-        public boolean isGroupLimit() {
-            return mGroupLimit;
-        }
         public long getTotalUsageLimit() {
             return mTotalUsageLimit;
         }
diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java
index f138d39..13d12c9 100644
--- a/core/java/android/content/ContentProvider.java
+++ b/core/java/android/content/ContentProvider.java
@@ -28,6 +28,7 @@
 import android.annotation.Nullable;
 import android.annotation.UnsupportedAppUsage;
 import android.app.AppOpsManager;
+import android.app.role.RoleManager;
 import android.content.pm.PathPermission;
 import android.content.pm.ProviderInfo;
 import android.content.res.AssetFileDescriptor;
@@ -225,6 +226,17 @@
         @Override
         public Cursor query(String callingPkg, Uri uri, @Nullable String[] projection,
                 @Nullable Bundle queryArgs, @Nullable ICancellationSignal cancellationSignal) {
+            if (uri.toString().startsWith("content://sms")) {
+                RoleManager rm = getContext().getSystemService(RoleManager.class);
+                if (!rm.isRoleHeld(RoleManager.ROLE_SMS)
+                        && !rm.isRoleHeld(RoleManager.ROLE_DIALER)
+                        && !rm.isRoleHeld(RoleManager.ROLE_ASSISTANT)) {
+                    // STOPSHIP: log it to westworld instead
+                    Log.wtf(TAG, "Sms access attempted by " + callingPkg
+                            + " despite not holding an appropriate role");
+                }
+            }
+
             uri = validateIncomingUri(uri);
             uri = maybeGetUriWithoutUserId(uri);
             if (enforceReadPermission(callingPkg, uri, null) != AppOpsManager.MODE_ALLOWED) {
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 87f9e46..957a484 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -3180,12 +3180,12 @@
             //@hide: CONTEXTHUB_SERVICE,
             SYSTEM_HEALTH_SERVICE,
             //@hide: INCIDENT_SERVICE,
+            //@hide: INCIDENT_COMPANION_SERVICE,
             //@hide: STATS_COMPANION_SERVICE,
             COMPANION_DEVICE_SERVICE,
             CROSS_PROFILE_APPS_SERVICE,
             //@hide: SYSTEM_UPDATE_SERVICE,
             //@hide: TIME_DETECTOR_SERVICE,
-            //@hide: TIME_ZONE_DETECTOR_SERVICE,
             PERMISSION_SERVICE,
     })
     @Retention(RetentionPolicy.SOURCE)
@@ -3620,9 +3620,10 @@
      *
      * @see #getSystemService(String)
      * @see android.app.StatusBarManager
+     *
      * @hide
      */
-    @UnsupportedAppUsage
+    @SystemApi
     public static final String STATUS_BAR_SERVICE = "statusbar";
 
     /**
@@ -4466,6 +4467,13 @@
     public static final String INCIDENT_SERVICE = "incident";
 
     /**
+     * Service to assist incidentd and dumpstated in reporting status to the user
+     * and in confirming authorization to take an incident report or bugreport
+     * @hide
+     */
+    public static final String INCIDENT_COMPANION_SERVICE = "incidentcompanion";
+
+    /**
      * Service to assist statsd in obtaining general stats.
      * @hide
      */
@@ -4555,15 +4563,6 @@
     public static final String TIME_DETECTOR_SERVICE = "time_detector";
 
     /**
-     * Use with {@link #getSystemService(String)} to retrieve an
-     * {@link android.app.timezonedetector.ITimeZoneDetectorService}.
-     * @hide
-     *
-     * @see #getSystemService(String)
-     */
-    public static final String TIME_ZONE_DETECTOR_SERVICE = "time_zone_detector";
-
-    /**
      * Binder service name for {@link AppBindingService}.
      * @hide
      */
@@ -4576,6 +4575,14 @@
      */
     public static final String TELEPHONY_RCS_SERVICE = "ircs";
 
+     /**
+     * Use with {@link #getSystemService(String)} to retrieve an
+     * {@link android.os.DynamicAndroidManager}.
+     * @hide
+     */
+    @SystemApi
+    public static final String DYNAMIC_ANDROID_SERVICE = "dynamic_android";
+
     /**
      * Determine whether the given permission is allowed for a particular
      * process and user ID running in the system.
diff --git a/core/java/android/content/DynamicAndroidClient.java b/core/java/android/content/DynamicAndroidClient.java
new file mode 100644
index 0000000..571cba4
--- /dev/null
+++ b/core/java/android/content/DynamicAndroidClient.java
@@ -0,0 +1,370 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.content;
+
+import android.annotation.CallbackExecutor;
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Messenger;
+import android.os.RemoteException;
+import android.util.Slog;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.ref.WeakReference;
+import java.util.concurrent.Executor;
+
+/**
+ * This class contains methods and constants used to start DynamicAndroid
+ * installation, and a listener for progress update.
+ * @hide
+ */
+@SystemApi
+public class DynamicAndroidClient {
+    /** @hide */
+    @IntDef(prefix = { "STATUS_" }, value = {
+            STATUS_UNKNOWN,
+            STATUS_NOT_STARTED,
+            STATUS_IN_PROGRESS,
+            STATUS_READY,
+            STATUS_IN_USE,
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface InstallationStatus {}
+
+    /** @hide */
+    @IntDef(prefix = { "CAUSE_" }, value = {
+            CAUSE_NOT_SPECIFIED,
+            CAUSE_INSTALL_COMPLETED,
+            CAUSE_INSTALL_CANCELLED,
+            CAUSE_ERROR_IO,
+            CAUSE_ERROR_INVALID_URL,
+            CAUSE_ERROR_IPC,
+            CAUSE_ERROR_EXCEPTION,
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface StatusChangedCause {}
+
+    private static final String TAG = "DynAndroidClient";
+
+    private static final long DEFAULT_USERDATA_SIZE = (10L << 30);
+
+
+    /** Listener for installation status update. */
+    public interface OnStatusChangedListener {
+        /**
+         * This callback is called when installation status is changed, and when the
+         * client is {@link #bind} to DynamicAndroid installation service.
+         *
+         * @param status status code, also defined in {@code DynamicAndroidClient}.
+         * @param cause cause code, also defined in {@code DynamicAndroidClient}.
+         * @param progress number of bytes installed.
+         */
+        void onStatusChanged(@InstallationStatus int status, @StatusChangedCause int cause,
+                long progress);
+    }
+
+    /*
+     * Status codes
+     */
+    /** We are bound to installation service, but failed to get its status */
+    public static final int STATUS_UNKNOWN = 0;
+
+    /** Installation is not started yet. */
+    public static final int STATUS_NOT_STARTED = 1;
+
+    /** Installation is in progress. */
+    public static final int STATUS_IN_PROGRESS = 2;
+
+    /** Installation is finished but the user has not launched it. */
+    public static final int STATUS_READY = 3;
+
+    /** Device is running in Dynamic Android. */
+    public static final int STATUS_IN_USE = 4;
+
+    /*
+     * Causes
+     */
+    /** Cause is not specified. This means the status is not changed. */
+    public static final int CAUSE_NOT_SPECIFIED = 0;
+
+    /** Status changed because installation is completed. */
+    public static final int CAUSE_INSTALL_COMPLETED = 1;
+
+    /** Status changed because installation is cancelled. */
+    public static final int CAUSE_INSTALL_CANCELLED = 2;
+
+    /** Installation failed due to IOException. */
+    public static final int CAUSE_ERROR_IO = 3;
+
+    /** Installation failed because the image URL source is not supported. */
+    public static final int CAUSE_ERROR_INVALID_URL = 4;
+
+    /** Installation failed due to IPC error. */
+    public static final int CAUSE_ERROR_IPC = 5;
+
+    /** Installation failed due to unhandled exception. */
+    public static final int CAUSE_ERROR_EXCEPTION = 6;
+
+    /*
+     * IPC Messages
+     */
+    /**
+     * Message to register listener.
+     * @hide
+     */
+    public static final int MSG_REGISTER_LISTENER = 1;
+
+    /**
+     * Message to unregister listener.
+     * @hide
+     */
+    public static final int MSG_UNREGISTER_LISTENER = 2;
+
+    /**
+     * Message for status update.
+     * @hide
+     */
+    public static final int MSG_POST_STATUS = 3;
+
+    /*
+     * Messages keys
+     */
+    /**
+     * Message key, for progress update.
+     * @hide
+     */
+    public static final String KEY_INSTALLED_SIZE = "KEY_INSTALLED_SIZE";
+
+    /*
+     * Intent Actions
+     */
+    /**
+     * Intent action: start installation.
+     * @hide
+     */
+    public static final String ACTION_START_INSTALL =
+            "android.content.action.START_INSTALL";
+
+    /**
+     * Intent action: notify user if we are currently running in Dynamic Android.
+     * @hide
+     */
+    public static final String ACTION_NOTIFY_IF_IN_USE =
+            "android.content.action.NOTIFY_IF_IN_USE";
+
+    /*
+     * Intent Keys
+     */
+    /**
+     * Intent key: URL to system image.
+     * @hide
+     */
+    public static final String KEY_SYSTEM_URL = "KEY_SYSTEM_URL";
+
+    /**
+     * Intent key: Size of system image, in bytes.
+     * @hide
+     */
+    public static final String KEY_SYSTEM_SIZE = "KEY_SYSTEM_SIZE";
+
+    /**
+     * Intent key: Number of bytes to reserve for userdata.
+     * @hide
+     */
+    public static final String KEY_USERDATA_SIZE = "KEY_USERDATA_SIZE";
+
+
+    private static class IncomingHandler extends Handler {
+        private final WeakReference<DynamicAndroidClient> mWeakClient;
+
+        IncomingHandler(DynamicAndroidClient service) {
+            super(Looper.getMainLooper());
+            mWeakClient = new WeakReference<>(service);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            DynamicAndroidClient service = mWeakClient.get();
+
+            if (service != null) {
+                service.handleMessage(msg);
+            }
+        }
+    }
+
+    private class DynAndroidServiceConnection implements ServiceConnection {
+        public void onServiceConnected(ComponentName className, IBinder service) {
+            Slog.v(TAG, "DynAndroidService connected");
+
+            mService = new Messenger(service);
+
+            try {
+                Message msg = Message.obtain(null, MSG_REGISTER_LISTENER);
+                msg.replyTo = mMessenger;
+
+                mService.send(msg);
+            } catch (RemoteException e) {
+                Slog.e(TAG, "Unable to get status from installation service");
+                mExecutor.execute(() -> {
+                    mListener.onStatusChanged(STATUS_UNKNOWN, CAUSE_ERROR_IPC, 0);
+                });
+            }
+        }
+
+        public void onServiceDisconnected(ComponentName className) {
+            Slog.v(TAG, "DynAndroidService disconnected");
+            mService = null;
+        }
+    }
+
+    private final Context mContext;
+    private final DynAndroidServiceConnection mConnection;
+    private final Messenger mMessenger;
+
+    private boolean mBound;
+    private Executor mExecutor;
+    private OnStatusChangedListener mListener;
+    private Messenger mService;
+
+    /**
+     * @hide
+     */
+    @SystemApi
+    public DynamicAndroidClient(@NonNull Context context) {
+        mContext = context;
+        mConnection = new DynAndroidServiceConnection();
+        mMessenger = new Messenger(new IncomingHandler(this));
+    }
+
+    /**
+     * This method register a listener for status change. The listener is called using
+     * the executor.
+     */
+    public void setOnStatusChangedListener(
+            @NonNull OnStatusChangedListener listener,
+            @NonNull @CallbackExecutor Executor executor) {
+        mListener = listener;
+        mExecutor = executor;
+    }
+
+    /**
+     * This method register a listener for status change. The listener is called in main
+     * thread.
+     */
+    public void setOnStatusChangedListener(
+            @NonNull OnStatusChangedListener listener) {
+        mListener = listener;
+        mExecutor = null;
+    }
+
+    /**
+     * Bind to DynamicAndroidInstallationService.
+     */
+    public void bind() {
+        Intent intent = new Intent();
+        intent.setClassName("com.android.dynandroid",
+                "com.android.dynandroid.DynamicAndroidInstallationService");
+
+        mContext.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
+
+        mBound = true;
+    }
+
+    /**
+     * Unbind from DynamicAndroidInstallationService.
+     */
+    public void unbind() {
+        if (!mBound) {
+            return;
+        }
+
+        if (mService != null) {
+            try {
+                Message msg = Message.obtain(null, MSG_UNREGISTER_LISTENER);
+                msg.replyTo = mMessenger;
+                mService.send(msg);
+            } catch (RemoteException e) {
+                Slog.e(TAG, "Unable to unregister from installation service");
+            }
+        }
+
+        // Detach our existing connection.
+        mContext.unbindService(mConnection);
+
+        mBound = false;
+    }
+
+    /**
+     * Start installing DynamicAndroid from URL with default userdata size.
+     *
+     * @param systemUrl A network URL or a file URL to system image.
+     * @param systemSize size of system image.
+     */
+    public void start(String systemUrl, long systemSize) {
+        start(systemUrl, systemSize, DEFAULT_USERDATA_SIZE);
+    }
+
+    /**
+     * Start installing DynamicAndroid from URL.
+     *
+     * @param systemUrl A network URL or a file URL to system image.
+     * @param systemSize size of system image.
+     * @param userdataSize bytes reserved for userdata.
+     */
+    public void start(String systemUrl, long systemSize, long userdataSize) {
+        Intent intent = new Intent();
+
+        intent.setClassName("com.android.dynandroid",
+                "com.android.dynandroid.VerificationActivity");
+
+        intent.setAction(ACTION_START_INSTALL);
+
+        intent.putExtra(KEY_SYSTEM_URL, systemUrl);
+        intent.putExtra(KEY_SYSTEM_SIZE, systemSize);
+        intent.putExtra(KEY_USERDATA_SIZE, userdataSize);
+
+        mContext.startActivity(intent);
+    }
+
+    private void handleMessage(Message msg) {
+        switch (msg.what) {
+            case MSG_POST_STATUS:
+                int status = msg.arg1;
+                int cause = msg.arg2;
+                // obj is non-null
+                long progress = ((Bundle) msg.obj).getLong(KEY_INSTALLED_SIZE);
+
+                if (mExecutor != null) {
+                    mExecutor.execute(() -> {
+                        mListener.onStatusChanged(status, cause, progress);
+                    });
+                } else {
+                    mListener.onStatusChanged(status, cause, progress);
+                }
+                break;
+            default:
+                // do nothing
+
+        }
+    }
+}
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 22f73db..a3021f3 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -971,7 +971,8 @@
      *
      * @param target The Intent that the user will be selecting an activity
      * to perform.
-     * @param title Optional title that will be displayed in the chooser.
+     * @param title Optional title that will be displayed in the chooser,
+     * only when the target action is not ACTION_SEND or ACTION_SEND_MULTIPLE.
      * @return Return a new Intent object that you can hand to
      * {@link Context#startActivity(Intent) Context.startActivity()} and
      * related methods.
@@ -998,7 +999,8 @@
      *
      * @param target The Intent that the user will be selecting an activity
      * to perform.
-     * @param title Optional title that will be displayed in the chooser.
+     * @param title Optional title that will be displayed in the chooser,
+     * only when the target action is not ACTION_SEND or ACTION_SEND_MULTIPLE.
      * @param sender Optional IntentSender to be called when a choice is made.
      * @return Return a new Intent object that you can hand to
      * {@link Context#startActivity(Intent) Context.startActivity()} and
@@ -1475,6 +1477,36 @@
     public static final String ACTION_APP_ERROR = "android.intent.action.APP_ERROR";
 
     /**
+     * An incident or bug report has been taken, and a system app has requested it to be shared,
+     * so trigger the confirmation screen.
+     *
+     * This will be sent directly to the registered receiver with the
+     * android.permission.APPROVE_INCIDENT_REPORTS permission.
+     * @hide
+     */
+    @SystemApi
+    public static final String ACTION_PENDING_INCIDENT_REPORTS_CHANGED =
+            "android.intent.action.PENDING_INCIDENT_REPORTS_CHANGED";
+
+    /**
+     * An incident report has been taken, and the user has approved it for sharing.
+     * <p>
+     * This will be sent directly to the registered receiver, which must have
+     * both the DUMP and USAGE_STATS permissions.
+     * <p>
+     * After receiving this, the application should wait until a suitable time
+     * (e.g. network available), get the list of available reports with
+     * {@link IncidentManager#getIncidentReportList IncidentManager.getIncidentReportList(String)}
+     * and then when the reports have been successfully uploaded, call
+     * {@link IncidentManager#deleteIncidentReport IncidentManager.deleteIncidentReport(Uri)}.
+     *
+     * @hide
+     */
+    @SystemApi
+    public static final String ACTION_INCIDENT_REPORT_READY =
+            "android.intent.action.INCIDENT_REPORT_READY";
+
+    /**
      * Activity Action: Show power usage information to the user.
      * <p>Input: Nothing.
      * <p>Output: Nothing.
diff --git a/core/java/android/content/pm/ActivityPresentationInfo.java b/core/java/android/content/pm/ActivityPresentationInfo.java
new file mode 100644
index 0000000..ccc61dc
--- /dev/null
+++ b/core/java/android/content/pm/ActivityPresentationInfo.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.content.pm;
+
+import android.annotation.NonNull;
+import android.content.ComponentName;
+
+/**
+ * Holds basic information about an activity.
+ *
+ * @hide
+ */
+public final class ActivityPresentationInfo {
+    public final int taskId;
+    public final int displayId;
+
+    @NonNull
+    public final ComponentName componentName;
+
+    public ActivityPresentationInfo(int taskId, int displayId,
+            @NonNull ComponentName componentName) {
+        this.taskId = taskId;
+        this.displayId = displayId;
+        this.componentName = componentName;
+    }
+}
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index 5d6d144..b27c5dc 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -640,19 +640,15 @@
     public static final int PRIVATE_FLAG_HAS_FRAGILE_USER_DATA = 1 << 24;
 
     /**
-     * Indicate whether this application prefers code integrity, that is, run only code that is
-     * signed. This requires android:extractNativeLibs to be "false", as well as .dex and .so (if
-     * any) stored uncompressed inside the APK, which is signed. At run time, the implications
-     * include:
-     *
-     * <ul>
-     * <li>ART will JIT the dex code directly from the APK. There may be performance characteristic
-     * changes depend on the actual workload.
-     * </ul>
+     * Indicates whether this application wants to use the embedded dex in the APK, rather than
+     * extracted or locally compiled variants. This keeps the dex code protected by the APK
+     * signature. Such apps will always run in JIT mode (same when they are first installed), and
+     * the system will never generate ahead-of-time compiled code for them. Depending on the app's
+     * workload, there may be some run time performance change, noteably the cold start time.
      *
      * @hide
      */
-    public static final int PRIVATE_FLAG_PREFER_CODE_INTEGRITY = 1 << 25;
+    public static final int PRIVATE_FLAG_USE_EMBEDDED_DEX = 1 << 25;
 
     /** @hide */
     @IntDef(flag = true, prefix = { "PRIVATE_FLAG_" }, value = {
@@ -669,7 +665,7 @@
             PRIVATE_FLAG_ISOLATED_SPLIT_LOADING,
             PRIVATE_FLAG_OEM,
             PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE,
-            PRIVATE_FLAG_PREFER_CODE_INTEGRITY,
+            PRIVATE_FLAG_USE_EMBEDDED_DEX,
             PRIVATE_FLAG_PRIVILEGED,
             PRIVATE_FLAG_PRODUCT,
             PRIVATE_FLAG_PRODUCT_SERVICES,
@@ -1192,6 +1188,9 @@
     /** @hide */
     public boolean hiddenUntilInstalled;
 
+    /** @hide */
+    public String zygotePreloadName;
+
     /**
      * Represents the default policy. The actual policy used will depend on other properties of
      * the application, e.g. the target SDK version.
@@ -1533,6 +1532,7 @@
         compileSdkVersionCodename = orig.compileSdkVersionCodename;
         mHiddenApiPolicy = orig.mHiddenApiPolicy;
         hiddenUntilInstalled = orig.hiddenUntilInstalled;
+        zygotePreloadName = orig.zygotePreloadName;
     }
 
     public String toString() {
@@ -1609,6 +1609,7 @@
         dest.writeString(appComponentFactory);
         dest.writeInt(mHiddenApiPolicy);
         dest.writeInt(hiddenUntilInstalled ? 1 : 0);
+        dest.writeString(zygotePreloadName);
     }
 
     public static final Parcelable.Creator<ApplicationInfo> CREATOR
@@ -1682,6 +1683,7 @@
         appComponentFactory = source.readString();
         mHiddenApiPolicy = source.readInt();
         hiddenUntilInstalled = source.readInt() != 0;
+        zygotePreloadName = source.readString();
     }
 
     /**
@@ -1956,8 +1958,8 @@
     }
 
     /** @hide */
-    public boolean isCodeIntegrityPreferred() {
-        return (privateFlags & PRIVATE_FLAG_PREFER_CODE_INTEGRITY) != 0;
+    public boolean isEmbeddedDexUsed() {
+        return (privateFlags & PRIVATE_FLAG_USE_EMBEDDED_DEX) != 0;
     }
 
     /**
diff --git a/packages/overlays/FontRubikRubikOverlay/res/values/strings.xml b/core/java/android/content/pm/BasicActivityInfo.aidl
similarity index 60%
copy from packages/overlays/FontRubikRubikOverlay/res/values/strings.xml
copy to core/java/android/content/pm/BasicActivityInfo.aidl
index 4bac7da..f04bf9a 100644
--- a/packages/overlays/FontRubikRubikOverlay/res/values/strings.xml
+++ b/core/java/android/content/pm/BasicActivityInfo.aidl
@@ -1,12 +1,11 @@
-<!--
-/**
- * Copyright (c) 2018, The Android Open Source Project
+/*
+ * Copyright (C) 2019 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *     http://www.apache.org/licenses/LICENSE-2.0
+ *      http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -14,8 +13,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
--->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- Headline / Body font Rubik overlay -->
-    <string name="font_rubik_rubik_overlay" translatable="false">Rubik / Rubik</string>
-</resources>
+
+package android.content.pm;
+
+/** @hide */
+parcelable BasicActivityInfo;
diff --git a/core/java/android/content/pm/CrossProfileApps.java b/core/java/android/content/pm/CrossProfileApps.java
index b7366f1..e897b91 100644
--- a/core/java/android/content/pm/CrossProfileApps.java
+++ b/core/java/android/content/pm/CrossProfileApps.java
@@ -18,7 +18,6 @@
 import android.annotation.NonNull;
 import android.annotation.RequiresPermission;
 import android.annotation.SystemApi;
-import android.annotation.UnsupportedAppUsage;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.res.Resources;
@@ -77,18 +76,6 @@
     }
 
     /**
-     * @deprecated use {@link #startActivity(ComponentName, UserHandle)} instead.
-     *
-     * @removed
-     * @hide
-     */
-    @Deprecated
-    @UnsupportedAppUsage
-    public void startAnyActivity(@NonNull ComponentName component, @NonNull UserHandle targetUser) {
-        startActivity(component, targetUser);
-    }
-
-    /**
      * Starts the specified activity of the caller package in the specified profile. Unlike
      * {@link #startMainActivity}, this can start any activity of the caller package, not just
      * the main activity.
diff --git a/core/java/android/content/pm/ILauncherApps.aidl b/core/java/android/content/pm/ILauncherApps.aidl
index d1bc377..50bb3c7 100644
--- a/core/java/android/content/pm/ILauncherApps.aidl
+++ b/core/java/android/content/pm/ILauncherApps.aidl
@@ -24,6 +24,8 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.IOnAppsChangedListener;
 import android.content.pm.LauncherApps;
+import android.content.pm.IPackageInstallerCallback;
+import android.content.pm.PackageInstaller;
 import android.content.pm.ParceledListSlice;
 import android.content.pm.ResolveInfo;
 import android.content.pm.ShortcutInfo;
@@ -44,6 +46,9 @@
             String callingPackage, String packageName, in UserHandle user);
     ActivityInfo resolveActivity(
             String callingPackage, in ComponentName component, in UserHandle user);
+    void startSessionDetailsActivityAsUser(in IApplicationThread caller, String callingPackage,
+                in PackageInstaller.SessionInfo sessionInfo, in Rect sourceBounds, in Bundle opts,
+                in UserHandle user);
     void startActivityAsUser(in IApplicationThread caller, String callingPackage,
             in ComponentName component, in Rect sourceBounds,
             in Bundle opts, in UserHandle user);
@@ -79,4 +84,9 @@
             String callingPackage, String packageName, in UserHandle user);
     IntentSender getShortcutConfigActivityIntent(String callingPackage, in ComponentName component,
             in UserHandle user);
+
+    // Unregister is performed using package installer
+    void registerPackageInstallerCallback(String callingPackage,
+            in IPackageInstallerCallback callback);
+    ParceledListSlice getAllSessions(String callingPackage);
 }
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index 4b130b2..36ffb0e 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -686,6 +686,12 @@
 
     String getWellbeingPackageName();
 
+    String getAppPredictionServicePackageName();
+
+    String getContentCaptureServicePackageName();
+
+    String getIncidentReportApproverPackageName();
+
     boolean isPackageStateProtected(String packageName, int userId);
 
     void sendDeviceCustomizationReadyBroadcast();
diff --git a/core/java/android/content/pm/LauncherApps.java b/core/java/android/content/pm/LauncherApps.java
index 89630e1..b0d16cd 100644
--- a/core/java/android/content/pm/LauncherApps.java
+++ b/core/java/android/content/pm/LauncherApps.java
@@ -16,6 +16,7 @@
 
 package android.content.pm;
 
+import android.annotation.CallbackExecutor;
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -32,6 +33,9 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentSender;
+import android.content.pm.PackageInstaller.SessionCallback;
+import android.content.pm.PackageInstaller.SessionCallbackDelegate;
+import android.content.pm.PackageInstaller.SessionInfo;
 import android.content.pm.PackageManager.ApplicationInfoFlags;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.res.Resources;
@@ -65,7 +69,9 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.List;
+import java.util.concurrent.Executor;
 
 /**
  * Class for retrieving a list of launchable activities for the current user and any associated
@@ -154,8 +160,8 @@
     private final PackageManager mPm;
     private final UserManager mUserManager;
 
-    private List<CallbackMessageHandler> mCallbacks
-            = new ArrayList<CallbackMessageHandler>();
+    private final List<CallbackMessageHandler> mCallbacks = new ArrayList<>();
+    private final List<SessionCallbackDelegate> mDelegates = new ArrayList<>();
 
     /**
      * Callbacks for package changes to this and related managed profiles.
@@ -572,6 +578,24 @@
     }
 
     /**
+     * Starts an activity to show the details of the specified session.
+     *
+     * @param sessionInfo The SessionInfo of the session
+     * @param sourceBounds The Rect containing the source bounds of the clicked icon
+     * @param opts Options to pass to startActivity
+     */
+    public void startPackageInstallerSessionDetailsActivity(SessionInfo sessionInfo,
+            Rect sourceBounds, Bundle opts) {
+        try {
+            mService.startSessionDetailsActivityAsUser(mContext.getIApplicationThread(),
+                    mContext.getPackageName(), sessionInfo, sourceBounds, opts,
+                    sessionInfo.getUser());
+        } catch (RemoteException re) {
+            throw re.rethrowFromSystemServer();
+        }
+    }
+
+    /**
      * Starts the settings activity to show the application details for a
      * package in the specified profile.
      *
@@ -781,6 +805,9 @@
     /**
      * Checks if the activity exists and it enabled for a profile.
      *
+     * <p>The activity may still not be exported, in which case {@link #startMainActivity} will
+     * throw a {@link SecurityException} unless the caller has the same UID as the target app's.
+     *
      * @param component The activity to check.
      * @param user The UserHandle of the profile.
      *
@@ -1128,7 +1155,7 @@
     }
 
     /**
-     * Registers a callback for changes to packages in current and managed profiles.
+     * Registers a callback for changes to packages in this user and managed profiles.
      *
      * @param callback The callback to register.
      */
@@ -1137,7 +1164,7 @@
     }
 
     /**
-     * Registers a callback for changes to packages in current and managed profiles.
+     * Registers a callback for changes to packages in this user and managed profiles.
      *
      * @param callback The callback to register.
      * @param handler that should be used to post callbacks on, may be null.
@@ -1443,6 +1470,64 @@
     }
 
     /**
+     * Register a callback to watch for session lifecycle events in this user and managed profiles.
+     * @param callback The callback to register.
+     * @param executor {@link Executor} to handle the callbacks, cannot be null.
+     *
+     * @see PackageInstaller#registerSessionCallback(SessionCallback)
+     */
+    public void registerPackageInstallerSessionCallback(
+            @NonNull @CallbackExecutor Executor executor, @NonNull SessionCallback callback) {
+        if (executor == null) {
+            throw new NullPointerException("Executor must not be null");
+        }
+
+        synchronized (mDelegates) {
+            final SessionCallbackDelegate delegate = new SessionCallbackDelegate(callback,
+                    executor);
+            try {
+                mService.registerPackageInstallerCallback(mContext.getPackageName(),
+                        delegate);
+            } catch (RemoteException e) {
+                throw e.rethrowFromSystemServer();
+            }
+            mDelegates.add(delegate);
+        }
+    }
+
+    /**
+     * Unregisters a callback that was previously registered.
+     *
+     * @param callback The callback to unregister.
+     * @see #registerPackageInstallerSessionCallback(Executor, SessionCallback)
+     */
+    public void unregisterPackageInstallerSessionCallback(SessionCallback callback) {
+        synchronized (mDelegates) {
+            for (Iterator<SessionCallbackDelegate> i = mDelegates.iterator(); i.hasNext();) {
+                final SessionCallbackDelegate delegate = i.next();
+                if (delegate.mCallback == callback) {
+                    mPm.getPackageInstaller().unregisterSessionCallback(delegate.mCallback);
+                    i.remove();
+                }
+            }
+        }
+    }
+
+    /**
+     * Return list of all known install sessions in this user and managed profiles, regardless
+     * of the installer.
+     *
+     * @see PackageInstaller#getAllSessions()
+     */
+    public @NonNull List<SessionInfo> getAllPackageInstallerSessions() {
+        try {
+            return mService.getAllSessions(mContext.getPackageName()).getList();
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
      * A helper method to extract a {@link PinItemRequest} set to
      * the {@link #EXTRA_PIN_ITEM_REQUEST} extra.
      */
@@ -1658,35 +1743,23 @@
      * A class that encapsulates information about the usage limit set for an app or
      * a group of apps.
      *
-     * <p>The launcher can query specifics about the usage limit such as if it is a group limit,
-     * how much usage time the limit has, and how much of the total usage time is remaining
-     * via the APIs available in this class.
+     * <p>The launcher can query specifics about the usage limit such as how much usage time
+     * the limit has and how much of the total usage time is remaining via the APIs available
+     * in this class.
      *
      * @see #getAppUsageLimit(String, UserHandle)
      */
     public static final class AppUsageLimit implements Parcelable {
-        private final boolean mGroupLimit;
         private final long mTotalUsageLimit;
         private final long mUsageRemaining;
 
         /** @hide */
-        public AppUsageLimit(boolean groupLimit, long totalUsageLimit, long usageRemaining) {
-            this.mGroupLimit = groupLimit;
+        public AppUsageLimit(long totalUsageLimit, long usageRemaining) {
             this.mTotalUsageLimit = totalUsageLimit;
             this.mUsageRemaining = usageRemaining;
         }
 
         /**
-         * Returns whether this limit refers to a group of apps.
-         *
-         * @return {@code TRUE} if the limit refers to a group of apps, {@code FALSE} otherwise.
-         * @hide
-         */
-        public boolean isGroupLimit() {
-            return mGroupLimit;
-        }
-
-        /**
          * Returns the total usage limit in milliseconds set for an app or a group of apps.
          *
          * @return the total usage limit in milliseconds
@@ -1706,7 +1779,6 @@
         }
 
         private AppUsageLimit(Parcel source) {
-            mGroupLimit = source.readBoolean();
             mTotalUsageLimit = source.readLong();
             mUsageRemaining = source.readLong();
         }
@@ -1730,7 +1802,6 @@
 
         @Override
         public void writeToParcel(Parcel dest, int flags) {
-            dest.writeBoolean(mGroupLimit);
             dest.writeLong(mTotalUsageLimit);
             dest.writeLong(mUsageRemaining);
         }
diff --git a/core/java/android/content/pm/ModuleInfo.java b/core/java/android/content/pm/ModuleInfo.java
index 07e640b..044e87d 100644
--- a/core/java/android/content/pm/ModuleInfo.java
+++ b/core/java/android/content/pm/ModuleInfo.java
@@ -32,7 +32,7 @@
      // constructor, and writeToParcel.
 
     /** Public name of this module. */
-    private String mName;
+    private CharSequence mName;
 
     /** The package name of this module. */
     private String mPackageName;
@@ -57,13 +57,13 @@
     }
 
     /** @hide Sets the public name of this module. */
-    public ModuleInfo setName(String name) {
+    public ModuleInfo setName(CharSequence name) {
         mName = name;
         return this;
     }
 
     /** Gets the public name of this module. */
-    public @Nullable String getName() {
+    public @Nullable CharSequence getName() {
         return mName;
     }
 
@@ -123,13 +123,13 @@
 
     /** Flattens this object into the given {@link Parcel}. */
     public void writeToParcel(Parcel dest, int parcelableFlags) {
-        dest.writeString(mName);
+        dest.writeCharSequence(mName);
         dest.writeString(mPackageName);
         dest.writeBoolean(mHidden);
     }
 
     private ModuleInfo(Parcel source) {
-        mName = source.readString();
+        mName = source.readCharSequence();
         mPackageName = source.readString();
         mHidden = source.readBoolean();
     }
diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java
index 2dc014c..8b8f3e5 100644
--- a/core/java/android/content/pm/PackageInstaller.java
+++ b/core/java/android/content/pm/PackageInstaller.java
@@ -36,20 +36,21 @@
 import android.os.Build;
 import android.os.FileBridge;
 import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
+import android.os.HandlerExecutor;
 import android.os.Parcel;
 import android.os.ParcelFileDescriptor;
 import android.os.Parcelable;
 import android.os.ParcelableException;
 import android.os.RemoteException;
 import android.os.SystemProperties;
+import android.os.UserHandle;
 import android.system.ErrnoException;
 import android.system.Os;
 import android.util.ExceptionUtils;
 
 import com.android.internal.util.IndentingPrintWriter;
 import com.android.internal.util.Preconditions;
+import com.android.internal.util.function.pooled.PooledLambda;
 
 import java.io.Closeable;
 import java.io.IOException;
@@ -61,6 +62,7 @@
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.concurrent.Executor;
 
 /**
  * Offers the ability to install, upgrade, and remove applications on the
@@ -659,8 +661,7 @@
     }
 
     /** {@hide} */
-    private static class SessionCallbackDelegate extends IPackageInstallerCallback.Stub implements
-            Handler.Callback {
+    static class SessionCallbackDelegate extends IPackageInstallerCallback.Stub {
         private static final int MSG_SESSION_CREATED = 1;
         private static final int MSG_SESSION_BADGING_CHANGED = 2;
         private static final int MSG_SESSION_ACTIVE_CHANGED = 3;
@@ -668,63 +669,41 @@
         private static final int MSG_SESSION_FINISHED = 5;
 
         final SessionCallback mCallback;
-        final Handler mHandler;
+        final Executor mExecutor;
 
-        public SessionCallbackDelegate(SessionCallback callback, Looper looper) {
+        SessionCallbackDelegate(SessionCallback callback, Executor executor) {
             mCallback = callback;
-            mHandler = new Handler(looper, this);
-        }
-
-        @Override
-        public boolean handleMessage(Message msg) {
-            final int sessionId = msg.arg1;
-            switch (msg.what) {
-                case MSG_SESSION_CREATED:
-                    mCallback.onCreated(sessionId);
-                    return true;
-                case MSG_SESSION_BADGING_CHANGED:
-                    mCallback.onBadgingChanged(sessionId);
-                    return true;
-                case MSG_SESSION_ACTIVE_CHANGED:
-                    final boolean active = msg.arg2 != 0;
-                    mCallback.onActiveChanged(sessionId, active);
-                    return true;
-                case MSG_SESSION_PROGRESS_CHANGED:
-                    mCallback.onProgressChanged(sessionId, (float) msg.obj);
-                    return true;
-                case MSG_SESSION_FINISHED:
-                    mCallback.onFinished(sessionId, msg.arg2 != 0);
-                    return true;
-            }
-            return false;
+            mExecutor = executor;
         }
 
         @Override
         public void onSessionCreated(int sessionId) {
-            mHandler.obtainMessage(MSG_SESSION_CREATED, sessionId, 0).sendToTarget();
+            mExecutor.execute(PooledLambda.obtainRunnable(SessionCallback::onCreated, mCallback,
+                    sessionId).recycleOnUse());
         }
 
         @Override
         public void onSessionBadgingChanged(int sessionId) {
-            mHandler.obtainMessage(MSG_SESSION_BADGING_CHANGED, sessionId, 0).sendToTarget();
+            mExecutor.execute(PooledLambda.obtainRunnable(SessionCallback::onBadgingChanged,
+                    mCallback, sessionId).recycleOnUse());
         }
 
         @Override
         public void onSessionActiveChanged(int sessionId, boolean active) {
-            mHandler.obtainMessage(MSG_SESSION_ACTIVE_CHANGED, sessionId, active ? 1 : 0)
-                    .sendToTarget();
+            mExecutor.execute(PooledLambda.obtainRunnable(SessionCallback::onActiveChanged,
+                    mCallback, sessionId, active).recycleOnUse());
         }
 
         @Override
         public void onSessionProgressChanged(int sessionId, float progress) {
-            mHandler.obtainMessage(MSG_SESSION_PROGRESS_CHANGED, sessionId, 0, progress)
-                    .sendToTarget();
+            mExecutor.execute(PooledLambda.obtainRunnable(SessionCallback::onProgressChanged,
+                    mCallback, sessionId, progress).recycleOnUse());
         }
 
         @Override
         public void onSessionFinished(int sessionId, boolean success) {
-            mHandler.obtainMessage(MSG_SESSION_FINISHED, sessionId, success ? 1 : 0)
-                    .sendToTarget();
+            mExecutor.execute(PooledLambda.obtainRunnable(SessionCallback::onFinished,
+                    mCallback, sessionId, success).recycleOnUse());
         }
     }
 
@@ -758,7 +737,7 @@
     public void registerSessionCallback(@NonNull SessionCallback callback, @NonNull Handler handler) {
         synchronized (mDelegates) {
             final SessionCallbackDelegate delegate = new SessionCallbackDelegate(callback,
-                    handler.getLooper());
+                    new HandlerExecutor(handler));
             try {
                 mInstaller.registerCallback(delegate, mUserId);
             } catch (RemoteException e) {
@@ -1311,6 +1290,28 @@
             isStaged = source.readBoolean();
         }
 
+        /** {@hide} */
+        public SessionParams copy() {
+            SessionParams ret = new SessionParams(mode);
+            ret.installFlags = installFlags;
+            ret.installLocation = installLocation;
+            ret.installReason = installReason;
+            ret.sizeBytes = sizeBytes;
+            ret.appPackageName = appPackageName;
+            ret.appIcon = appIcon;  // not a copy.
+            ret.appLabel = appLabel;
+            ret.originatingUri = originatingUri;  // not a copy, but immutable.
+            ret.originatingUid = originatingUid;
+            ret.referrerUri = referrerUri;  // not a copy, but immutable.
+            ret.abiOverride = abiOverride;
+            ret.volumeUuid = volumeUuid;
+            ret.grantedRuntimePermissions = grantedRuntimePermissions;
+            ret.installerPackageName = installerPackageName;
+            ret.isMultiPackage = isMultiPackage;
+            ret.isStaged = isStaged;
+            return ret;
+        }
+
         /**
          * Check if there are hidden options set.
          *
@@ -1649,6 +1650,8 @@
         @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
         public int sessionId;
         /** {@hide} */
+        public int userId;
+        /** {@hide} */
         @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
         public String installerPackageName;
         /** {@hide} */
@@ -1720,6 +1723,7 @@
         /** {@hide} */
         public SessionInfo(Parcel source) {
             sessionId = source.readInt();
+            userId = source.readInt();
             installerPackageName = source.readString();
             resolvedBaseCodePath = source.readString();
             progress = source.readFloat();
@@ -1761,6 +1765,13 @@
         }
 
         /**
+         * Return the user associated with this session.
+         */
+        public UserHandle getUser() {
+            return new UserHandle(userId);
+        }
+
+        /**
          * Return the package name of the app that owns this session.
          */
         public @Nullable String getInstallerPackageName() {
@@ -2091,6 +2102,7 @@
         @Override
         public void writeToParcel(Parcel dest, int flags) {
             dest.writeInt(sessionId);
+            dest.writeInt(userId);
             dest.writeString(installerPackageName);
             dest.writeString(resolvedBaseCodePath);
             dest.writeFloat(progress);
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 783ee64..e2907e2 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -552,8 +552,6 @@
      * currently active, i.e. mounted and available to other processes of the OS.
      * In particular, this flag alone will not match APEX files that are staged
      * for activation at next reboot.
-     * TODO(b/119767311): include uninstalled/inactive APEX if
-     *                    MATCH_UNINSTALLED_PACKAGES is set.
      */
     public static final int MATCH_APEX = 0x40000000;
 
@@ -2346,14 +2344,7 @@
      * {@link #hasSystemFeature}: The device has biometric hardware to detect a fingerprint.
      */
     @SdkConstant(SdkConstantType.FEATURE)
-    public static final String FEATURE_FINGERPRINT_PRE_29 = "android.hardware.fingerprint";
-
-    /**
-     * Feature for {@link #getSystemAvailableFeatures} and
-     * {@link #hasSystemFeature}: The device has biometric hardware to detect a fingerprint.
-     */
-    @SdkConstant(SdkConstantType.FEATURE)
-    public static final String FEATURE_FINGERPRINT = "android.hardware.biometrics.fingerprint";
+    public static final String FEATURE_FINGERPRINT = "android.hardware.fingerprint";
 
     /**
      * Feature for {@link #getSystemAvailableFeatures} and
@@ -6734,6 +6725,39 @@
     }
 
     /**
+     * @return the system defined app predictor package name, or null if there's none.
+     *
+     * @hide
+     */
+    public String getAppPredictionServicePackageName() {
+        throw new UnsupportedOperationException(
+            "getAppPredictionServicePackageName not implemented in subclass");
+    }
+
+    /**
+     * @return the system defined content capture service package name, or null if there's none.
+     *
+     * @hide
+     */
+    public String getContentCaptureServicePackageName() {
+        throw new UnsupportedOperationException(
+                "getContentCaptureServicePackageName not implemented in subclass");
+    }
+
+    /**
+     * @return the incident report approver app package name, or null if it's not defined
+     * by the OEM.
+     *
+     * @hide
+     */
+    @SystemApi
+    @TestApi
+    public String getIncidentReportApproverPackageName() {
+        throw new UnsupportedOperationException(
+                "getIncidentReportApproverPackageName not implemented in subclass");
+    }
+
+    /**
      * @return whether a given package's state is protected, e.g. package cannot be disabled,
      *         suspended, hidden or force stopped.
      *
diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java
index c9a4c82..4a2dbe7 100644
--- a/core/java/android/content/pm/PackageManagerInternal.java
+++ b/core/java/android/content/pm/PackageManagerInternal.java
@@ -56,6 +56,8 @@
     public static final int PACKAGE_WELLBEING = 7;
     public static final int PACKAGE_DOCUMENTER = 8;
     public static final int PACKAGE_CONFIGURATOR = 9;
+    public static final int PACKAGE_INCIDENT_REPORT_APPROVER = 10;
+    public static final int PACKAGE_APP_PREDICTOR = 11;
     @IntDef(value = {
         PACKAGE_SYSTEM,
         PACKAGE_SETUP_WIZARD,
@@ -67,6 +69,8 @@
         PACKAGE_WELLBEING,
         PACKAGE_DOCUMENTER,
         PACKAGE_CONFIGURATOR,
+        PACKAGE_INCIDENT_REPORT_APPROVER,
+        PACKAGE_APP_PREDICTOR,
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface KnownPackage {}
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index eb59cfc..2c2d6f2 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -475,7 +475,7 @@
         public final boolean extractNativeLibs;
         public final boolean isolatedSplits;
         public final boolean isSplitRequired;
-        public final boolean preferCodeIntegrity;
+        public final boolean useEmbeddedDex;
 
         public ApkLite(String codePath, String packageName, String splitName,
                 boolean isFeatureSplit,
@@ -484,7 +484,7 @@
                 int revisionCode, int installLocation, List<VerifierInfo> verifiers,
                 SigningDetails signingDetails, boolean coreApp,
                 boolean debuggable, boolean multiArch, boolean use32bitAbi,
-                boolean preferCodeIntegrity, boolean extractNativeLibs, boolean isolatedSplits) {
+                boolean useEmbeddedDex, boolean extractNativeLibs, boolean isolatedSplits) {
             this.codePath = codePath;
             this.packageName = packageName;
             this.splitName = splitName;
@@ -501,7 +501,7 @@
             this.debuggable = debuggable;
             this.multiArch = multiArch;
             this.use32bitAbi = use32bitAbi;
-            this.preferCodeIntegrity = preferCodeIntegrity;
+            this.useEmbeddedDex = useEmbeddedDex;
             this.extractNativeLibs = extractNativeLibs;
             this.isolatedSplits = isolatedSplits;
             this.isSplitRequired = isSplitRequired;
@@ -1726,7 +1726,7 @@
         boolean isolatedSplits = false;
         boolean isFeatureSplit = false;
         boolean isSplitRequired = false;
-        boolean preferCodeIntegrity = false;
+        boolean useEmbeddedDex = false;
         String configForSplit = null;
         String usesSplitName = null;
 
@@ -1790,8 +1790,8 @@
                         extractNativeLibsProvided = Boolean.valueOf(
                                 attrs.getAttributeBooleanValue(i, true));
                     }
-                    if ("preferCodeIntegrity".equals(attr)) {
-                        preferCodeIntegrity = attrs.getAttributeBooleanValue(i, false);
+                    if ("useEmbeddedDex".equals(attr)) {
+                        useEmbeddedDex = attrs.getAttributeBooleanValue(i, false);
                     }
                 }
             } else if (TAG_USES_SPLIT.equals(parser.getName())) {
@@ -1851,16 +1851,10 @@
         final boolean extractNativeLibs = (extractNativeLibsProvided != null)
                 ? extractNativeLibsProvided : extractNativeLibsDefault;
 
-        if (preferCodeIntegrity && extractNativeLibs) {
-            throw new PackageParserException(
-                    PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED,
-                    "Can't request both preferCodeIntegrity and extractNativeLibs");
-        }
-
         return new ApkLite(codePath, packageSplit.first, packageSplit.second, isFeatureSplit,
                 configForSplit, usesSplitName, isSplitRequired, versionCode, versionCodeMajor,
                 revisionCode, installLocation, verifiers, signingDetails, coreApp, debuggable,
-                multiArch, use32bitAbi, preferCodeIntegrity, extractNativeLibs, isolatedSplits);
+                multiArch, use32bitAbi, useEmbeddedDex, extractNativeLibs, isolatedSplits);
     }
 
     /**
@@ -3789,9 +3783,9 @@
         }
 
         if (sa.getBoolean(
-                R.styleable.AndroidManifestApplication_preferCodeIntegrity,
+                R.styleable.AndroidManifestApplication_useEmbeddedDex,
                 false)) {
-            ai.privateFlags |= ApplicationInfo.PRIVATE_FLAG_PREFER_CODE_INTEGRITY;
+            ai.privateFlags |= ApplicationInfo.PRIVATE_FLAG_USE_EMBEDDED_DEX;
         }
 
         if (sa.getBoolean(
@@ -3907,6 +3901,9 @@
             outError[0] = "Invalid class loader name: " + ai.classLoaderName;
         }
 
+        ai.zygotePreloadName = sa.getString(
+                com.android.internal.R.styleable.AndroidManifestApplication_zygotePreloadName);
+
         sa.recycle();
 
         if (outError[0] != null) {
@@ -4426,7 +4423,7 @@
         a.owner = owner;
         a.setPackageName(owner.packageName);
 
-        a.info.theme = 0;
+        a.info.theme = android.R.style.Theme_NoDisplay;
         a.info.exported = true;
         a.info.name = AppDetailsActivity.class.getName();
         a.info.processName = owner.applicationInfo.processName;
@@ -5573,7 +5570,7 @@
 
         s.info.mForegroundServiceType = sa.getInt(
                 com.android.internal.R.styleable.AndroidManifestService_foregroundServiceType,
-                ServiceInfo.FOREGROUND_SERVICE_TYPE_UNSPECIFIED);
+                ServiceInfo.FOREGROUND_SERVICE_TYPE_NONE);
 
         s.info.flags = 0;
         if (sa.getBoolean(
diff --git a/core/java/android/content/pm/PermissionInfo.java b/core/java/android/content/pm/PermissionInfo.java
index 5d2cf0a..fb63e0d 100644
--- a/core/java/android/content/pm/PermissionInfo.java
+++ b/core/java/android/content/pm/PermissionInfo.java
@@ -213,6 +213,27 @@
     @TestApi
     public static final int PROTECTION_FLAG_CONFIGURATOR = 0x80000;
 
+    /**
+     * Additional flag for {${link #protectionLevel}, corresponding
+     * to the <code>incident_report_approver</code> value of
+     * {@link android.R.attr#protectionLevel}.
+     *
+     * @hide
+     */
+    @SystemApi
+    @TestApi
+    public static final int PROTECTION_FLAG_INCIDENT_REPORT_APPROVER = 0x100000;
+
+    /**
+     * Additional flag for {@link #protectionLevel}, corresponding
+     * to the <code>app_predictor</code> value of
+     * {@link android.R.attr#protectionLevel}.
+     *
+     * @hide
+     */
+    @SystemApi
+    @TestApi
+    public static final int PROTECTION_FLAG_APP_PREDICTOR = 0x200000;
 
     /** @hide */
     @IntDef(flag = true, prefix = { "PROTECTION_FLAG_" }, value = {
@@ -233,6 +254,8 @@
             PROTECTION_FLAG_WELLBEING,
             PROTECTION_FLAG_DOCUMENTER,
             PROTECTION_FLAG_CONFIGURATOR,
+            PROTECTION_FLAG_INCIDENT_REPORT_APPROVER,
+            PROTECTION_FLAG_APP_PREDICTOR,
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface ProtectionFlags {}
@@ -431,6 +454,12 @@
         if ((level & PROTECTION_FLAG_CONFIGURATOR) != 0) {
             protLevel += "|configurator";
         }
+        if ((level & PermissionInfo.PROTECTION_FLAG_INCIDENT_REPORT_APPROVER) != 0) {
+            protLevel += "|incidentReportApprover";
+        }
+        if ((level & PermissionInfo.PROTECTION_FLAG_APP_PREDICTOR) != 0) {
+            protLevel += "|appPredictor";
+        }
         return protLevel;
     }
 
diff --git a/core/java/android/content/pm/RegisteredServicesCache.java b/core/java/android/content/pm/RegisteredServicesCache.java
index a8c3b88..b0b1874 100644
--- a/core/java/android/content/pm/RegisteredServicesCache.java
+++ b/core/java/android/content/pm/RegisteredServicesCache.java
@@ -17,6 +17,7 @@
 package android.content.pm;
 
 import android.Manifest;
+import android.annotation.Nullable;
 import android.annotation.UnsupportedAppUsage;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
@@ -176,7 +177,8 @@
         mContext.registerReceiver(mUserRemovedReceiver, userFilter);
     }
 
-    private final void handlePackageEvent(Intent intent, int userId) {
+    @VisibleForTesting
+    protected void handlePackageEvent(Intent intent, int userId) {
         // Don't regenerate the services map when the package is removed or its
         // ASEC container unmounted as a step in replacement.  The subsequent
         // _ADDED / _AVAILABLE call will regenerate the map in the final state.
@@ -238,6 +240,9 @@
 
     public void invalidateCache(int userId) {
         synchronized (mServicesLock) {
+            if (DEBUG) {
+                Slog.d(TAG, "invalidating cache for " + userId + " " + mInterfaceName);
+            }
             final UserServices<V> user = findOrCreateUserLocked(userId);
             user.services = null;
             onServicesChangedLocked(userId);
@@ -289,9 +294,11 @@
         }
 
         final RegisteredServicesCacheListener<V> listener2 = listener;
-        handler.post(new Runnable() {
-            public void run() {
+        handler.post(() -> {
+            try {
                 listener2.onServiceChanged(type, userId, removed);
+            } catch (Throwable th) {
+                Slog.wtf(TAG, "Exception from onServiceChanged", th);
             }
         });
     }
@@ -465,34 +472,48 @@
      *                    or null to assume that everything is affected.
      * @param userId the user for whom to update the services map.
      */
-    private void generateServicesMap(int[] changedUids, int userId) {
+    private void generateServicesMap(@Nullable int[] changedUids, int userId) {
         if (DEBUG) {
             Slog.d(TAG, "generateServicesMap() for " + userId + ", changed UIDs = "
                     + Arrays.toString(changedUids));
         }
 
-        final ArrayList<ServiceInfo<V>> serviceInfos = new ArrayList<>();
-        final List<ResolveInfo> resolveInfos = queryIntentServices(userId);
-        for (ResolveInfo resolveInfo : resolveInfos) {
-            try {
-                ServiceInfo<V> info = parseServiceInfo(resolveInfo);
-                if (info == null) {
-                    Log.w(TAG, "Unable to load service info " + resolveInfo.toString());
-                    continue;
-                }
-                serviceInfos.add(info);
-            } catch (XmlPullParserException|IOException e) {
-                Log.w(TAG, "Unable to load service info " + resolveInfo.toString(), e);
-            }
-        }
-
         synchronized (mServicesLock) {
             final UserServices<V> user = findOrCreateUserLocked(userId);
-            final boolean firstScan = user.services == null;
-            if (firstScan) {
+            final boolean cacheInvalid = user.services == null;
+            if (cacheInvalid) {
                 user.services = Maps.newHashMap();
             }
 
+            final ArrayList<ServiceInfo<V>> serviceInfos = new ArrayList<>();
+            final List<ResolveInfo> resolveInfos = queryIntentServices(userId);
+
+            for (ResolveInfo resolveInfo : resolveInfos) {
+                try {
+                    // when changedUids == null, we want to do a rescan of everything, this means
+                    // it's the initial scan, and containsUid will trivially return true
+                    // when changedUids != null, we got here because a package changed, but
+                    // invalidateCache could have been called (thus user.services == null), and we
+                    // should query from PackageManager again
+                    if (!cacheInvalid
+                            && !containsUid(
+                                    changedUids, resolveInfo.serviceInfo.applicationInfo.uid)) {
+                        if (DEBUG) {
+                            Slog.d(TAG, "Skipping parseServiceInfo for " + resolveInfo);
+                        }
+                        continue;
+                    }
+                    ServiceInfo<V> info = parseServiceInfo(resolveInfo);
+                    if (info == null) {
+                        Log.w(TAG, "Unable to load service info " + resolveInfo.toString());
+                        continue;
+                    }
+                    serviceInfos.add(info);
+                } catch (XmlPullParserException | IOException e) {
+                    Log.w(TAG, "Unable to load service info " + resolveInfo.toString(), e);
+                }
+            }
+
             StringBuilder changes = new StringBuilder();
             boolean changed = false;
             for (ServiceInfo<V> info : serviceInfos) {
@@ -513,7 +534,7 @@
                     changed = true;
                     user.services.put(info.type, info);
                     user.persistentServices.put(info.type, info.uid);
-                    if (!(user.mPersistentServicesFileDidNotExist && firstScan)) {
+                    if (!(user.mPersistentServicesFileDidNotExist && cacheInvalid)) {
                         notifyListener(info.type, userId, false /* removed */);
                     }
                 } else if (previousUid == info.uid) {
diff --git a/core/java/android/content/pm/ServiceInfo.java b/core/java/android/content/pm/ServiceInfo.java
index 8300c0c..60475de 100644
--- a/core/java/android/content/pm/ServiceInfo.java
+++ b/core/java/android/content/pm/ServiceInfo.java
@@ -101,77 +101,73 @@
     /**
      * The default foreground service type if not been set in manifest file.
      */
-    public static final int FOREGROUND_SERVICE_TYPE_UNSPECIFIED = 0;
+    public static final int FOREGROUND_SERVICE_TYPE_NONE = 0;
 
     /**
-     * Constant corresponding to <code>sync</code> in
+     * Constant corresponding to <code>dataSync</code> in
      * the {@link android.R.attr#foregroundServiceType} attribute.
      * Data(photo, file, account) upload/download, backup/restore, import/export, fetch,
      * transfer over network between device and cloud.
      */
-    public static final int FOREGROUND_SERVICE_TYPE_SYNC = 1;
+    public static final int FOREGROUND_SERVICE_TYPE_DATA_SYNC = 1 << 0;
 
     /**
-     * Constant corresponding to <code>mediaPlay</code> in
+     * Constant corresponding to <code>mediaPlayback</code> in
      * the {@link android.R.attr#foregroundServiceType} attribute.
-     * Music, video, news or other media play.
+     * Music, video, news or other media playback.
      */
-    public static final int FOREGROUND_SERVICE_TYPE_MEDIA_PLAY = 2;
+    public static final int FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK = 1 << 1;
 
     /**
      * Constant corresponding to <code>phoneCall</code> in
      * the {@link android.R.attr#foregroundServiceType} attribute.
      * Ongoing phone call or video conference.
      */
-    public static final int FOREGROUND_SERVICE_TYPE_PHONE_CALL = 3;
+    public static final int FOREGROUND_SERVICE_TYPE_PHONE_CALL = 1 << 2;
 
     /**
      * Constant corresponding to <code>location</code> in
      * the {@link android.R.attr#foregroundServiceType} attribute.
      * GPS, map, navigation location update.
      */
-    public static final int FOREGROUND_SERVICE_TYPE_LOCATION = 4;
+    public static final int FOREGROUND_SERVICE_TYPE_LOCATION = 1 << 3;
 
     /**
-     * Constant corresponding to <code>deviceCompanion</code> in
+     * Constant corresponding to <code>connectedDevice</code> in
      * the {@link android.R.attr#foregroundServiceType} attribute.
      * Auto, bluetooth, TV or other devices connection, monitoring and interaction.
      */
-    public static final int FOREGROUND_SERVICE_TYPE_DEVICE_COMPANION = 5;
+    public static final int FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE = 1 << 4;
 
     /**
-     * Constant corresponding to <code>ongoingProcess</code> in
-     * the {@link android.R.attr#foregroundServiceType} attribute.
-     * Process that should not be interrupted, including installation, setup, photo
-     * compression etc.
+     * A special value indicates to use all types set in manifest file.
      */
-    public static final int FOREGROUND_SERVICE_TYPE_ONGOING_PROCESS = 6;
+    public static final int FOREGROUND_SERVICE_TYPE_MANIFEST = -1;
 
     /**
-     * The enumeration of values for foreground service type.
+     * The set of flags for foreground service type.
      * The foreground service type is set in {@link android.R.attr#foregroundServiceType}
      * attribute.
      * @hide
      */
-    @IntDef(flag = false, prefix = { "FOREGROUND_SERVICE_TYPE_" }, value = {
-            FOREGROUND_SERVICE_TYPE_UNSPECIFIED,
-            FOREGROUND_SERVICE_TYPE_SYNC,
-            FOREGROUND_SERVICE_TYPE_MEDIA_PLAY,
+    @IntDef(flag = true, prefix = { "FOREGROUND_SERVICE_TYPE_" }, value = {
+            FOREGROUND_SERVICE_TYPE_NONE,
+            FOREGROUND_SERVICE_TYPE_DATA_SYNC,
+            FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK,
             FOREGROUND_SERVICE_TYPE_PHONE_CALL,
             FOREGROUND_SERVICE_TYPE_LOCATION,
-            FOREGROUND_SERVICE_TYPE_DEVICE_COMPANION,
-            FOREGROUND_SERVICE_TYPE_ONGOING_PROCESS
+            FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE,
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface ForegroundServiceType {}
 
     /**
      * The type of foreground service, set in
-     * {@link android.R.attr#foregroundServiceType} attribute, one value in
+     * {@link android.R.attr#foregroundServiceType} attribute by ORing flags in
      * {@link ForegroundServiceType}
      * @hide
      */
-    public @ForegroundServiceType int mForegroundServiceType = FOREGROUND_SERVICE_TYPE_UNSPECIFIED;
+    public @ForegroundServiceType int mForegroundServiceType = FOREGROUND_SERVICE_TYPE_NONE;
 
     public ServiceInfo() {
     }
@@ -217,6 +213,7 @@
         super.writeToParcel(dest, parcelableFlags);
         dest.writeString(permission);
         dest.writeInt(flags);
+        dest.writeInt(mForegroundServiceType);
     }
 
     public static final Creator<ServiceInfo> CREATOR =
@@ -233,5 +230,6 @@
         super(source);
         permission = source.readString();
         flags = source.readInt();
+        mForegroundServiceType = source.readInt();
     }
 }
diff --git a/core/java/android/content/pm/TEST_MAPPING b/core/java/android/content/pm/TEST_MAPPING
new file mode 100644
index 0000000..a2e98cc
--- /dev/null
+++ b/core/java/android/content/pm/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+  "imports": [
+    {
+      "path": "system/apex/tests"
+    }
+  ]
+}
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java
index baf64ad..59db49e 100644
--- a/core/java/android/content/res/Resources.java
+++ b/core/java/android/content/res/Resources.java
@@ -1394,6 +1394,17 @@
         mResourcesImpl.getValue(name, outValue, resolveRefs);
     }
 
+
+    /**
+     * @param set AttributeSet for which we want to find the source.
+     * @return The resource id for the source that is backing the given AttributeSet
+     * @hide
+     */
+    @AnyRes
+    public static int getAttributeSetSourceResId(@Nullable AttributeSet set) {
+        return ResourcesImpl.getAttributeSetSourceResId(set);
+    }
+
     /**
      * This class holds the current attribute values for a particular theme.
      * In other words, a Theme is a set of values for resource attributes;
diff --git a/core/java/android/content/res/ResourcesImpl.java b/core/java/android/content/res/ResourcesImpl.java
index d8564d5..9898079 100644
--- a/core/java/android/content/res/ResourcesImpl.java
+++ b/core/java/android/content/res/ResourcesImpl.java
@@ -15,6 +15,8 @@
  */
 package android.content.res;
 
+import static android.content.res.Resources.ID_NULL;
+
 import android.animation.Animator;
 import android.animation.StateListAnimator;
 import android.annotation.AnyRes;
@@ -1222,7 +1224,7 @@
                     for (int i = 0; i < num; i++) {
                         if (cachedXmlBlockCookies[i] == assetCookie && cachedXmlBlockFiles[i] != null
                                 && cachedXmlBlockFiles[i].equals(file)) {
-                            return cachedXmlBlocks[i].newParser();
+                            return cachedXmlBlocks[i].newParser(id);
                         }
                     }
 
@@ -1239,7 +1241,7 @@
                         cachedXmlBlockCookies[pos] = assetCookie;
                         cachedXmlBlockFiles[pos] = file;
                         cachedXmlBlocks[pos] = block;
-                        return block.newParser();
+                        return block.newParser(id);
                     }
                 }
             } catch (Exception e) {
@@ -1299,6 +1301,14 @@
         }
     }
 
+    @AnyRes
+    static int getAttributeSetSourceResId(@Nullable AttributeSet set) {
+        if (set == null) {
+            return ID_NULL;
+        }
+        return ((XmlBlock.Parser) set).getSourceResId();
+    }
+
     LongSparseArray<Drawable.ConstantState> getPreloadedDrawables() {
         return sPreloadedDrawables[0];
     }
diff --git a/core/java/android/content/res/XmlBlock.java b/core/java/android/content/res/XmlBlock.java
index 4e1159a..d8c3dde 100644
--- a/core/java/android/content/res/XmlBlock.java
+++ b/core/java/android/content/res/XmlBlock.java
@@ -16,6 +16,9 @@
 
 package android.content.res;
 
+import static android.content.res.Resources.ID_NULL;
+
+import android.annotation.AnyRes;
 import android.annotation.Nullable;
 import android.annotation.UnsupportedAppUsage;
 import android.util.TypedValue;
@@ -73,19 +76,29 @@
 
     @UnsupportedAppUsage
     public XmlResourceParser newParser() {
+        return newParser(ID_NULL);
+    }
+
+    public XmlResourceParser newParser(@AnyRes int resId) {
         synchronized (this) {
             if (mNative != 0) {
-                return new Parser(nativeCreateParseState(mNative), this);
+                return new Parser(nativeCreateParseState(mNative), this, resId);
             }
             return null;
         }
     }
 
     /*package*/ final class Parser implements XmlResourceParser {
-        Parser(long parseState, XmlBlock block) {
+        Parser(long parseState, XmlBlock block, @AnyRes int sourceResId) {
             mParseState = parseState;
             mBlock = block;
             block.mOpenCount++;
+            mSourceResId = sourceResId;
+        }
+
+        @AnyRes
+        public int getSourceResId() {
+            return mSourceResId;
         }
 
         public void setFeature(String name, boolean state) throws XmlPullParserException {
@@ -473,6 +486,7 @@
         private boolean mDecNextDepth = false;
         private int mDepth = 0;
         private int mEventType = START_DOCUMENT;
+        private @AnyRes int mSourceResId;
     }
 
     protected void finalize() throws Throwable {
diff --git a/core/java/android/content/rollback/IRollbackManager.aidl b/core/java/android/content/rollback/IRollbackManager.aidl
index 226d76a..104661f 100644
--- a/core/java/android/content/rollback/IRollbackManager.aidl
+++ b/core/java/android/content/rollback/IRollbackManager.aidl
@@ -26,13 +26,13 @@
     ParceledListSlice getAvailableRollbacks();
     ParceledListSlice getRecentlyExecutedRollbacks();
 
-    void commitRollback(int rollbackId, String callerPackageName,
-            in IntentSender statusReceiver);
+    void commitRollback(int rollbackId, in ParceledListSlice causePackages,
+            String callerPackageName, in IntentSender statusReceiver);
 
     // Exposed for use from the system server only. Callback from the package
     // manager during the install flow when user data can be restored for a given
     // package.
-    void restoreUserData(String packageName, int userId, int appId, long ceDataInode,
+    void restoreUserData(String packageName, in int[] userIds, int appId, long ceDataInode,
             String seInfo, int token);
 
     // Exposed for test purposes only.
diff --git a/core/java/android/content/rollback/PackageRollbackInfo.java b/core/java/android/content/rollback/PackageRollbackInfo.java
index 4644a83..d4ed35a 100644
--- a/core/java/android/content/rollback/PackageRollbackInfo.java
+++ b/core/java/android/content/rollback/PackageRollbackInfo.java
@@ -16,10 +16,14 @@
 
 package android.content.rollback;
 
+import android.annotation.NonNull;
 import android.annotation.SystemApi;
 import android.content.pm.VersionedPackage;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.util.IntArray;
+
+import java.util.ArrayList;
 
 /**
  * Information about a rollback available for a particular package.
@@ -33,6 +37,38 @@
     private final VersionedPackage mVersionRolledBackTo;
 
     /**
+     * Encapsulates information required to restore a snapshot of an app's userdata.
+     *
+     * @hide
+     */
+    public static class RestoreInfo {
+        public final int userId;
+        public final int appId;
+        public final String seInfo;
+
+        public RestoreInfo(int userId, int appId, String seInfo) {
+            this.userId = userId;
+            this.appId = appId;
+            this.seInfo = seInfo;
+        }
+    }
+
+    /*
+     * The list of users for which we need to backup userdata for this package. Backups of
+     * credential encrypted data are listed as pending if the user hasn't unlocked their device
+     * with credentials yet.
+     */
+    // NOTE: Not a part of the Parcelable representation of this object.
+    private final IntArray mPendingBackups;
+
+    /**
+     * The list of users for which we need to restore userdata for this package. This field is
+     * non-null only after a rollback for this package has been committed.
+     */
+    // NOTE: Not a part of the Parcelable representation of this object.
+    private final ArrayList<RestoreInfo> mPendingRestores;
+
+    /**
      * Returns the name of the package to roll back from.
      */
     public String getPackageName() {
@@ -54,15 +90,46 @@
     }
 
     /** @hide */
+    public IntArray getPendingBackups() {
+        return mPendingBackups;
+    }
+
+    /** @hide */
+    public ArrayList<RestoreInfo> getPendingRestores() {
+        return mPendingRestores;
+    }
+
+    /** @hide */
+    public RestoreInfo getRestoreInfo(int userId) {
+        for (RestoreInfo ri : mPendingRestores) {
+            if (ri.userId == userId) {
+                return ri;
+            }
+        }
+
+        return null;
+    }
+
+    /** @hide */
+    public void removeRestoreInfo(RestoreInfo ri) {
+        mPendingRestores.remove(ri);
+    }
+
+    /** @hide */
     public PackageRollbackInfo(VersionedPackage packageRolledBackFrom,
-            VersionedPackage packageRolledBackTo) {
+            VersionedPackage packageRolledBackTo,
+            @NonNull IntArray pendingBackups, @NonNull ArrayList<RestoreInfo> pendingRestores) {
         this.mVersionRolledBackFrom = packageRolledBackFrom;
         this.mVersionRolledBackTo = packageRolledBackTo;
+        this.mPendingBackups = pendingBackups;
+        this.mPendingRestores = pendingRestores;
     }
 
     private PackageRollbackInfo(Parcel in) {
         this.mVersionRolledBackFrom = VersionedPackage.CREATOR.createFromParcel(in);
         this.mVersionRolledBackTo = VersionedPackage.CREATOR.createFromParcel(in);
+        this.mPendingRestores = null;
+        this.mPendingBackups = null;
     }
 
     @Override
diff --git a/core/java/android/content/rollback/RollbackInfo.java b/core/java/android/content/rollback/RollbackInfo.java
index 812f995..3fd2476 100644
--- a/core/java/android/content/rollback/RollbackInfo.java
+++ b/core/java/android/content/rollback/RollbackInfo.java
@@ -18,6 +18,7 @@
 
 import android.annotation.SystemApi;
 import android.content.pm.PackageInstaller;
+import android.content.pm.VersionedPackage;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -39,15 +40,20 @@
 
     private final List<PackageRollbackInfo> mPackages;
 
+    private final List<VersionedPackage> mCausePackages;
+
     /** @hide */
-    public RollbackInfo(int rollbackId, List<PackageRollbackInfo> packages) {
+    public RollbackInfo(int rollbackId, List<PackageRollbackInfo> packages,
+            List<VersionedPackage> causePackages) {
         this.mRollbackId = rollbackId;
         this.mPackages = packages;
+        this.mCausePackages = causePackages;
     }
 
     private RollbackInfo(Parcel in) {
         mRollbackId = in.readInt();
         mPackages = in.createTypedArrayList(PackageRollbackInfo.CREATOR);
+        mCausePackages = in.createTypedArrayList(VersionedPackage.CREATOR);
     }
 
     /**
@@ -77,11 +83,20 @@
      * Returns the session ID for the committed rollback for staged rollbacks.
      * Only applicable for rollbacks that have been committed.
      */
-    public int getSessionId() {
+    public int getCommittedSessionId() {
         // TODO: Support rollback of staged installs.
         return PackageInstaller.SessionInfo.INVALID_ID;
     }
 
+    /**
+     * Gets the list of package versions that motivated this rollback.
+     * As provided to {@link #commitRollback} when the rollback was committed.
+     * This is only applicable for rollbacks that have been committed.
+     */
+    public List<VersionedPackage> getCausePackages() {
+        return mCausePackages;
+    }
+
     @Override
     public int describeContents() {
         return 0;
@@ -91,6 +106,7 @@
     public void writeToParcel(Parcel out, int flags) {
         out.writeInt(mRollbackId);
         out.writeTypedList(mPackages);
+        out.writeTypedList(mCausePackages);
     }
 
     public static final Parcelable.Creator<RollbackInfo> CREATOR =
diff --git a/core/java/android/content/rollback/RollbackManager.java b/core/java/android/content/rollback/RollbackManager.java
index f8abcfc..2788f82 100644
--- a/core/java/android/content/rollback/RollbackManager.java
+++ b/core/java/android/content/rollback/RollbackManager.java
@@ -22,6 +22,8 @@
 import android.annotation.SystemService;
 import android.content.Context;
 import android.content.IntentSender;
+import android.content.pm.ParceledListSlice;
+import android.content.pm.VersionedPackage;
 import android.os.RemoteException;
 
 import java.util.List;
@@ -91,6 +93,50 @@
     }
 
     /**
+     * Status of a rollback commit. Will be one of
+     * {@link #STATUS_SUCCESS}, {@link #STATUS_FAILURE},
+     * {@link #STATUS_FAILURE_ROLLBACK_UNAVAILABLE}, {@link #STATUS_FAILURE_INSTALL}
+     *
+     * @see Intent#getIntExtra(String, int)
+     */
+    public static final String EXTRA_STATUS = "android.content.rollback.extra.STATUS";
+
+    /**
+     * Detailed string representation of the status, including raw details that
+     * are useful for debugging.
+     *
+     * @see Intent#getStringExtra(String)
+     */
+    public static final String EXTRA_STATUS_MESSAGE =
+            "android.content.rollback.extra.STATUS_MESSAGE";
+
+    /**
+     * The rollback was successfully committed.
+     */
+    public static final int STATUS_SUCCESS = 0;
+
+    /**
+     * The rollback could not be committed due to some generic failure.
+     *
+     * @see #EXTRA_STATUS_MESSAGE
+     */
+    public static final int STATUS_FAILURE = 1;
+
+    /**
+     * The rollback could not be committed because it was no longer available.
+     *
+     * @see #EXTRA_STATUS_MESSAGE
+     */
+    public static final int STATUS_FAILURE_ROLLBACK_UNAVAILABLE = 2;
+
+    /**
+     * The rollback failed to install successfully.
+     *
+     * @see #EXTRA_STATUS_MESSAGE
+     */
+    public static final int STATUS_FAILURE_INSTALL = 3;
+
+    /**
      * Commit the rollback with given id, rolling back all versions of the
      * packages to the last good versions previously installed on the device
      * as specified in the corresponding RollbackInfo object. The
@@ -99,18 +145,22 @@
      * rollback object, which can happen if a package has been updated or a
      * rollback expired since the rollback object was retrieved from
      * {@link #getAvailableRollbacks()}.
-     * <p>
-     * TODO: Specify the returns status codes.
      *
      * @param rollbackId ID of the rollback to commit
-     * @param statusReceiver where to deliver the results
+     * @param causePackages package versions to record as the motivation for this
+     *                      rollback.
+     * @param statusReceiver where to deliver the results. Intents sent to
+     *                       this receiver contain {@link #EXTRA_STATUS}
+     *                       and {@link #EXTRA_STATUS_MESSAGE}.
      * @throws SecurityException if the caller does not have the
      *            MANAGE_ROLLBACKS permission.
      */
     @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS)
-    public void commitRollback(int rollbackId, @NonNull IntentSender statusReceiver) {
+    public void commitRollback(int rollbackId, @NonNull List<VersionedPackage> causePackages,
+            @NonNull IntentSender statusReceiver) {
         try {
-            mBinder.commitRollback(rollbackId, mCallerPackageName, statusReceiver);
+            mBinder.commitRollback(rollbackId, new ParceledListSlice(causePackages),
+                    mCallerPackageName, statusReceiver);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java
index f9c2c3e..a1b0803 100644
--- a/core/java/android/database/sqlite/SQLiteDatabase.java
+++ b/core/java/android/database/sqlite/SQLiteDatabase.java
@@ -2644,10 +2644,29 @@
              * Sets the maximum number of milliseconds that SQLite connection is allowed to be idle
              * before it is closed and removed from the pool.
              *
+             * <p>DO NOT USE this method unless you fully understand the implication
+             * of what it does.
+             * A connection timeout allows the system to internally close a connection to a SQLite
+             * database after a given timeout.
+             * This is good for reducing app's memory consumption, but it has
+             * side effects that are hard to predict. For example, SQLite internally maintains
+             * a lot of "per-connection" states that apps can typically modify with a {@code PRAGMA}
+             * statement, and such states will be reset once the connection is closed.
+             * The system does not provide a callback that would allow apps to
+             * reconfigure a newly created connection and thus there's no way to re-configure
+             * connections when they're re-made internally. Do not use it unless you're sure
+             * your app uses no per-connection states.
+             *
              * @param idleConnectionTimeoutMs timeout in milliseconds. Use {@link Long#MAX_VALUE}
              * to allow unlimited idle connections.
+             *
+             * @see SQLiteOpenHelper#setIdleConnectionTimeout(long)
+             *
+             * @deprecated DO NOT USE this method unless you fully understand the implication
+             * of what it does.
              */
             @NonNull
+            @Deprecated
             public Builder setIdleConnectionTimeout(
                     @IntRange(from = 0) long idleConnectionTimeoutMs) {
                 Preconditions.checkArgument(idleConnectionTimeoutMs >= 0,
diff --git a/core/java/android/database/sqlite/SQLiteOpenHelper.java b/core/java/android/database/sqlite/SQLiteOpenHelper.java
index 19c6745..ceeecbc 100644
--- a/core/java/android/database/sqlite/SQLiteOpenHelper.java
+++ b/core/java/android/database/sqlite/SQLiteOpenHelper.java
@@ -263,9 +263,21 @@
      * <p>This method should be called from the constructor of the subclass,
      * before opening the database
      *
+     * <p>DO NOT USE this method unless you fully understand the implication
+     * of what it does.
+     * See the javadoc of
+     * {@link SQLiteDatabase.OpenParams.Builder#setIdleConnectionTimeout(long)}
+     * for the details.
+     *
      * @param idleConnectionTimeoutMs timeout in milliseconds. Use {@link Long#MAX_VALUE} value
      * to allow unlimited idle connections.
+     *
+     * @see SQLiteDatabase.OpenParams.Builder#setIdleConnectionTimeout(long)
+     *
+     * @deprecated DO NOT USE this method unless you fully understand the implication
+     * of what it does.
      */
+    @Deprecated
     public void setIdleConnectionTimeout(@IntRange(from = 0) final long idleConnectionTimeoutMs) {
         synchronized (this) {
             if (mDatabase != null && mDatabase.isOpen()) {
diff --git a/core/java/android/hardware/HardwareBuffer.java b/core/java/android/hardware/HardwareBuffer.java
index 5d4928c..475be49 100644
--- a/core/java/android/hardware/HardwareBuffer.java
+++ b/core/java/android/hardware/HardwareBuffer.java
@@ -20,6 +20,7 @@
 import android.annotation.LongDef;
 import android.annotation.NonNull;
 import android.annotation.UnsupportedAppUsage;
+import android.graphics.GraphicBuffer;
 import android.os.Build;
 import android.os.Parcel;
 import android.os.Parcelable;
@@ -214,6 +215,19 @@
     }
 
     /**
+     * @hide
+     * Returns a <code>HardwareBuffer</code> instance from <code>GraphicBuffer</code>
+     *
+     * @param graphicBuffer A GraphicBuffer to be wrapped as HardwareBuffer
+     * @return A <code>HardwareBuffer</code> instance.
+     */
+    @NonNull
+    public static HardwareBuffer createFromGraphicBuffer(@NonNull GraphicBuffer graphicBuffer) {
+        long nativeObject = nCreateFromGraphicBuffer(graphicBuffer);
+        return new HardwareBuffer(nativeObject);
+    }
+
+    /**
      * Private use only. See {@link #create(int, int, int, int, long)}. May also be
      * called from JNI using an already allocated native <code>HardwareBuffer</code>.
      */
@@ -405,6 +419,7 @@
 
     private static native long nCreateHardwareBuffer(int width, int height, int format, int layers,
             long usage);
+    private static native long nCreateFromGraphicBuffer(GraphicBuffer graphicBuffer);
     private static native long nGetNativeFinalizer();
     private static native void nWriteHardwareBufferToParcel(long nativeObject, Parcel dest);
     private static native long nReadHardwareBufferFromParcel(Parcel in);
diff --git a/core/java/android/hardware/biometrics/BiometricFaceConstants.java b/core/java/android/hardware/biometrics/BiometricFaceConstants.java
index 209afb8..125dabe 100644
--- a/core/java/android/hardware/biometrics/BiometricFaceConstants.java
+++ b/core/java/android/hardware/biometrics/BiometricFaceConstants.java
@@ -295,12 +295,22 @@
     public static final int FACE_ACQUIRED_FACE_OBSCURED = 19;
 
     /**
+     * This message represents the earliest message sent at the beginning of the authentication
+     * pipeline. It is expected to be used to measure latency. For example, in a camera-based
+     * authentication system it's expected to be sent prior to camera initialization. Note this
+     * should be sent whenever authentication is restarted (see IBiometricsFace#userActivity).
+     * The framework will measure latency based on the time between the last START message and the
+     * onAuthenticated callback.
+     */
+    public static final int FACE_ACQUIRED_START = 20;
+
+    /**
      * Hardware vendors may extend this list if there are conditions that do not fall under one of
      * the above categories. Vendors are responsible for providing error strings for these errors.
      *
      * @hide
      */
-    public static final int FACE_ACQUIRED_VENDOR = 20;
+    public static final int FACE_ACQUIRED_VENDOR = 21;
 
     /**
      * @hide
diff --git a/core/java/android/hardware/biometrics/BiometricManager.java b/core/java/android/hardware/biometrics/BiometricManager.java
index 5afe1a9..d257c03 100644
--- a/core/java/android/hardware/biometrics/BiometricManager.java
+++ b/core/java/android/hardware/biometrics/BiometricManager.java
@@ -21,6 +21,7 @@
 
 import android.annotation.IntDef;
 import android.annotation.RequiresPermission;
+import android.annotation.SystemService;
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.os.RemoteException;
@@ -29,6 +30,7 @@
 /**
  * A class that contains biometric utilities. For authentication, see {@link BiometricPrompt}.
  */
+@SystemService(Context.BIOMETRIC_SERVICE)
 public class BiometricManager {
 
     private static final String TAG = "BiometricManager";
diff --git a/core/java/android/hardware/biometrics/BiometricPrompt.java b/core/java/android/hardware/biometrics/BiometricPrompt.java
index ec62aba..d569a78 100644
--- a/core/java/android/hardware/biometrics/BiometricPrompt.java
+++ b/core/java/android/hardware/biometrics/BiometricPrompt.java
@@ -202,6 +202,9 @@
          * Required: Set the text for the negative button. This would typically be used as a
          * "Cancel" button, but may be also used to show an alternative method for authentication,
          * such as screen that asks for a backup password.
+         *
+         * Note that this should not be set if {@link #setEnableFallback(boolean)} is set to true.
+         *
          * @param text
          * @return
          */
@@ -248,6 +251,10 @@
         /**
          * The user will first be prompted to authenticate with biometrics, but also given the
          * option to authenticate with their device PIN, pattern, or password.
+         *
+         * Note that {@link #setNegativeButton(CharSequence, Executor,
+         * DialogInterface.OnClickListener)} should not be set if this is set to true.
+         *
          * @param enable When true, the prompt will fall back to ask for the user's device
          *               credentials (PIN, pattern, or password).
          * @return
diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java
index 9758308..4bc2702 100644
--- a/core/java/android/hardware/camera2/CameraCharacteristics.java
+++ b/core/java/android/hardware/camera2/CameraCharacteristics.java
@@ -24,8 +24,6 @@
 import android.hardware.camera2.impl.SyntheticKey;
 import android.hardware.camera2.params.RecommendedStreamConfigurationMap;
 import android.hardware.camera2.params.SessionConfiguration;
-import android.hardware.camera2.params.MandatoryStreamCombination;
-import android.hardware.camera2.params.MandatoryStreamCombination.MandatoryStreamInformation;
 import android.hardware.camera2.utils.ArrayUtils;
 import android.hardware.camera2.utils.TypeReference;
 import android.util.Rational;
@@ -92,11 +90,13 @@
         }
 
         /**
-         * Visible for testing and vendor extensions only.
+         * Construct a new Key with a given name and type.
          *
-         * @hide
+         * <p>Normally, applications should use the existing Key definitions in
+         * {@link CameraCharacteristics}, and not need to construct their own Key objects. However,
+         * they may be useful for testing purposes and for defining custom camera
+         * characteristics.</p>
          */
-        @UnsupportedAppUsage
         public Key(String name, Class<T> type) {
             mKey = new CameraMetadataNative.Key<T>(name,  type);
         }
@@ -3721,6 +3721,59 @@
             new Key<android.hardware.camera2.params.RecommendedStreamConfiguration[]>("android.depth.availableRecommendedDepthStreamConfigurations", android.hardware.camera2.params.RecommendedStreamConfiguration[].class);
 
     /**
+     * <p>The available dynamic depth dataspace stream
+     * configurations that this camera device supports
+     * (i.e. format, width, height, output/input stream).</p>
+     * <p>These are output stream configurations for use with
+     * dataSpace DYNAMIC_DEPTH. The configurations are
+     * listed as <code>(format, width, height, input?)</code> tuples.</p>
+     * <p>Only devices that support depth output for at least
+     * the HAL_PIXEL_FORMAT_Y16 dense depth map along with
+     * HAL_PIXEL_FORMAT_BLOB with the same size or size with
+     * the same aspect ratio can have dynamic depth dataspace
+     * stream configuration. {@link CameraCharacteristics#DEPTH_DEPTH_IS_EXCLUSIVE android.depth.depthIsExclusive} also
+     * needs to be set to FALSE.</p>
+     * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+     *
+     * @see CameraCharacteristics#DEPTH_DEPTH_IS_EXCLUSIVE
+     * @hide
+     */
+    public static final Key<android.hardware.camera2.params.StreamConfiguration[]> DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS =
+            new Key<android.hardware.camera2.params.StreamConfiguration[]>("android.depth.availableDynamicDepthStreamConfigurations", android.hardware.camera2.params.StreamConfiguration[].class);
+
+    /**
+     * <p>This lists the minimum frame duration for each
+     * format/size combination for dynamic depth output streams.</p>
+     * <p>This should correspond to the frame duration when only that
+     * stream is active, with all processing (typically in android.*.mode)
+     * set to either OFF or FAST.</p>
+     * <p>When multiple streams are used in a request, the minimum frame
+     * duration will be max(individual stream min durations).</p>
+     * <p>The minimum frame duration of a stream (of a particular format, size)
+     * is the same regardless of whether the stream is input or output.</p>
+     * <p><b>Units</b>: (format, width, height, ns) x n</p>
+     * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+     * @hide
+     */
+    public static final Key<android.hardware.camera2.params.StreamConfigurationDuration[]> DEPTH_AVAILABLE_DYNAMIC_DEPTH_MIN_FRAME_DURATIONS =
+            new Key<android.hardware.camera2.params.StreamConfigurationDuration[]>("android.depth.availableDynamicDepthMinFrameDurations", android.hardware.camera2.params.StreamConfigurationDuration[].class);
+
+    /**
+     * <p>This lists the maximum stall duration for each
+     * output format/size combination for dynamic depth streams.</p>
+     * <p>A stall duration is how much extra time would get added
+     * to the normal minimum frame duration for a repeating request
+     * that has streams with non-zero stall.</p>
+     * <p>All dynamic depth output streams may have a nonzero stall
+     * duration.</p>
+     * <p><b>Units</b>: (format, width, height, ns) x n</p>
+     * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+     * @hide
+     */
+    public static final Key<android.hardware.camera2.params.StreamConfigurationDuration[]> DEPTH_AVAILABLE_DYNAMIC_DEPTH_STALL_DURATIONS =
+            new Key<android.hardware.camera2.params.StreamConfigurationDuration[]>("android.depth.availableDynamicDepthStallDurations", android.hardware.camera2.params.StreamConfigurationDuration[].class);
+
+    /**
      * <p>String containing the ids of the underlying physical cameras.</p>
      * <p>For a logical camera, this is concatenation of all underlying physical camera IDs.
      * The null terminator for physical camera ID must be preserved so that the whole string
diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java
index 5f05cfb..3d3a916 100644
--- a/core/java/android/hardware/camera2/CaptureRequest.java
+++ b/core/java/android/hardware/camera2/CaptureRequest.java
@@ -114,11 +114,12 @@
         }
 
         /**
-         * Visible for testing and vendor extensions only.
+         * Construct a new Key with a given name and type.
          *
-         * @hide
+         * <p>Normally, applications should use the existing Key definitions in
+         * {@link CaptureRequest}, and not need to construct their own Key objects. However, they
+         * may be useful for testing purposes and for defining custom capture request fields.</p>
          */
-        @UnsupportedAppUsage
         public Key(String name, Class<T> type) {
             mKey = new CameraMetadataNative.Key<T>(name, type);
         }
diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java
index 585c597..8982b40 100644
--- a/core/java/android/hardware/camera2/CaptureResult.java
+++ b/core/java/android/hardware/camera2/CaptureResult.java
@@ -94,11 +94,12 @@
         }
 
        /**
-         * Visible for testing and vendor extensions only.
+         * Construct a new Key with a given name and type.
          *
-         * @hide
+         * <p>Normally, applications should use the existing Key definitions in
+         * {@link CaptureResult}, and not need to construct their own Key objects. However, they may
+         * be useful for testing purposes and for defining custom capture result fields.</p>
          */
-        @UnsupportedAppUsage
         public Key(String name, Class<T> type) {
             mKey = new CameraMetadataNative.Key<T>(name, type);
         }
diff --git a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
index c527ab4..7877a4d 100644
--- a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
+++ b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
@@ -1119,6 +1119,8 @@
                 continue;
             }
 
+            // Dynamic depth streams involve alot of SW processing and currently cannot be
+            // recommended.
             StreamConfigurationMap map = null;
             switch (i) {
                 case RecommendedStreamConfigurationMap.USECASE_PREVIEW:
@@ -1127,28 +1129,44 @@
                     map = new StreamConfigurationMap(scData.streamConfigurationArray,
                             scData.minDurationArray, scData.stallDurationArray,
                             /*depthconfiguration*/ null, /*depthminduration*/ null,
-                            /*depthstallduration*/ null, /*highspeedvideoconfigurations*/ null,
+                            /*depthstallduration*/ null,
+                            /*dynamicDepthConfigurations*/ null,
+                            /*dynamicDepthMinFrameDurations*/ null,
+                            /*dynamicDepthStallDurations*/ null,
+                            /*highspeedvideoconfigurations*/ null,
                             /*inputoutputformatsmap*/ null, listHighResolution, supportsPrivate[i]);
                     break;
                 case RecommendedStreamConfigurationMap.USECASE_RECORD:
                     map = new StreamConfigurationMap(scData.streamConfigurationArray,
                             scData.minDurationArray, scData.stallDurationArray,
                             /*depthconfiguration*/ null, /*depthminduration*/ null,
-                            /*depthstallduration*/ null, highSpeedVideoConfigurations,
+                            /*depthstallduration*/ null,
+                            /*dynamicDepthConfigurations*/ null,
+                            /*dynamicDepthMinFrameDurations*/ null,
+                            /*dynamicDepthStallDurations*/ null,
+                            highSpeedVideoConfigurations,
                             /*inputoutputformatsmap*/ null, listHighResolution, supportsPrivate[i]);
                     break;
                 case RecommendedStreamConfigurationMap.USECASE_ZSL:
                     map = new StreamConfigurationMap(scData.streamConfigurationArray,
                             scData.minDurationArray, scData.stallDurationArray,
                             depthScData.streamConfigurationArray, depthScData.minDurationArray,
-                            depthScData.stallDurationArray, /*highSpeedVideoConfigurations*/ null,
+                            depthScData.stallDurationArray,
+                            /*dynamicDepthConfigurations*/ null,
+                            /*dynamicDepthMinFrameDurations*/ null,
+                            /*dynamicDepthStallDurations*/ null,
+                            /*highSpeedVideoConfigurations*/ null,
                             inputOutputFormatsMap, listHighResolution, supportsPrivate[i]);
                     break;
                 default:
                     map = new StreamConfigurationMap(scData.streamConfigurationArray,
                             scData.minDurationArray, scData.stallDurationArray,
                             depthScData.streamConfigurationArray, depthScData.minDurationArray,
-                            depthScData.stallDurationArray, /*highSpeedVideoConfigurations*/ null,
+                            depthScData.stallDurationArray,
+                            /*dynamicDepthConfigurations*/ null,
+                            /*dynamicDepthMinFrameDurations*/ null,
+                            /*dynamicDepthStallDurations*/ null,
+                            /*highSpeedVideoConfigurations*/ null,
                             /*inputOutputFormatsMap*/ null, listHighResolution, supportsPrivate[i]);
             }
 
@@ -1206,6 +1224,12 @@
                 CameraCharacteristics.DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS);
         StreamConfigurationDuration[] depthStallDurations = getBase(
                 CameraCharacteristics.DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS);
+        StreamConfiguration[] dynamicDepthConfigurations = getBase(
+                CameraCharacteristics.DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS);
+        StreamConfigurationDuration[] dynamicDepthMinFrameDurations = getBase(
+                CameraCharacteristics.DEPTH_AVAILABLE_DYNAMIC_DEPTH_MIN_FRAME_DURATIONS);
+        StreamConfigurationDuration[] dynamicDepthStallDurations = getBase(
+                CameraCharacteristics.DEPTH_AVAILABLE_DYNAMIC_DEPTH_STALL_DURATIONS);
         HighSpeedVideoConfiguration[] highSpeedVideoConfigurations = getBase(
                 CameraCharacteristics.CONTROL_AVAILABLE_HIGH_SPEED_VIDEO_CONFIGURATIONS);
         ReprocessFormatsMap inputOutputFormatsMap = getBase(
@@ -1214,7 +1238,8 @@
         return new StreamConfigurationMap(
                 configurations, minFrameDurations, stallDurations,
                 depthConfigurations, depthMinFrameDurations, depthStallDurations,
-                highSpeedVideoConfigurations, inputOutputFormatsMap,
+                dynamicDepthConfigurations, dynamicDepthMinFrameDurations,
+                dynamicDepthStallDurations, highSpeedVideoConfigurations, inputOutputFormatsMap,
                 listHighResolution);
     }
 
diff --git a/core/java/android/hardware/camera2/params/StreamConfigurationMap.java b/core/java/android/hardware/camera2/params/StreamConfigurationMap.java
index dd052a8..a22e008 100644
--- a/core/java/android/hardware/camera2/params/StreamConfigurationMap.java
+++ b/core/java/android/hardware/camera2/params/StreamConfigurationMap.java
@@ -95,13 +95,17 @@
             StreamConfiguration[] depthConfigurations,
             StreamConfigurationDuration[] depthMinFrameDurations,
             StreamConfigurationDuration[] depthStallDurations,
+            StreamConfiguration[] dynamicDepthConfigurations,
+            StreamConfigurationDuration[] dynamicDepthMinFrameDurations,
+            StreamConfigurationDuration[] dynamicDepthStallDurations,
             HighSpeedVideoConfiguration[] highSpeedVideoConfigurations,
             ReprocessFormatsMap inputOutputFormatsMap,
             boolean listHighResolution) {
         this(configurations, minFrameDurations, stallDurations,
                     depthConfigurations, depthMinFrameDurations, depthStallDurations,
-                    highSpeedVideoConfigurations, inputOutputFormatsMap, listHighResolution,
-                    /*enforceImplementationDefined*/ true);
+                    dynamicDepthConfigurations, dynamicDepthMinFrameDurations,
+                    dynamicDepthStallDurations, highSpeedVideoConfigurations, inputOutputFormatsMap,
+                    listHighResolution, /*enforceImplementationDefined*/ true);
     }
 
     /**
@@ -131,6 +135,9 @@
             StreamConfiguration[] depthConfigurations,
             StreamConfigurationDuration[] depthMinFrameDurations,
             StreamConfigurationDuration[] depthStallDurations,
+            StreamConfiguration[] dynamicDepthConfigurations,
+            StreamConfigurationDuration[] dynamicDepthMinFrameDurations,
+            StreamConfigurationDuration[] dynamicDepthStallDurations,
             HighSpeedVideoConfiguration[] highSpeedVideoConfigurations,
             ReprocessFormatsMap inputOutputFormatsMap,
             boolean listHighResolution,
@@ -163,6 +170,19 @@
                     "depthStallDurations");
         }
 
+        if (dynamicDepthConfigurations == null) {
+            mDynamicDepthConfigurations = new StreamConfiguration[0];
+            mDynamicDepthMinFrameDurations = new StreamConfigurationDuration[0];
+            mDynamicDepthStallDurations = new StreamConfigurationDuration[0];
+        } else {
+            mDynamicDepthConfigurations = checkArrayElementsNotNull(dynamicDepthConfigurations,
+                    "dynamicDepthConfigurations");
+            mDynamicDepthMinFrameDurations = checkArrayElementsNotNull(
+                    dynamicDepthMinFrameDurations, "dynamicDepthMinFrameDurations");
+            mDynamicDepthStallDurations = checkArrayElementsNotNull(dynamicDepthStallDurations,
+                    "dynamicDepthStallDurations");
+        }
+
         if (highSpeedVideoConfigurations == null) {
             mHighSpeedVideoConfigurations = new HighSpeedVideoConfiguration[0];
         } else {
@@ -205,6 +225,15 @@
             mDepthOutputFormats.put(config.getFormat(),
                     mDepthOutputFormats.get(config.getFormat()) + 1);
         }
+        for (StreamConfiguration config : mDynamicDepthConfigurations) {
+            if (!config.isOutput()) {
+                // Ignoring input configs
+                continue;
+            }
+
+            mDynamicDepthOutputFormats.put(config.getFormat(),
+                    mDynamicDepthOutputFormats.get(config.getFormat()) + 1);
+        }
 
         if (configurations != null && enforceImplementationDefined &&
                 mOutputFormats.indexOfKey(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) < 0) {
@@ -335,6 +364,8 @@
         int dataspace = imageFormatToDataspace(format);
         if (dataspace == HAL_DATASPACE_DEPTH) {
             return mDepthOutputFormats.indexOfKey(internalFormat) >= 0;
+        } else if (dataspace == HAL_DATASPACE_DYNAMIC_DEPTH) {
+            return mDynamicDepthOutputFormats.indexOfKey(internalFormat) >= 0;
         } else {
             return getFormatsMap(/*output*/true).indexOfKey(internalFormat) >= 0;
         }
@@ -446,7 +477,9 @@
         boolean isFlexible = SurfaceUtils.isFlexibleConsumer(surface);
 
         StreamConfiguration[] configs =
-                surfaceDataspace != HAL_DATASPACE_DEPTH ? mConfigurations : mDepthConfigurations;
+                surfaceDataspace == HAL_DATASPACE_DEPTH ? mDepthConfigurations :
+                surfaceDataspace == HAL_DATASPACE_DYNAMIC_DEPTH ? mDynamicDepthConfigurations :
+                mConfigurations;
         for (StreamConfiguration config : configs) {
             if (config.getFormat() == surfaceFormat && config.isOutput()) {
                 // Matching format, either need exact size match, or a flexible consumer
@@ -479,7 +512,9 @@
         int dataspace = imageFormatToDataspace(format);
 
         StreamConfiguration[] configs =
-            dataspace != HAL_DATASPACE_DEPTH ? mConfigurations : mDepthConfigurations;
+            dataspace == HAL_DATASPACE_DEPTH ? mDepthConfigurations :
+            dataspace == HAL_DATASPACE_DYNAMIC_DEPTH ? mDynamicDepthConfigurations :
+            mConfigurations;
         for (StreamConfiguration config : configs) {
             if ((config.getFormat() == internalFormat) && config.isOutput() &&
                     config.getSize().equals(size)) {
@@ -992,6 +1027,12 @@
                     Arrays.equals(mMinFrameDurations, other.mMinFrameDurations) &&
                     Arrays.equals(mStallDurations, other.mStallDurations) &&
                     Arrays.equals(mDepthConfigurations, other.mDepthConfigurations) &&
+                    Arrays.equals(mDepthMinFrameDurations, other.mDepthMinFrameDurations) &&
+                    Arrays.equals(mDepthStallDurations, other.mDepthStallDurations) &&
+                    Arrays.equals(mDynamicDepthConfigurations, other.mDynamicDepthConfigurations) &&
+                    Arrays.equals(mDynamicDepthMinFrameDurations,
+                            other.mDynamicDepthMinFrameDurations) &&
+                    Arrays.equals(mDynamicDepthStallDurations, other.mDynamicDepthStallDurations) &&
                     Arrays.equals(mHighSpeedVideoConfigurations,
                             other.mHighSpeedVideoConfigurations);
         }
@@ -1005,9 +1046,10 @@
     public int hashCode() {
         // XX: do we care about order?
         return HashCodeHelpers.hashCodeGeneric(
-                mConfigurations, mMinFrameDurations,
-                mStallDurations,
-                mDepthConfigurations, mHighSpeedVideoConfigurations);
+                mConfigurations, mMinFrameDurations, mStallDurations,
+                mDepthConfigurations, mDepthMinFrameDurations, mDepthStallDurations,
+                mDynamicDepthConfigurations, mDynamicDepthMinFrameDurations,
+                mDynamicDepthStallDurations, mHighSpeedVideoConfigurations);
     }
 
     // Check that the argument is supported by #getOutputFormats or #getInputFormats
@@ -1022,6 +1064,10 @@
                 if (mDepthOutputFormats.indexOfKey(internalFormat) >= 0) {
                     return format;
                 }
+            } else if (internalDataspace == HAL_DATASPACE_DYNAMIC_DEPTH) {
+                if (mDynamicDepthOutputFormats.indexOfKey(internalFormat) >= 0) {
+                    return format;
+                }
             } else {
                 if (mAllOutputFormats.indexOfKey(internalFormat) >= 0) {
                     return format;
@@ -1245,6 +1291,7 @@
         switch (format) {
             case ImageFormat.JPEG:
             case ImageFormat.DEPTH_POINT_CLOUD:
+            case ImageFormat.DEPTH_JPEG:
                 return HAL_PIXEL_FORMAT_BLOB;
             case ImageFormat.DEPTH16:
                 return HAL_PIXEL_FORMAT_Y16;
@@ -1264,6 +1311,7 @@
      * <li>ImageFormat.JPEG => HAL_DATASPACE_V0_JFIF
      * <li>ImageFormat.DEPTH_POINT_CLOUD => HAL_DATASPACE_DEPTH
      * <li>ImageFormat.DEPTH16 => HAL_DATASPACE_DEPTH
+     * <li>ImageFormat.DEPTH_JPEG => HAL_DATASPACE_DYNAMIC_DEPTH
      * <li>others => HAL_DATASPACE_UNKNOWN
      * </ul>
      * </p>
@@ -1293,6 +1341,8 @@
             case ImageFormat.DEPTH16:
             case ImageFormat.RAW_DEPTH:
                 return HAL_DATASPACE_DEPTH;
+            case ImageFormat.DEPTH_JPEG:
+                return HAL_DATASPACE_DYNAMIC_DEPTH;
             default:
                 return HAL_DATASPACE_UNKNOWN;
         }
@@ -1343,12 +1393,16 @@
         SparseIntArray formatsMap =
                 !output ? mInputFormats :
                 dataspace == HAL_DATASPACE_DEPTH ? mDepthOutputFormats :
+                dataspace == HAL_DATASPACE_DYNAMIC_DEPTH ? mDynamicDepthOutputFormats :
                 highRes ? mHighResOutputFormats :
                 mOutputFormats;
 
         int sizesCount = formatsMap.get(format);
-        if ( ((!output || dataspace == HAL_DATASPACE_DEPTH) && sizesCount == 0) ||
-                (output && dataspace != HAL_DATASPACE_DEPTH && mAllOutputFormats.get(format) == 0)) {
+        if ( ((!output || (dataspace == HAL_DATASPACE_DEPTH ||
+                            dataspace == HAL_DATASPACE_DYNAMIC_DEPTH)) && sizesCount == 0) ||
+                (output && (dataspace != HAL_DATASPACE_DEPTH &&
+                            dataspace != HAL_DATASPACE_DYNAMIC_DEPTH) &&
+                 mAllOutputFormats.get(format) == 0)) {
             // Only throw if this is really not supported at all
             throw new IllegalArgumentException("format not available");
         }
@@ -1357,9 +1411,13 @@
         int sizeIndex = 0;
 
         StreamConfiguration[] configurations =
-                (dataspace == HAL_DATASPACE_DEPTH) ? mDepthConfigurations : mConfigurations;
+                (dataspace == HAL_DATASPACE_DEPTH) ? mDepthConfigurations :
+                (dataspace == HAL_DATASPACE_DYNAMIC_DEPTH) ? mDynamicDepthConfigurations :
+                mConfigurations;
         StreamConfigurationDuration[] minFrameDurations =
-                (dataspace == HAL_DATASPACE_DEPTH) ? mDepthMinFrameDurations : mMinFrameDurations;
+                (dataspace == HAL_DATASPACE_DEPTH) ? mDepthMinFrameDurations :
+                (dataspace == HAL_DATASPACE_DYNAMIC_DEPTH) ? mDynamicDepthMinFrameDurations :
+                mMinFrameDurations;
 
         for (StreamConfiguration config : configurations) {
             int fmt = config.getFormat();
@@ -1386,7 +1444,21 @@
             }
         }
 
-        if (sizeIndex != sizesCount) {
+        // Dynamic depth streams can have both fast and also high res modes.
+        if ((sizeIndex != sizesCount) && (dataspace == HAL_DATASPACE_DYNAMIC_DEPTH)) {
+
+            if (sizeIndex > sizesCount) {
+                throw new AssertionError(
+                        "Too many dynamic depth sizes (expected " + sizesCount + ", actual " +
+                        sizeIndex + ")");
+            }
+
+            if (sizeIndex <= 0) {
+                sizes = new Size[0];
+            } else {
+                sizes = Arrays.copyOf(sizes, sizeIndex);
+            }
+        } else if (sizeIndex != sizesCount) {
             throw new AssertionError(
                     "Too few sizes (expected " + sizesCount + ", actual " + sizeIndex + ")");
         }
@@ -1409,6 +1481,10 @@
             for (int j = 0; j < mDepthOutputFormats.size(); j++) {
                 formats[i++] = depthFormatToPublic(mDepthOutputFormats.keyAt(j));
             }
+            if (mDynamicDepthOutputFormats.size() > 0) {
+                // Only one publicly dynamic depth format is available.
+                formats[i++] = ImageFormat.DEPTH_JPEG;
+            }
         }
         if (formats.length != i) {
             throw new AssertionError("Too few formats " + i + ", expected " + formats.length);
@@ -1451,11 +1527,13 @@
     private StreamConfigurationDuration[] getDurations(int duration, int dataspace) {
         switch (duration) {
             case DURATION_MIN_FRAME:
-                return (dataspace == HAL_DATASPACE_DEPTH) ?
-                        mDepthMinFrameDurations : mMinFrameDurations;
+                return (dataspace == HAL_DATASPACE_DEPTH) ? mDepthMinFrameDurations :
+                        (dataspace == HAL_DATASPACE_DYNAMIC_DEPTH) ?
+                        mDynamicDepthMinFrameDurations : mMinFrameDurations;
             case DURATION_STALL:
-                return (dataspace == HAL_DATASPACE_DEPTH) ?
-                        mDepthStallDurations : mStallDurations;
+                return (dataspace == HAL_DATASPACE_DEPTH) ? mDepthStallDurations :
+                        (dataspace == HAL_DATASPACE_DYNAMIC_DEPTH) ? mDynamicDepthStallDurations :
+                        mStallDurations;
             default:
                 throw new IllegalArgumentException("duration was invalid");
         }
@@ -1467,6 +1545,7 @@
         int size = formatsMap.size();
         if (output) {
             size += mDepthOutputFormats.size();
+            size += mDynamicDepthOutputFormats.size();
         }
 
         return size;
@@ -1486,10 +1565,11 @@
         return false;
     }
 
-    private boolean isSupportedInternalConfiguration(int format, int dataspace,
-            Size size) {
+    private boolean isSupportedInternalConfiguration(int format, int dataspace, Size size) {
         StreamConfiguration[] configurations =
-                (dataspace == HAL_DATASPACE_DEPTH) ? mDepthConfigurations : mConfigurations;
+                (dataspace == HAL_DATASPACE_DEPTH) ? mDepthConfigurations :
+                (dataspace == HAL_DATASPACE_DYNAMIC_DEPTH) ? mDynamicDepthConfigurations :
+                mConfigurations;
 
         for (int i = 0; i < configurations.length; i++) {
             if (configurations[i].getFormat() == format &&
@@ -1681,6 +1761,8 @@
                 return "DEPTH16";
             case ImageFormat.DEPTH_POINT_CLOUD:
                 return "DEPTH_POINT_CLOUD";
+            case ImageFormat.DEPTH_JPEG:
+                return "DEPTH_JPEG";
             case ImageFormat.RAW_DEPTH:
                 return "RAW_DEPTH";
             case ImageFormat.PRIVATE:
@@ -1712,6 +1794,7 @@
             (1 << HAL_DATASPACE_RANGE_SHIFT);
 
     private static final int HAL_DATASPACE_DEPTH = 0x1000;
+    private static final int HAL_DATASPACE_DYNAMIC_DEPTH = 0x1002;
 
     private static final long DURATION_20FPS_NS = 50000000L;
     /**
@@ -1728,6 +1811,10 @@
     private final StreamConfigurationDuration[] mDepthMinFrameDurations;
     private final StreamConfigurationDuration[] mDepthStallDurations;
 
+    private final StreamConfiguration[] mDynamicDepthConfigurations;
+    private final StreamConfigurationDuration[] mDynamicDepthMinFrameDurations;
+    private final StreamConfigurationDuration[] mDynamicDepthStallDurations;
+
     private final HighSpeedVideoConfiguration[] mHighSpeedVideoConfigurations;
     private final ReprocessFormatsMap mInputOutputFormatsMap;
 
@@ -1745,6 +1832,8 @@
     private final SparseIntArray mInputFormats = new SparseIntArray();
     /** internal format -> num depth output sizes mapping, for HAL_DATASPACE_DEPTH */
     private final SparseIntArray mDepthOutputFormats = new SparseIntArray();
+    /** internal format -> num dynamic depth output sizes mapping, for HAL_DATASPACE_DYNAMIC_DEPTH */
+    private final SparseIntArray mDynamicDepthOutputFormats = new SparseIntArray();
     /** High speed video Size -> FPS range count mapping*/
     private final HashMap</*HighSpeedVideoSize*/Size, /*Count*/Integer> mHighSpeedVideoSizeMap =
             new HashMap<Size, Integer>();
diff --git a/core/java/android/hardware/display/BrightnessChangeEvent.java b/core/java/android/hardware/display/BrightnessChangeEvent.java
index 02eb28c..c6186bb 100644
--- a/core/java/android/hardware/display/BrightnessChangeEvent.java
+++ b/core/java/android/hardware/display/BrightnessChangeEvent.java
@@ -16,11 +16,15 @@
 
 package android.hardware.display;
 
+import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.annotation.SystemApi;
 import android.annotation.TestApi;
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import java.util.Objects;
+
 /**
  * Data about a brightness settings change.
  *
@@ -72,12 +76,29 @@
     /** Whether brightness curve includes a user brightness point */
     public final boolean isUserSetBrightness;
 
+    /**
+     * Histogram counting how many times a pixel of a given value was displayed onscreen for the
+     * Value component of HSV if the device supports color sampling, if the device does not support
+     * color sampling the value will be null.
+     * The buckets of the histogram are evenly weighted, the number of buckets is device specific.
+     * For example if we had {10, 6, 4, 1} this means that 10 pixels were in the range
+     * [0x00,0x3f], 6 pixels were in the range [0x40,0x7f] etc.
+     */
+    @Nullable
+    public final long[] colorValueBuckets;
+
+    /**
+     * How many milliseconds of data are contained in the colorValueBuckets.
+     */
+    public final long colorSampleDuration;
+
 
     /** @hide */
     private BrightnessChangeEvent(float brightness, long timeStamp, String packageName,
             int userId, float[] luxValues, long[] luxTimestamps, float batteryLevel,
             float powerBrightnessFactor, boolean nightMode, int colorTemperature,
-            float lastBrightness, boolean isDefaultBrightnessConfig, boolean isUserSetBrightness) {
+            float lastBrightness, boolean isDefaultBrightnessConfig, boolean isUserSetBrightness,
+            long[] colorValueBuckets, long colorSampleDuration) {
         this.brightness = brightness;
         this.timeStamp = timeStamp;
         this.packageName = packageName;
@@ -91,6 +112,8 @@
         this.lastBrightness = lastBrightness;
         this.isDefaultBrightnessConfig = isDefaultBrightnessConfig;
         this.isUserSetBrightness = isUserSetBrightness;
+        this.colorValueBuckets = colorValueBuckets;
+        this.colorSampleDuration = colorSampleDuration;
     }
 
     /** @hide */
@@ -108,6 +131,8 @@
         this.lastBrightness = other.lastBrightness;
         this.isDefaultBrightnessConfig = other.isDefaultBrightnessConfig;
         this.isUserSetBrightness = other.isUserSetBrightness;
+        this.colorValueBuckets = other.colorValueBuckets;
+        this.colorSampleDuration = other.colorSampleDuration;
     }
 
     private BrightnessChangeEvent(Parcel source) {
@@ -124,6 +149,8 @@
         lastBrightness = source.readFloat();
         isDefaultBrightnessConfig = source.readBoolean();
         isUserSetBrightness = source.readBoolean();
+        colorValueBuckets = source.createLongArray();
+        colorSampleDuration = source.readLong();
     }
 
     public static final Creator<BrightnessChangeEvent> CREATOR =
@@ -156,6 +183,8 @@
         dest.writeFloat(lastBrightness);
         dest.writeBoolean(isDefaultBrightnessConfig);
         dest.writeBoolean(isUserSetBrightness);
+        dest.writeLongArray(colorValueBuckets);
+        dest.writeLong(colorSampleDuration);
     }
 
     /** @hide */
@@ -173,6 +202,8 @@
         private float mLastBrightness;
         private boolean mIsDefaultBrightnessConfig;
         private boolean mIsUserSetBrightness;
+        private long[] mColorValueBuckets;
+        private long mColorSampleDuration;
 
         /** {@see BrightnessChangeEvent#brightness} */
         public Builder setBrightness(float brightness) {
@@ -252,12 +283,21 @@
             return this;
         }
 
+        /** {@see BrightnessChangeEvent#valueBuckets} */
+        public Builder setColorValues(@NonNull long[] colorValueBuckets, long colorSampleDuration) {
+            Objects.requireNonNull(colorValueBuckets);
+            mColorValueBuckets = colorValueBuckets;
+            mColorSampleDuration = colorSampleDuration;
+            return this;
+        }
+
         /** Builds a BrightnessChangeEvent */
         public BrightnessChangeEvent build() {
             return new BrightnessChangeEvent(mBrightness, mTimeStamp,
                     mPackageName, mUserId, mLuxValues, mLuxTimestamps, mBatteryLevel,
                     mPowerBrightnessFactor, mNightMode, mColorTemperature, mLastBrightness,
-                    mIsDefaultBrightnessConfig, mIsUserSetBrightness);
+                    mIsDefaultBrightnessConfig, mIsUserSetBrightness, mColorValueBuckets,
+                    mColorSampleDuration);
         }
     }
 }
diff --git a/core/java/android/net/CaptivePortal.java b/core/java/android/net/CaptivePortal.java
index 3b01266..3ab35e1 100644
--- a/core/java/android/net/CaptivePortal.java
+++ b/core/java/android/net/CaptivePortal.java
@@ -117,4 +117,17 @@
         } catch (RemoteException e) {
         }
     }
+
+    /**
+     * Log a captive portal login event.
+     * @hide
+     */
+    @SystemApi
+    @TestApi
+    public void logEvent(int eventId, String packageName) {
+        try {
+            ICaptivePortal.Stub.asInterface(mBinder).logEvent(eventId, packageName);
+        } catch (RemoteException e) {
+        }
+    }
 }
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index 5bb24ba..1656c6f 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -1014,20 +1014,26 @@
      *                   to remove an existing always-on VPN configuration.
      * @param lockdownEnabled {@code true} to disallow networking when the VPN is not connected or
      *        {@code false} otherwise.
+     * @param lockdownWhitelist The list of packages that are allowed to access network directly
+     *         when VPN is in lockdown mode but is not running. Non-existent packages are ignored so
+     *         this method must be called when a package that should be whitelisted is installed or
+     *         uninstalled.
      * @return {@code true} if the package is set as always-on VPN controller;
      *         {@code false} otherwise.
      * @hide
      */
+    @RequiresPermission(android.Manifest.permission.CONTROL_ALWAYS_ON_VPN)
     public boolean setAlwaysOnVpnPackageForUser(int userId, @Nullable String vpnPackage,
-            boolean lockdownEnabled) {
+            boolean lockdownEnabled, @Nullable List<String> lockdownWhitelist) {
         try {
-            return mService.setAlwaysOnVpnPackage(userId, vpnPackage, lockdownEnabled);
+            return mService.setAlwaysOnVpnPackage(
+                    userId, vpnPackage, lockdownEnabled, lockdownWhitelist);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
     }
 
-    /**
+   /**
      * Returns the package name of the currently set always-on VPN application.
      * If there is no always-on VPN set, or the VPN is provided by the system instead
      * of by an app, {@code null} will be returned.
@@ -1036,6 +1042,7 @@
      *         or {@code null} if none is set.
      * @hide
      */
+    @RequiresPermission(android.Manifest.permission.CONTROL_ALWAYS_ON_VPN)
     public String getAlwaysOnVpnPackageForUser(int userId) {
         try {
             return mService.getAlwaysOnVpnPackage(userId);
@@ -1045,6 +1052,36 @@
     }
 
     /**
+     * @return whether always-on VPN is in lockdown mode.
+     *
+     * @hide
+     **/
+    @RequiresPermission(android.Manifest.permission.CONTROL_ALWAYS_ON_VPN)
+    public boolean isVpnLockdownEnabled(int userId) {
+        try {
+            return mService.isVpnLockdownEnabled(userId);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+
+    }
+
+    /**
+     * @return the list of packages that are allowed to access network when always-on VPN is in
+     * lockdown mode but not connected. Returns {@code null} when VPN lockdown is not active.
+     *
+     * @hide
+     **/
+    @RequiresPermission(android.Manifest.permission.CONTROL_ALWAYS_ON_VPN)
+    public List<String> getVpnLockdownWhitelist(int userId) {
+        try {
+            return mService.getVpnLockdownWhitelist(userId);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
      * Returns details about the currently active default data network
      * for a given uid.  This is for internal use only to avoid spying
      * other apps.
@@ -2544,6 +2581,7 @@
     }
 
     /** {@hide} */
+    @SystemApi
     public static final int TETHER_ERROR_NO_ERROR           = 0;
     /** {@hide} */
     public static final int TETHER_ERROR_UNKNOWN_IFACE      = 1;
@@ -2566,9 +2604,13 @@
     /** {@hide} */
     public static final int TETHER_ERROR_IFACE_CFG_ERROR      = 10;
     /** {@hide} */
+    @SystemApi
     public static final int TETHER_ERROR_PROVISION_FAILED     = 11;
     /** {@hide} */
     public static final int TETHER_ERROR_DHCPSERVER_ERROR     = 12;
+    /** {@hide} */
+    @SystemApi
+    public static final int TETHER_ERROR_ENTITLEMENT_UNKONWN  = 13;
 
     /**
      * Get a more detailed error code after a Tethering or Untethering
@@ -2591,6 +2633,65 @@
     }
 
     /**
+     * Callback for use with {@link #getLatestTetheringEntitlementValue} to find out whether
+     * entitlement succeeded.
+     * @hide
+     */
+    @SystemApi
+    public abstract static class TetheringEntitlementValueListener  {
+        /**
+         * Called to notify entitlement result.
+         *
+         * @param resultCode a int value of entitlement result. It may be one of
+         *         {@link #TETHER_ERROR_NO_ERROR},
+         *         {@link #TETHER_ERROR_PROVISION_FAILED}, or
+         *         {@link #TETHER_ERROR_ENTITLEMENT_UNKONWN}.
+         */
+        public void onEntitlementResult(int resultCode) {}
+    }
+
+    /**
+     * Get the last value of the entitlement check on this downstream. If the cached value is
+     * {@link #TETHER_ERROR_NO_ERROR} or showEntitlementUi argument is false, it just return the
+     * cached value. Otherwise, a UI-based entitlement check would be performed. It is not
+     * guaranteed that the UI-based entitlement check will complete in any specific time period
+     * and may in fact never complete. Any successful entitlement check the platform performs for
+     * any reason will update the cached value.
+     *
+     * @param type the downstream type of tethering. Must be one of
+     *         {@link #TETHERING_WIFI},
+     *         {@link #TETHERING_USB}, or
+     *         {@link #TETHERING_BLUETOOTH}.
+     * @param showEntitlementUi a boolean indicating whether to run UI-based entitlement check.
+     * @param listener an {@link TetheringEntitlementValueListener} which will be called to notify
+     *         the caller of the result of entitlement check. The listener may be called zero or
+     *         one time.
+     * @param handler {@link Handler} to specify the thread upon which the listener will be invoked.
+     * {@hide}
+     */
+    @SystemApi
+    @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED)
+    public void getLatestTetheringEntitlementValue(int type, boolean showEntitlementUi,
+            @NonNull final TetheringEntitlementValueListener listener, @Nullable Handler handler) {
+        Preconditions.checkNotNull(listener, "TetheringEntitlementValueListener cannot be null.");
+        ResultReceiver wrappedListener = new ResultReceiver(handler) {
+            @Override
+            protected void onReceiveResult(int resultCode, Bundle resultData) {
+                listener.onEntitlementResult(resultCode);
+            }
+        };
+
+        try {
+            String pkgName = mContext.getOpPackageName();
+            Log.i(TAG, "getLatestTetheringEntitlementValue:" + pkgName);
+            mService.getLatestTetheringEntitlementValue(type, wrappedListener,
+                    showEntitlementUi, pkgName);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
      * Report network connectivity status.  This is currently used only
      * to alter status bar UI.
      * <p>This method requires the caller to hold the permission
@@ -2853,11 +2954,11 @@
         }
     }
 
-    /** {@hide} */
+    /** {@hide} - returns the factory serial number */
     @UnsupportedAppUsage
-    public void registerNetworkFactory(Messenger messenger, String name) {
+    public int registerNetworkFactory(Messenger messenger, String name) {
         try {
-            mService.registerNetworkFactory(messenger, name);
+            return mService.registerNetworkFactory(messenger, name);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -2873,6 +2974,10 @@
         }
     }
 
+    // TODO : remove this method. It is a stopgap measure to help sheperding a number
+    // of dependent changes that would conflict throughout the automerger graph. Having this
+    // temporarily helps with the process of going through with all these dependent changes across
+    // the entire tree.
     /**
      * @hide
      * Register a NetworkAgent with ConnectivityService.
@@ -2880,8 +2985,20 @@
      */
     public int registerNetworkAgent(Messenger messenger, NetworkInfo ni, LinkProperties lp,
             NetworkCapabilities nc, int score, NetworkMisc misc) {
+        return registerNetworkAgent(messenger, ni, lp, nc, score, misc,
+                NetworkFactory.SerialNumber.NONE);
+    }
+
+    /**
+     * @hide
+     * Register a NetworkAgent with ConnectivityService.
+     * @return NetID corresponding to NetworkAgent.
+     */
+    public int registerNetworkAgent(Messenger messenger, NetworkInfo ni, LinkProperties lp,
+            NetworkCapabilities nc, int score, NetworkMisc misc, int factorySerialNumber) {
         try {
-            return mService.registerNetworkAgent(messenger, ni, lp, nc, score, misc);
+            return mService.registerNetworkAgent(messenger, ni, lp, nc, score, misc,
+                    factorySerialNumber);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -3905,10 +4022,17 @@
     @Deprecated
     public static boolean setProcessDefaultNetwork(@Nullable Network network) {
         int netId = (network == null) ? NETID_UNSET : network.netId;
-        if (netId == NetworkUtils.getBoundNetworkForProcess()) {
-            return true;
+        boolean isSameNetId = (netId == NetworkUtils.getBoundNetworkForProcess());
+
+        if (netId != NETID_UNSET) {
+            netId = network.getNetIdForResolv();
         }
-        if (NetworkUtils.bindProcessToNetwork(netId)) {
+
+        if (!NetworkUtils.bindProcessToNetwork(netId)) {
+            return false;
+        }
+
+        if (!isSameNetId) {
             // Set HTTP proxy system properties to match network.
             // TODO: Deprecate this static method and replace it with a non-static version.
             try {
@@ -3922,10 +4046,9 @@
             // Must flush socket pool as idle sockets will be bound to previous network and may
             // cause subsequent fetches to be performed on old network.
             NetworkEventDispatcher.getInstance().onNetworkConfigurationChanged();
-            return true;
-        } else {
-            return false;
         }
+
+        return true;
     }
 
     /**
diff --git a/core/java/android/net/DhcpResults.java b/core/java/android/net/DhcpResults.java
index 6c291c2..6f9e65f 100644
--- a/core/java/android/net/DhcpResults.java
+++ b/core/java/android/net/DhcpResults.java
@@ -17,6 +17,7 @@
 package android.net;
 
 import android.annotation.UnsupportedAppUsage;
+import android.net.shared.InetAddressUtils;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.text.TextUtils;
@@ -73,19 +74,21 @@
     public StaticIpConfiguration toStaticIpConfiguration() {
         final StaticIpConfiguration s = new StaticIpConfiguration();
         // All these except dnsServers are immutable, so no need to make copies.
-        s.ipAddress = ipAddress;
-        s.gateway = gateway;
-        s.dnsServers.addAll(dnsServers);
-        s.domains = domains;
+        s.setIpAddress(ipAddress);
+        s.setGateway(gateway);
+        for (InetAddress addr : dnsServers) {
+            s.addDnsServer(addr);
+        }
+        s.setDomains(domains);
         return s;
     }
 
     public DhcpResults(StaticIpConfiguration source) {
         if (source != null) {
-            ipAddress = source.ipAddress;
-            gateway = source.gateway;
-            dnsServers.addAll(source.dnsServers);
-            domains = source.domains;
+            ipAddress = source.getIpAddress();
+            gateway = source.getGateway();
+            dnsServers.addAll(source.getDnsServers());
+            domains = source.getDomains();
         }
     }
 
@@ -177,7 +180,7 @@
         toStaticIpConfiguration().writeToParcel(dest, flags);
         dest.writeInt(leaseDuration);
         dest.writeInt(mtu);
-        NetworkUtils.parcelInetAddress(dest, serverAddress, flags);
+        InetAddressUtils.parcelInetAddress(dest, serverAddress, flags);
         dest.writeString(vendorInfo);
     }
 
@@ -191,7 +194,7 @@
         final DhcpResults dhcpResults = new DhcpResults(s);
         dhcpResults.leaseDuration = in.readInt();
         dhcpResults.mtu = in.readInt();
-        dhcpResults.serverAddress = (Inet4Address) NetworkUtils.unparcelInetAddress(in);
+        dhcpResults.serverAddress = (Inet4Address) InetAddressUtils.unparcelInetAddress(in);
         dhcpResults.vendorInfo = in.readString();
         return dhcpResults;
     }
@@ -200,7 +203,7 @@
     // Not part of the superclass because they're only used by the JNI iterface to the DHCP daemon.
     public boolean setIpAddress(String addrString, int prefixLength) {
         try {
-            Inet4Address addr = (Inet4Address) NetworkUtils.numericToInetAddress(addrString);
+            Inet4Address addr = (Inet4Address) InetAddresses.parseNumericAddress(addrString);
             ipAddress = new LinkAddress(addr, prefixLength);
         } catch (IllegalArgumentException|ClassCastException e) {
             Log.e(TAG, "setIpAddress failed with addrString " + addrString + "/" + prefixLength);
@@ -211,7 +214,7 @@
 
     public boolean setGateway(String addrString) {
         try {
-            gateway = NetworkUtils.numericToInetAddress(addrString);
+            gateway = InetAddresses.parseNumericAddress(addrString);
         } catch (IllegalArgumentException e) {
             Log.e(TAG, "setGateway failed with addrString " + addrString);
             return true;
@@ -222,7 +225,7 @@
     public boolean addDns(String addrString) {
         if (TextUtils.isEmpty(addrString) == false) {
             try {
-                dnsServers.add(NetworkUtils.numericToInetAddress(addrString));
+                dnsServers.add(InetAddresses.parseNumericAddress(addrString));
             } catch (IllegalArgumentException e) {
                 Log.e(TAG, "addDns failed with addrString " + addrString);
                 return true;
diff --git a/core/java/android/net/ICaptivePortal.aidl b/core/java/android/net/ICaptivePortal.aidl
index 56ae57d..707b4f6 100644
--- a/core/java/android/net/ICaptivePortal.aidl
+++ b/core/java/android/net/ICaptivePortal.aidl
@@ -22,4 +22,5 @@
  */
 oneway interface ICaptivePortal {
     void appResponse(int response);
+    void logEvent(int eventId, String packageName);
 }
diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl
index e97060a..1148ac1 100644
--- a/core/java/android/net/IConnectivityManager.aidl
+++ b/core/java/android/net/IConnectivityManager.aidl
@@ -125,8 +125,11 @@
 
     boolean updateLockdownVpn();
     boolean isAlwaysOnVpnPackageSupported(int userId, String packageName);
-    boolean setAlwaysOnVpnPackage(int userId, String packageName, boolean lockdown);
+    boolean setAlwaysOnVpnPackage(int userId, String packageName, boolean lockdown,
+            in List<String> lockdownWhitelist);
     String getAlwaysOnVpnPackage(int userId);
+    boolean isVpnLockdownEnabled(int userId);
+    List<String> getVpnLockdownWhitelist(int userId);
 
     int checkMobileProvisioning(int suggestedTimeOutMs);
 
@@ -136,14 +139,14 @@
 
     void setAirplaneMode(boolean enable);
 
-    void registerNetworkFactory(in Messenger messenger, in String name);
+    int registerNetworkFactory(in Messenger messenger, in String name);
 
     boolean requestBandwidthUpdate(in Network network);
 
     void unregisterNetworkFactory(in Messenger messenger);
 
     int registerNetworkAgent(in Messenger messenger, in NetworkInfo ni, in LinkProperties lp,
-            in NetworkCapabilities nc, int score, in NetworkMisc misc);
+            in NetworkCapabilities nc, int score, in NetworkMisc misc, in int factorySerialNumber);
 
     NetworkRequest requestNetwork(in NetworkCapabilities networkCapabilities,
             in Messenger messenger, int timeoutSec, in IBinder binder, int legacy);
@@ -194,4 +197,7 @@
     int getConnectionOwnerUid(in ConnectionInfo connectionInfo);
     boolean isCallerCurrentAlwaysOnVpnApp();
     boolean isCallerCurrentAlwaysOnVpnLockdownApp();
+
+    void getLatestTetheringEntitlementValue(int type, in ResultReceiver receiver,
+            boolean showEntitlementUi, String callerPkg);
 }
diff --git a/core/java/android/net/INetworkMonitorCallbacks.aidl b/core/java/android/net/INetworkMonitorCallbacks.aidl
index 0bc2575..a8682f9 100644
--- a/core/java/android/net/INetworkMonitorCallbacks.aidl
+++ b/core/java/android/net/INetworkMonitorCallbacks.aidl
@@ -26,4 +26,5 @@
     void notifyPrivateDnsConfigResolved(in PrivateDnsConfigParcel config);
     void showProvisioningNotification(String action);
     void hideProvisioningNotification();
+    void logCaptivePortalLoginEvent(int eventId, String packageName);
 }
\ No newline at end of file
diff --git a/core/java/android/net/INetworkStackConnector.aidl b/core/java/android/net/INetworkStackConnector.aidl
index 8b64f1c..e052488 100644
--- a/core/java/android/net/INetworkStackConnector.aidl
+++ b/core/java/android/net/INetworkStackConnector.aidl
@@ -16,6 +16,7 @@
 package android.net;
 
 import android.net.INetworkMonitorCallbacks;
+import android.net.NetworkParcelable;
 import android.net.dhcp.DhcpServingParamsParcel;
 import android.net.dhcp.IDhcpServerCallbacks;
 import android.net.ip.IIpClientCallbacks;
@@ -24,6 +25,7 @@
 oneway interface INetworkStackConnector {
     void makeDhcpServer(in String ifName, in DhcpServingParamsParcel params,
         in IDhcpServerCallbacks cb);
-    void makeNetworkMonitor(int netId, String name, in INetworkMonitorCallbacks cb);
+    void makeNetworkMonitor(in NetworkParcelable network, String name,
+        in INetworkMonitorCallbacks cb);
     void makeIpClient(in String ifName, in IIpClientCallbacks callbacks);
 }
\ No newline at end of file
diff --git a/core/java/android/net/IpPrefix.java b/core/java/android/net/IpPrefix.java
index b996cda..175263f 100644
--- a/core/java/android/net/IpPrefix.java
+++ b/core/java/android/net/IpPrefix.java
@@ -104,6 +104,8 @@
      *
      * @hide
      */
+    @SystemApi
+    @TestApi
     public IpPrefix(String prefix) {
         // We don't reuse the (InetAddress, int) constructor because "error: call to this must be
         // first statement in constructor". We could factor out setting the member variables to an
diff --git a/core/java/android/net/LinkAddress.java b/core/java/android/net/LinkAddress.java
index fbd602c..8d779aa 100644
--- a/core/java/android/net/LinkAddress.java
+++ b/core/java/android/net/LinkAddress.java
@@ -176,6 +176,7 @@
      * @hide
      */
     @SystemApi
+    @TestApi
     public LinkAddress(InetAddress address, int prefixLength) {
         this(address, prefixLength, 0, 0);
         this.scope = scopeForUnicastAddress(address);
@@ -199,6 +200,7 @@
      * @hide
      */
     @SystemApi
+    @TestApi
     public LinkAddress(String address) {
         this(address, 0, 0);
         this.scope = scopeForUnicastAddress(this.address);
@@ -212,6 +214,8 @@
      * @param scope The address scope.
      * @hide
      */
+    @SystemApi
+    @TestApi
     public LinkAddress(String address, int flags, int scope) {
         // This may throw an IllegalArgumentException; catching it is the caller's responsibility.
         // TODO: consider rejecting mapped IPv4 addresses such as "::ffff:192.0.2.5/24".
diff --git a/core/java/android/net/LinkProperties.java b/core/java/android/net/LinkProperties.java
index 6628701..42db0fd 100644
--- a/core/java/android/net/LinkProperties.java
+++ b/core/java/android/net/LinkProperties.java
@@ -287,7 +287,8 @@
      * @return true if {@code address} was added or updated, false otherwise.
      * @hide
      */
-    @UnsupportedAppUsage
+    @SystemApi
+    @TestApi
     public boolean addLinkAddress(LinkAddress address) {
         if (address == null) {
             return false;
@@ -315,6 +316,8 @@
      * @return true if the address was removed, false if it did not exist.
      * @hide
      */
+    @SystemApi
+    @TestApi
     public boolean removeLinkAddress(LinkAddress toRemove) {
         int i = findLinkAddressIndex(toRemove);
         if (i >= 0) {
diff --git a/core/java/android/net/Network.java b/core/java/android/net/Network.java
index 2c831de..e04b5fc 100644
--- a/core/java/android/net/Network.java
+++ b/core/java/android/net/Network.java
@@ -123,6 +123,8 @@
     /**
      * @hide
      */
+    @SystemApi
+    @TestApi
     public Network(Network that) {
         this(that.netId, that.mPrivateDnsBypass);
     }
diff --git a/core/java/android/net/NetworkAgent.java b/core/java/android/net/NetworkAgent.java
index 99bfc14..204c25f 100644
--- a/core/java/android/net/NetworkAgent.java
+++ b/core/java/android/net/NetworkAgent.java
@@ -58,6 +58,7 @@
     private static final long BW_REFRESH_MIN_WIN_MS = 500;
     private boolean mPollLceScheduled = false;
     private AtomicBoolean mPollLcePending = new AtomicBoolean(false);
+    public final int mFactorySerialNumber;
 
     private static final int BASE = Protocol.BASE_NETWORK_AGENT;
 
@@ -193,16 +194,31 @@
      */
     public static final int CMD_PREVENT_AUTOMATIC_RECONNECT = BASE + 15;
 
+    // TODO : remove these two constructors. They are a stopgap measure to help sheperding a number
+    // of dependent changes that would conflict throughout the automerger graph. Having these
+    // temporarily helps with the process of going through with all these dependent changes across
+    // the entire tree.
     public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
             NetworkCapabilities nc, LinkProperties lp, int score) {
-        this(looper, context, logTag, ni, nc, lp, score, null);
+        this(looper, context, logTag, ni, nc, lp, score, null, NetworkFactory.SerialNumber.NONE);
+    }
+    public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
+            NetworkCapabilities nc, LinkProperties lp, int score, NetworkMisc misc) {
+        this(looper, context, logTag, ni, nc, lp, score, misc, NetworkFactory.SerialNumber.NONE);
     }
 
     public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
-            NetworkCapabilities nc, LinkProperties lp, int score, NetworkMisc misc) {
+            NetworkCapabilities nc, LinkProperties lp, int score, int factorySerialNumber) {
+        this(looper, context, logTag, ni, nc, lp, score, null, factorySerialNumber);
+    }
+
+    public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
+            NetworkCapabilities nc, LinkProperties lp, int score, NetworkMisc misc,
+            int factorySerialNumber) {
         super(looper);
         LOG_TAG = logTag;
         mContext = context;
+        mFactorySerialNumber = factorySerialNumber;
         if (ni == null || nc == null || lp == null) {
             throw new IllegalArgumentException();
         }
@@ -211,7 +227,8 @@
         ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService(
                 Context.CONNECTIVITY_SERVICE);
         netId = cm.registerNetworkAgent(new Messenger(this), new NetworkInfo(ni),
-                new LinkProperties(lp), new NetworkCapabilities(nc), score, misc);
+                new LinkProperties(lp), new NetworkCapabilities(nc), score, misc,
+                factorySerialNumber);
     }
 
     @Override
diff --git a/core/java/android/net/NetworkFactory.java b/core/java/android/net/NetworkFactory.java
index 181cab4..0dfe7a4 100644
--- a/core/java/android/net/NetworkFactory.java
+++ b/core/java/android/net/NetworkFactory.java
@@ -32,6 +32,7 @@
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
+import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * A NetworkFactory is an entity that creates NetworkAgent objects.
@@ -49,6 +50,20 @@
  * @hide
  **/
 public class NetworkFactory extends Handler {
+    /** @hide */
+    public static class SerialNumber {
+        // Guard used by no network factory.
+        public static final int NONE = -1;
+        // A hardcoded serial number for NetworkAgents representing VPNs. These agents are
+        // not created by any factory, so they use this constant for clarity instead of NONE.
+        public static final int VPN = -2;
+        private static final AtomicInteger sNetworkFactorySerialNumber = new AtomicInteger(1);
+        /** Returns a unique serial number for a factory. */
+        public static final int nextSerialNumber() {
+            return sNetworkFactorySerialNumber.getAndIncrement();
+        }
+    }
+
     private static final boolean DBG = true;
     private static final boolean VDBG = false;
 
@@ -64,7 +79,7 @@
      * disregard any that it will never be able to service, for example
      * those requiring a different bearer.
      * msg.obj = NetworkRequest
-     * msg.arg1 = score - the score of the any network currently satisfying this
+     * msg.arg1 = score - the score of the network currently satisfying this
      *            request.  If this bearer knows in advance it cannot
      *            exceed this score it should not try to connect, holding the request
      *            for the future.
@@ -74,6 +89,8 @@
      *            with the same NetworkRequest but an updated score.
      *            Also, network conditions may change for this bearer
      *            allowing for a better score in the future.
+     * msg.arg2 = the serial number of the factory currently responsible for the
+     *            NetworkAgent handling this request, or SerialNumber.NONE if none.
      */
     public static final int CMD_REQUEST_NETWORK = BASE;
 
@@ -107,6 +124,7 @@
 
     private int mRefCount = 0;
     private Messenger mMessenger = null;
+    private int mSerialNumber;
 
     @UnsupportedAppUsage
     public NetworkFactory(Looper looper, Context context, String logTag,
@@ -121,7 +139,8 @@
         if (DBG) log("Registering NetworkFactory");
         if (mMessenger == null) {
             mMessenger = new Messenger(this);
-            ConnectivityManager.from(mContext).registerNetworkFactory(mMessenger, LOG_TAG);
+            mSerialNumber = ConnectivityManager.from(mContext).registerNetworkFactory(mMessenger,
+                    LOG_TAG);
         }
     }
 
@@ -137,7 +156,7 @@
     public void handleMessage(Message msg) {
         switch (msg.what) {
             case CMD_REQUEST_NETWORK: {
-                handleAddRequest((NetworkRequest)msg.obj, msg.arg1);
+                handleAddRequest((NetworkRequest) msg.obj, msg.arg1, msg.arg2);
                 break;
             }
             case CMD_CANCEL_REQUEST: {
@@ -159,11 +178,13 @@
         public final NetworkRequest request;
         public int score;
         public boolean requested; // do we have a request outstanding, limited by score
+        public int factorySerialNumber;
 
-        public NetworkRequestInfo(NetworkRequest request, int score) {
+        NetworkRequestInfo(NetworkRequest request, int score, int factorySerialNumber) {
             this.request = request;
             this.score = score;
             this.requested = false;
+            this.factorySerialNumber = factorySerialNumber;
         }
 
         @Override
@@ -172,16 +193,51 @@
         }
     }
 
+    /**
+     * Add a NetworkRequest that the bearer may want to attempt to satisfy.
+     * @see #CMD_REQUEST_NETWORK
+     *
+     * @param request the request to handle.
+     * @param score the score of the NetworkAgent currently satisfying this request.
+     * @param servingFactorySerialNumber the serial number of the NetworkFactory that
+     *         created the NetworkAgent currently satisfying this request.
+     */
+    // TODO : remove this method. It is a stopgap measure to help sheperding a number
+    // of dependent changes that would conflict throughout the automerger graph. Having this
+    // temporarily helps with the process of going through with all these dependent changes across
+    // the entire tree.
     @VisibleForTesting
     protected void handleAddRequest(NetworkRequest request, int score) {
+        handleAddRequest(request, score, SerialNumber.NONE);
+    }
+
+    /**
+     * Add a NetworkRequest that the bearer may want to attempt to satisfy.
+     * @see #CMD_REQUEST_NETWORK
+     *
+     * @param request the request to handle.
+     * @param score the score of the NetworkAgent currently satisfying this request.
+     * @param servingFactorySerialNumber the serial number of the NetworkFactory that
+     *         created the NetworkAgent currently satisfying this request.
+     */
+    @VisibleForTesting
+    protected void handleAddRequest(NetworkRequest request, int score,
+            int servingFactorySerialNumber) {
         NetworkRequestInfo n = mNetworkRequests.get(request.requestId);
         if (n == null) {
-            if (DBG) log("got request " + request + " with score " + score);
-            n = new NetworkRequestInfo(request, score);
+            if (DBG) {
+                log("got request " + request + " with score " + score
+                        + " and serial " + servingFactorySerialNumber);
+            }
+            n = new NetworkRequestInfo(request, score, servingFactorySerialNumber);
             mNetworkRequests.put(n.request.requestId, n);
         } else {
-            if (VDBG) log("new score " + score + " for exisiting request " + request);
+            if (VDBG) {
+                log("new score " + score + " for exisiting request " + request
+                        + " with serial " + servingFactorySerialNumber);
+            }
             n.score = score;
+            n.factorySerialNumber = servingFactorySerialNumber;
         }
         if (VDBG) log("  my score=" + mScore + ", my filter=" + mCapabilityFilter);
 
@@ -231,16 +287,19 @@
     }
 
     private void evalRequest(NetworkRequestInfo n) {
-        if (VDBG) log("evalRequest");
-        if (n.requested == false && n.score < mScore &&
-                n.request.networkCapabilities.satisfiedByNetworkCapabilities(
-                mCapabilityFilter) && acceptRequest(n.request, n.score)) {
+        if (VDBG) {
+            log("evalRequest");
+            log(" n.requests = " + n.requested);
+            log(" n.score = " + n.score);
+            log(" mScore = " + mScore);
+            log(" n.factorySerialNumber = " + n.factorySerialNumber);
+            log(" mSerialNumber = " + mSerialNumber);
+        }
+        if (shouldNeedNetworkFor(n)) {
             if (VDBG) log("  needNetworkFor");
             needNetworkFor(n.request, n.score);
             n.requested = true;
-        } else if (n.requested == true &&
-                (n.score > mScore || n.request.networkCapabilities.satisfiedByNetworkCapabilities(
-                mCapabilityFilter) == false || acceptRequest(n.request, n.score) == false)) {
+        } else if (shouldReleaseNetworkFor(n)) {
             if (VDBG) log("  releaseNetworkFor");
             releaseNetworkFor(n.request);
             n.requested = false;
@@ -249,10 +308,39 @@
         }
     }
 
+    private boolean shouldNeedNetworkFor(NetworkRequestInfo n) {
+        // If this request is already tracked, it doesn't qualify for need
+        return !n.requested
+            // If the score of this request is higher or equal to that of this factory and some
+            // other factory is responsible for it, then this factory should not track the request
+            // because it has no hope of satisfying it.
+            && (n.score < mScore || n.factorySerialNumber == mSerialNumber)
+            // If this factory can't satisfy the capability needs of this request, then it
+            // should not be tracked.
+            && n.request.networkCapabilities.satisfiedByNetworkCapabilities(mCapabilityFilter)
+            // Finally if the concrete implementation of the factory rejects the request, then
+            // don't track it.
+            && acceptRequest(n.request, n.score);
+    }
+
+    private boolean shouldReleaseNetworkFor(NetworkRequestInfo n) {
+        // Don't release a request that's not tracked.
+        return n.requested
+            // The request should be released if it can't be satisfied by this factory. That
+            // means either of the following conditions are met :
+            // - Its score is too high to be satisfied by this factory and it's not already
+            //   assigned to the factory
+            // - This factory can't satisfy the capability needs of the request
+            // - The concrete implementation of the factory rejects the request
+            && ((n.score > mScore && n.factorySerialNumber != mSerialNumber)
+                    || !n.request.networkCapabilities.satisfiedByNetworkCapabilities(
+                            mCapabilityFilter)
+                    || !acceptRequest(n.request, n.score));
+    }
+
     private void evalRequests() {
         for (int i = 0; i < mNetworkRequests.size(); i++) {
             NetworkRequestInfo n = mNetworkRequests.valueAt(i);
-
             evalRequest(n);
         }
     }
@@ -280,16 +368,6 @@
         if (--mRefCount == 0) stopNetwork();
     }
 
-
-    public void addNetworkRequest(NetworkRequest networkRequest, int score) {
-        sendMessage(obtainMessage(CMD_REQUEST_NETWORK,
-                new NetworkRequestInfo(networkRequest, score)));
-    }
-
-    public void removeNetworkRequest(NetworkRequest networkRequest) {
-        sendMessage(obtainMessage(CMD_CANCEL_REQUEST, networkRequest));
-    }
-
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
     public void setScoreFilter(int score) {
         sendMessage(obtainMessage(CMD_SET_SCORE, score, 0));
@@ -304,6 +382,10 @@
         return mNetworkRequests.size();
     }
 
+    public int getSerialNumber() {
+        return mSerialNumber;
+    }
+
     protected void log(String s) {
         Log.d(LOG_TAG, s);
     }
@@ -321,10 +403,11 @@
 
     @Override
     public String toString() {
-        StringBuilder sb = new StringBuilder("{").append(LOG_TAG).append(" - ScoreFilter=").
-                append(mScore).append(", Filter=").append(mCapabilityFilter).append(", requests=").
-                append(mNetworkRequests.size()).append(", refCount=").append(mRefCount).
-                append("}");
+        StringBuilder sb = new StringBuilder("{").append(LOG_TAG).append(" - mSerialNumber=")
+                .append(mSerialNumber).append(", ScoreFilter=")
+                .append(mScore).append(", Filter=").append(mCapabilityFilter).append(", requests=")
+                .append(mNetworkRequests.size()).append(", refCount=").append(mRefCount)
+                .append("}");
         return sb.toString();
     }
 }
diff --git a/core/java/android/net/NetworkSpecifier.java b/core/java/android/net/NetworkSpecifier.java
index fcfb720..2bc3eb5 100644
--- a/core/java/android/net/NetworkSpecifier.java
+++ b/core/java/android/net/NetworkSpecifier.java
@@ -23,7 +23,6 @@
  * subclasses of this class via other APIs.
  */
 public abstract class NetworkSpecifier {
-    /** @hide */
     public NetworkSpecifier() {}
 
     /**
diff --git a/core/java/android/net/NetworkStack.java b/core/java/android/net/NetworkStack.java
index d277034..b6cd635 100644
--- a/core/java/android/net/NetworkStack.java
+++ b/core/java/android/net/NetworkStack.java
@@ -20,7 +20,9 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.SystemApi;
 import android.annotation.SystemService;
+import android.annotation.TestApi;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -46,9 +48,22 @@
  * @hide
  */
 @SystemService(Context.NETWORK_STACK_SERVICE)
+@SystemApi
+@TestApi
 public class NetworkStack {
     private static final String TAG = NetworkStack.class.getSimpleName();
 
+    /**
+     * Permission granted only to the NetworkStack APK, defined in NetworkStackStub with signature
+     * protection level.
+     * @hide
+     */
+    @SystemApi
+    @TestApi
+    public static final String PERMISSION_MAINLINE_NETWORK_STACK =
+            "android.permission.MAINLINE_NETWORK_STACK";
+
+    /** @hide */
     public static final String NETWORKSTACK_PACKAGE_NAME = "com.android.mainline.networkstack";
 
     private static final int NETWORKSTACK_TIMEOUT_MS = 10_000;
@@ -66,12 +81,14 @@
         void onNetworkStackConnected(INetworkStackConnector connector);
     }
 
+    /** @hide */
     public NetworkStack() { }
 
     /**
      * Create a DHCP server according to the specified parameters.
      *
      * <p>The server will be returned asynchronously through the provided callbacks.
+     * @hide
      */
     public void makeDhcpServer(final String ifName, final DhcpServingParamsParcel params,
             final IDhcpServerCallbacks cb) {
@@ -88,6 +105,7 @@
      * Create an IpClient on the specified interface.
      *
      * <p>The IpClient will be returned asynchronously through the provided callbacks.
+     * @hide
      */
     public void makeIpClient(String ifName, IIpClientCallbacks cb) {
         requestConnector(connector -> {
@@ -103,11 +121,13 @@
      * Create a NetworkMonitor.
      *
      * <p>The INetworkMonitor will be returned asynchronously through the provided callbacks.
+     * @hide
      */
-    public void makeNetworkMonitor(Network network, String name, INetworkMonitorCallbacks cb) {
+    public void makeNetworkMonitor(
+            NetworkParcelable network, String name, INetworkMonitorCallbacks cb) {
         requestConnector(connector -> {
             try {
-                connector.makeNetworkMonitor(network.netId, name, cb);
+                connector.makeNetworkMonitor(network, name, cb);
             } catch (RemoteException e) {
                 e.rethrowFromSystemServer();
             }
@@ -152,6 +172,7 @@
      * the system server on devices that do not support the network stack module. The network stack
      * connector will then be delivered asynchronously to clients that requested it before it was
      * started.
+     * @hide
      */
     public void start(Context context) {
         mNetworkStackStartRequested = true;
@@ -222,7 +243,7 @@
     private void requestConnector(@NonNull NetworkStackCallback request) {
         // TODO: PID check.
         final int caller = Binder.getCallingUid();
-        if (caller != Process.SYSTEM_UID && caller != Process.BLUETOOTH_UID) {
+        if (caller != Process.SYSTEM_UID && !UserHandle.isSameApp(caller, Process.BLUETOOTH_UID)) {
             // Don't even attempt to obtain the connector and give a nice error message
             throw new SecurityException(
                     "Only the system server should try to bind to the network stack.");
diff --git a/core/java/android/net/NetworkUtils.java b/core/java/android/net/NetworkUtils.java
index 39db4fe..6a17203 100644
--- a/core/java/android/net/NetworkUtils.java
+++ b/core/java/android/net/NetworkUtils.java
@@ -23,7 +23,6 @@
 import android.annotation.UnsupportedAppUsage;
 import android.net.shared.Inet4AddressUtils;
 import android.os.Build;
-import android.os.Parcel;
 import android.system.ErrnoException;
 import android.system.Os;
 import android.util.Log;
@@ -252,32 +251,6 @@
     }
 
     /**
-     * Writes an InetAddress to a parcel. The address may be null. This is likely faster than
-     * calling writeSerializable.
-     */
-    protected static void parcelInetAddress(Parcel parcel, InetAddress address, int flags) {
-        byte[] addressArray = (address != null) ? address.getAddress() : null;
-        parcel.writeByteArray(addressArray);
-    }
-
-    /**
-     * Reads an InetAddress from a parcel. Returns null if the address that was written was null
-     * or if the data is invalid.
-     */
-    protected static InetAddress unparcelInetAddress(Parcel in) {
-        byte[] addressArray = in.createByteArray();
-        if (addressArray == null) {
-            return null;
-        }
-        try {
-            return InetAddress.getByAddress(addressArray);
-        } catch (UnknownHostException e) {
-            return null;
-        }
-    }
-
-
-    /**
      *  Masks a raw IP address byte array with the specified prefix length.
      */
     public static void maskRawAddress(byte[] array, int prefixLength) {
diff --git a/core/java/android/net/StaticIpConfiguration.java b/core/java/android/net/StaticIpConfiguration.java
index 25bae3c..99cf3a9 100644
--- a/core/java/android/net/StaticIpConfiguration.java
+++ b/core/java/android/net/StaticIpConfiguration.java
@@ -19,6 +19,7 @@
 import android.annotation.SystemApi;
 import android.annotation.TestApi;
 import android.annotation.UnsupportedAppUsage;
+import android.net.shared.InetAddressUtils;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -232,10 +233,10 @@
     @Override
     public void writeToParcel(Parcel dest, int flags) {
         dest.writeParcelable(ipAddress, flags);
-        NetworkUtils.parcelInetAddress(dest, gateway, flags);
+        InetAddressUtils.parcelInetAddress(dest, gateway, flags);
         dest.writeInt(dnsServers.size());
         for (InetAddress dnsServer : dnsServers) {
-            NetworkUtils.parcelInetAddress(dest, dnsServer, flags);
+            InetAddressUtils.parcelInetAddress(dest, dnsServer, flags);
         }
         dest.writeString(domains);
     }
@@ -244,11 +245,11 @@
     public static StaticIpConfiguration readFromParcel(Parcel in) {
         final StaticIpConfiguration s = new StaticIpConfiguration();
         s.ipAddress = in.readParcelable(null);
-        s.gateway = NetworkUtils.unparcelInetAddress(in);
+        s.gateway = InetAddressUtils.unparcelInetAddress(in);
         s.dnsServers.clear();
         int size = in.readInt();
         for (int i = 0; i < size; i++) {
-            s.dnsServers.add(NetworkUtils.unparcelInetAddress(in));
+            s.dnsServers.add(InetAddressUtils.unparcelInetAddress(in));
         }
         s.domains = in.readString();
         return s;
diff --git a/core/java/android/net/TrafficStats.java b/core/java/android/net/TrafficStats.java
index bbf8f97..49c6f74 100644
--- a/core/java/android/net/TrafficStats.java
+++ b/core/java/android/net/TrafficStats.java
@@ -128,10 +128,14 @@
     public static final int TAG_SYSTEM_APP = 0xFFFFFF05;
 
     /** @hide */
+    @SystemApi
+    @TestApi
     public static final int TAG_SYSTEM_DHCP = 0xFFFFFF40;
     /** @hide */
     public static final int TAG_SYSTEM_NTP = 0xFFFFFF41;
     /** @hide */
+    @SystemApi
+    @TestApi
     public static final int TAG_SYSTEM_PROBE = 0xFFFFFF42;
     /** @hide */
     public static final int TAG_SYSTEM_NEIGHBOR = 0xFFFFFF43;
@@ -140,6 +144,8 @@
     /** @hide */
     public static final int TAG_SYSTEM_PAC = 0xFFFFFF45;
     /** @hide */
+    @SystemApi
+    @TestApi
     public static final int TAG_SYSTEM_DHCP_SERVER = 0xFFFFFF46;
 
     private static INetworkStatsService sStatsService;
diff --git a/core/java/android/net/VpnService.java b/core/java/android/net/VpnService.java
index dc099a4..784f233 100644
--- a/core/java/android/net/VpnService.java
+++ b/core/java/android/net/VpnService.java
@@ -791,6 +791,27 @@
         }
 
         /**
+         * Marks the VPN network as metered. A VPN network is classified as metered when the user is
+         * sensitive to heavy data usage due to monetary costs and/or data limitations. In such
+         * cases, you should set this to {@code true} so that apps on the system can avoid doing
+         * large data transfers. Otherwise, set this to {@code false}. Doing so would cause VPN
+         * network to inherit its meteredness from its underlying networks.
+         *
+         * <p>VPN apps targeting {@link android.os.Build.VERSION_CODES#Q} or above will be
+         * considered metered by default.
+         *
+         * @param isMetered {@code true} if VPN network should be treated as metered regardless of
+         *     underlying network meteredness
+         * @return this {@link Builder} object to facilitate chaining method calls
+         * @see #setUnderlyingNetworks(Networks[])
+         * @see ConnectivityManager#isActiveNetworkMetered()
+         */
+        public Builder setMetered(boolean isMetered) {
+            mConfig.isMetered = isMetered;
+            return this;
+        }
+
+        /**
          * Create a VPN interface using the parameters supplied to this
          * builder. The interface works on IP packets, and a file descriptor
          * is returned for the application to access them. Each read
diff --git a/core/java/android/net/apf/ApfCapabilities.java b/core/java/android/net/apf/ApfCapabilities.java
index 73cf94b..e09fa8f 100644
--- a/core/java/android/net/apf/ApfCapabilities.java
+++ b/core/java/android/net/apf/ApfCapabilities.java
@@ -18,6 +18,9 @@
 
 import android.annotation.SystemApi;
 import android.annotation.TestApi;
+import android.content.Context;
+
+import com.android.internal.R;
 
 /**
  * APF program support capabilities.
@@ -74,4 +77,18 @@
     public boolean hasDataAccess() {
         return apfVersionSupported >= 4;
     }
+
+    /**
+     * @return Whether the APF Filter in the device should filter out IEEE 802.3 Frames.
+     */
+    public static boolean getApfDrop8023Frames(Context context) {
+        return context.getResources().getBoolean(R.bool.config_apfDrop802_3Frames);
+    }
+
+    /**
+     * @return An array of blacklisted EtherType, packets with EtherTypes within it will be dropped.
+     */
+    public static int[] getApfEthTypeBlackList(Context context) {
+        return context.getResources().getIntArray(R.array.config_apfEthTypeBlackList);
+    }
 }
diff --git a/core/java/android/net/metrics/DhcpClientEvent.java b/core/java/android/net/metrics/DhcpClientEvent.java
index 2a942ee..3008115 100644
--- a/core/java/android/net/metrics/DhcpClientEvent.java
+++ b/core/java/android/net/metrics/DhcpClientEvent.java
@@ -31,10 +31,6 @@
 public final class DhcpClientEvent implements IpConnectivityLog.Event {
 
     // Names for recording DhcpClient pseudo-state transitions.
-    /** {@hide} Represents transitions from DhcpInitState to DhcpBoundState */
-    public static final String INITIAL_BOUND = "InitialBoundState";
-    /** {@hide} Represents transitions from and to DhcpBoundState via DhcpRenewingState */
-    public static final String RENEWING_BOUND = "RenewingBoundState";
 
     /** @hide */
     public final String msg;
diff --git a/packages/NetworkStack/src/android/net/util/FdEventsReader.java b/core/java/android/net/shared/FdEventsReader.java
similarity index 89%
rename from packages/NetworkStack/src/android/net/util/FdEventsReader.java
rename to core/java/android/net/shared/FdEventsReader.java
index 8bbf449..bffbfb1 100644
--- a/packages/NetworkStack/src/android/net/util/FdEventsReader.java
+++ b/core/java/android/net/shared/FdEventsReader.java
@@ -14,22 +14,22 @@
  * limitations under the License.
  */
 
-package android.net.util;
+package android.net.shared;
 
-import static android.os.MessageQueue.OnFileDescriptorEventListener.EVENT_INPUT;
 import static android.os.MessageQueue.OnFileDescriptorEventListener.EVENT_ERROR;
+import static android.os.MessageQueue.OnFileDescriptorEventListener.EVENT_INPUT;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.net.util.SocketUtils;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.MessageQueue;
 import android.system.ErrnoException;
 import android.system.OsConstants;
 
-import libcore.io.IoUtils;
-
 import java.io.FileDescriptor;
+import java.io.IOException;
 
 
 /**
@@ -63,6 +63,7 @@
  * All public methods MUST only be called from the same thread with which
  * the Handler constructor argument is associated.
  *
+ * @param <BufferType> the type of the buffer used to read data.
  * @hide
  */
 public abstract class FdEventsReader<BufferType> {
@@ -80,7 +81,10 @@
     private long mPacketsReceived;
 
     protected static void closeFd(FileDescriptor fd) {
-        IoUtils.closeQuietly(fd);
+        try {
+            SocketUtils.closeSocket(fd);
+        } catch (IOException ignored) {
+        }
     }
 
     protected FdEventsReader(@NonNull Handler h, @NonNull BufferType buffer) {
@@ -89,6 +93,7 @@
         mBuffer = buffer;
     }
 
+    /** Start this FdEventsReader. */
     public void start() {
         if (onCorrectThread()) {
             createAndRegisterFd();
@@ -100,6 +105,7 @@
         }
     }
 
+    /** Stop this FdEventsReader and destroy the file descriptor. */
     public void stop() {
         if (onCorrectThread()) {
             unregisterAndDestroyFd();
@@ -112,22 +118,29 @@
     }
 
     @NonNull
-    public Handler getHandler() { return mHandler; }
+    public Handler getHandler() {
+        return mHandler;
+    }
 
     protected abstract int recvBufSize(@NonNull BufferType buffer);
 
-    public int recvBufSize() { return recvBufSize(mBuffer); }
+    /** Returns the size of the receive buffer. */
+    public int recvBufSize() {
+        return recvBufSize(mBuffer);
+    }
 
     /**
      * Get the number of successful calls to {@link #readPacket(FileDescriptor, Object)}.
      *
      * <p>A call was successful if {@link #readPacket(FileDescriptor, Object)} returned a value > 0.
      */
-    public final long numPacketsReceived() { return mPacketsReceived; }
+    public final long numPacketsReceived() {
+        return mPacketsReceived;
+    }
 
     /**
-     * Subclasses MUST create the listening socket here, including setting
-     * all desired socket options, interface or address/port binding, etc.
+     * Subclasses MUST create the listening socket here, including setting all desired socket
+     * options, interface or address/port binding, etc. The socket MUST be created nonblocking.
      */
     @Nullable
     protected abstract FileDescriptor createFd();
@@ -171,10 +184,6 @@
 
         try {
             mFd = createFd();
-            if (mFd != null) {
-                // Force the socket to be non-blocking.
-                IoUtils.setBlocking(mFd, false);
-            }
         } catch (Exception e) {
             logError("Failed to create socket: ", e);
             closeFd(mFd);
@@ -199,7 +208,9 @@
         onStart();
     }
 
-    private boolean isRunning() { return (mFd != null) && mFd.valid(); }
+    private boolean isRunning() {
+        return (mFd != null) && mFd.valid();
+    }
 
     // Keep trying to read until we get EAGAIN/EWOULDBLOCK or some fatal error.
     private boolean handleInput() {
diff --git a/core/java/android/net/shared/InetAddressUtils.java b/core/java/android/net/shared/InetAddressUtils.java
new file mode 100644
index 0000000..c9ee3a7
--- /dev/null
+++ b/core/java/android/net/shared/InetAddressUtils.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.shared;
+
+import android.os.Parcel;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/**
+ * Collection of utilities to interact with {@link InetAddress}
+ * @hide
+ */
+public class InetAddressUtils {
+
+    /**
+     * Writes an InetAddress to a parcel. The address may be null. This is likely faster than
+     * calling writeSerializable.
+     * @hide
+     */
+    public static void parcelInetAddress(Parcel parcel, InetAddress address, int flags) {
+        byte[] addressArray = (address != null) ? address.getAddress() : null;
+        parcel.writeByteArray(addressArray);
+    }
+
+    /**
+     * Reads an InetAddress from a parcel. Returns null if the address that was written was null
+     * or if the data is invalid.
+     * @hide
+     */
+    public static InetAddress unparcelInetAddress(Parcel in) {
+        byte[] addressArray = in.createByteArray();
+        if (addressArray == null) {
+            return null;
+        }
+        try {
+            return InetAddress.getByAddress(addressArray);
+        } catch (UnknownHostException e) {
+            return null;
+        }
+    }
+
+    private InetAddressUtils() {}
+}
diff --git a/core/java/android/net/util/SocketUtils.java b/core/java/android/net/util/SocketUtils.java
index de67cf5..fbb15ed 100644
--- a/core/java/android/net/util/SocketUtils.java
+++ b/core/java/android/net/util/SocketUtils.java
@@ -20,20 +20,29 @@
 import static android.system.OsConstants.SO_BINDTODEVICE;
 
 import android.annotation.SystemApi;
+import android.annotation.TestApi;
+import android.net.MacAddress;
 import android.net.NetworkUtils;
 import android.system.ErrnoException;
 import android.system.NetlinkSocketAddress;
 import android.system.Os;
 import android.system.PacketSocketAddress;
+import android.system.StructTimeval;
+
+import libcore.io.IoBridge;
 
 import java.io.FileDescriptor;
+import java.io.IOException;
+import java.net.Inet4Address;
 import java.net.SocketAddress;
+import java.net.SocketException;
 
 /**
  * Collection of utilities to interact with raw sockets.
  * @hide
  */
 @SystemApi
+@TestApi
 public class SocketUtils {
     /**
      * Create a raw datagram socket that is bound to an interface.
@@ -57,18 +66,94 @@
     }
 
     /**
-     * Make a socket address to bind to packet sockets.
+     * Make socket address that packet sockets can bind to.
      */
     public static SocketAddress makePacketSocketAddress(short protocol, int ifIndex) {
         return new PacketSocketAddress(protocol, ifIndex);
     }
 
     /**
-     * Make a socket address to send raw packets.
+     * Make a socket address that packet socket can send packets to.
      */
     public static SocketAddress makePacketSocketAddress(int ifIndex, byte[] hwAddr) {
         return new PacketSocketAddress(ifIndex, hwAddr);
     }
 
+    /**
+     * Set an option on a socket that takes a time value argument.
+     */
+    public static void setSocketTimeValueOption(
+            FileDescriptor fd, int level, int option, long millis) throws ErrnoException {
+        Os.setsockoptTimeval(fd, level, option, StructTimeval.fromMillis(millis));
+    }
+
+    /**
+     * Bind a socket to the specified address.
+     */
+    public static void bindSocket(FileDescriptor fd, SocketAddress addr)
+            throws ErrnoException, SocketException {
+        Os.bind(fd, addr);
+    }
+
+    /**
+     * Connect a socket to the specified address.
+     */
+    public static void connectSocket(FileDescriptor fd, SocketAddress addr)
+            throws ErrnoException, SocketException {
+        Os.connect(fd, addr);
+    }
+
+    /**
+     * Send a message on a socket, using the specified SocketAddress.
+     */
+    public static void sendTo(FileDescriptor fd, byte[] bytes, int byteOffset, int byteCount,
+            int flags, SocketAddress addr) throws ErrnoException, SocketException {
+        Os.sendto(fd, bytes, byteOffset, byteCount, flags, addr);
+    }
+
+    /**
+     * @see IoBridge#closeAndSignalBlockedThreads(FileDescriptor)
+     */
+    public static void closeSocket(FileDescriptor fd) throws IOException {
+        IoBridge.closeAndSignalBlockedThreads(fd);
+    }
+
+    /**
+     * Attaches a socket filter that accepts DHCP packets to the given socket.
+     */
+    public static void attachDhcpFilter(FileDescriptor fd) throws SocketException {
+        NetworkUtils.attachDhcpFilter(fd);
+    }
+
+    /**
+     * Attaches a socket filter that accepts ICMPv6 router advertisements to the given socket.
+     * @param fd the socket's {@link FileDescriptor}.
+     * @param packetType the hardware address type, one of ARPHRD_*.
+     */
+    public static void attachRaFilter(FileDescriptor fd, int packetType) throws SocketException {
+        NetworkUtils.attachRaFilter(fd, packetType);
+    }
+
+    /**
+     * Attaches a socket filter that accepts L2-L4 signaling traffic required for IP connectivity.
+     *
+     * This includes: all ARP, ICMPv6 RS/RA/NS/NA messages, and DHCPv4 exchanges.
+     *
+     * @param fd the socket's {@link FileDescriptor}.
+     * @param packetType the hardware address type, one of ARPHRD_*.
+     */
+    public static void attachControlPacketFilter(FileDescriptor fd, int packetType)
+            throws SocketException {
+        NetworkUtils.attachControlPacketFilter(fd, packetType);
+    }
+
+    /**
+     * Add an entry into the ARP cache.
+     */
+    public static void addArpEntry(Inet4Address ipv4Addr, MacAddress ethAddr, String ifname,
+            FileDescriptor fd) throws IOException {
+        NetworkUtils.addArpEntry(ipv4Addr, ethAddr, ifname, fd);
+    }
+
     private SocketUtils() {}
 }
diff --git a/core/java/android/nfc/INfcAdapter.aidl b/core/java/android/nfc/INfcAdapter.aidl
index 6801618..0b2cfdd 100644
--- a/core/java/android/nfc/INfcAdapter.aidl
+++ b/core/java/android/nfc/INfcAdapter.aidl
@@ -68,4 +68,8 @@
     void removeNfcUnlockHandler(INfcUnlockHandler unlockHandler);
 
     void verifyNfcPermission();
+    boolean isNfcSecureEnabled();
+    boolean deviceSupportsNfcSecure();
+    boolean setNfcSecure(boolean enable);
+
 }
diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java
index e55e036..a7d2ee9 100644
--- a/core/java/android/nfc/NfcAdapter.java
+++ b/core/java/android/nfc/NfcAdapter.java
@@ -1702,6 +1702,63 @@
     }
 
     /**
+     * Sets Secure NFC feature.
+     * <p>This API is for the Settings application.
+     * @hide
+     */
+    @SystemApi
+    @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS)
+    public boolean setNfcSecure(boolean enable) {
+        if (!sHasNfcFeature) {
+            throw new UnsupportedOperationException();
+        }
+        try {
+            return sService.setNfcSecure(enable);
+        } catch (RemoteException e) {
+            attemptDeadServiceRecovery(e);
+            return false;
+        }
+    }
+
+    /**
+     * Checks if the device supports Secure NFC functionality.
+     *
+     * @return True if device supports Secure NFC, false otherwise
+     * @throws UnsupportedOperationException if FEATURE_NFC is unavailable.
+     */
+    public boolean deviceSupportsNfcSecure() {
+        if (!sHasNfcFeature) {
+            throw new UnsupportedOperationException();
+        }
+        try {
+            return sService.deviceSupportsNfcSecure();
+        } catch (RemoteException e) {
+            attemptDeadServiceRecovery(e);
+            return false;
+        }
+    }
+
+    /**
+     * Checks Secure NFC feature is enabled.
+     *
+     * @return True if device supports Secure NFC is enabled, false otherwise
+     * @throws UnsupportedOperationException if FEATURE_NFC is unavailable.
+     * @throws UnsupportedOperationException if device doesn't support
+     *         Secure NFC functionality. {@link #deviceSupportsNfcSecure}
+     */
+    public boolean isNfcSecureEnabled() {
+        if (!sHasNfcFeature) {
+            throw new UnsupportedOperationException();
+        }
+        try {
+            return sService.isNfcSecureEnabled();
+        } catch (RemoteException e) {
+            attemptDeadServiceRecovery(e);
+            return false;
+        }
+    }
+
+    /**
      * Enable NDEF Push feature.
      * <p>This API is for the Settings application.
      * @hide
diff --git a/packages/overlays/FontRubikRubikOverlay/res/values/strings.xml b/core/java/android/os/BatterySaverPolicyConfig.aidl
similarity index 60%
copy from packages/overlays/FontRubikRubikOverlay/res/values/strings.xml
copy to core/java/android/os/BatterySaverPolicyConfig.aidl
index 4bac7da..37c66d0 100644
--- a/packages/overlays/FontRubikRubikOverlay/res/values/strings.xml
+++ b/core/java/android/os/BatterySaverPolicyConfig.aidl
@@ -1,12 +1,11 @@
-<!--
-/**
- * Copyright (c) 2018, The Android Open Source Project
+/*
+ * Copyright (C) 2019 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *     http://www.apache.org/licenses/LICENSE-2.0
+ *      http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -14,8 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
--->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- Headline / Body font Rubik overlay -->
-    <string name="font_rubik_rubik_overlay" translatable="false">Rubik / Rubik</string>
-</resources>
+
+package android.os;
+
+parcelable BatterySaverPolicyConfig;
diff --git a/core/java/android/os/BatterySaverPolicyConfig.java b/core/java/android/os/BatterySaverPolicyConfig.java
new file mode 100644
index 0000000..b6e2b69
--- /dev/null
+++ b/core/java/android/os/BatterySaverPolicyConfig.java
@@ -0,0 +1,468 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os;
+
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.text.TextUtils;
+import android.util.ArrayMap;
+
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Config to set Battery Saver policy flags.
+ *
+ * @hide
+ */
+@SystemApi
+public final class BatterySaverPolicyConfig implements Parcelable {
+    private final float mAdjustBrightnessFactor;
+    private final boolean mAdvertiseIsEnabled;
+    private final boolean mDeferFullBackup;
+    private final boolean mDeferKeyValueBackup;
+    @NonNull
+    private final Map<String, String> mDeviceSpecificSettings;
+    private final boolean mDisableAnimation;
+    private final boolean mDisableAod;
+    private final boolean mDisableLaunchBoost;
+    private final boolean mDisableOptionalSensors;
+    private final boolean mDisableSoundTrigger;
+    private final boolean mDisableVibration;
+    private final boolean mEnableAdjustBrightness;
+    private final boolean mEnableDataSaver;
+    private final boolean mEnableFirewall;
+    private final boolean mEnableQuickDoze;
+    private final boolean mForceAllAppsStandby;
+    private final boolean mForceBackgroundCheck;
+    private final int mGpsMode;
+
+    private BatterySaverPolicyConfig(Builder in) {
+        mAdjustBrightnessFactor = Math.max(0, Math.min(in.mAdjustBrightnessFactor, 1f));
+        mAdvertiseIsEnabled = in.mAdvertiseIsEnabled;
+        mDeferFullBackup = in.mDeferFullBackup;
+        mDeferKeyValueBackup = in.mDeferKeyValueBackup;
+        mDeviceSpecificSettings = Collections.unmodifiableMap(in.mDeviceSpecificSettings);
+        mDisableAnimation = in.mDisableAnimation;
+        mDisableAod = in.mDisableAod;
+        mDisableLaunchBoost = in.mDisableLaunchBoost;
+        mDisableOptionalSensors = in.mDisableOptionalSensors;
+        mDisableSoundTrigger = in.mDisableSoundTrigger;
+        mDisableVibration = in.mDisableVibration;
+        mEnableAdjustBrightness = in.mEnableAdjustBrightness;
+        mEnableDataSaver = in.mEnableDataSaver;
+        mEnableFirewall = in.mEnableFirewall;
+        mEnableQuickDoze = in.mEnableQuickDoze;
+        mForceAllAppsStandby = in.mForceAllAppsStandby;
+        mForceBackgroundCheck = in.mForceBackgroundCheck;
+        mGpsMode = Math.max(PowerManager.MIN_LOCATION_MODE,
+                Math.min(in.mGpsMode, PowerManager.MAX_LOCATION_MODE));
+    }
+
+    private BatterySaverPolicyConfig(Parcel in) {
+        mAdjustBrightnessFactor = Math.max(0, Math.min(in.readFloat(), 1f));
+        mAdvertiseIsEnabled = in.readBoolean();
+        mDeferFullBackup = in.readBoolean();
+        mDeferKeyValueBackup = in.readBoolean();
+
+        final int size = in.readInt();
+        Map<String, String> deviceSpecificSettings = new ArrayMap<>(size);
+        for (int i = 0; i < size; ++i) {
+            String key = TextUtils.emptyIfNull(in.readString());
+            String val = TextUtils.emptyIfNull(in.readString());
+            if (key.trim().isEmpty()) {
+                continue;
+            }
+            deviceSpecificSettings.put(key, val);
+        }
+        mDeviceSpecificSettings = Collections.unmodifiableMap(deviceSpecificSettings);
+
+        mDisableAnimation = in.readBoolean();
+        mDisableAod = in.readBoolean();
+        mDisableLaunchBoost = in.readBoolean();
+        mDisableOptionalSensors = in.readBoolean();
+        mDisableSoundTrigger = in.readBoolean();
+        mDisableVibration = in.readBoolean();
+        mEnableAdjustBrightness = in.readBoolean();
+        mEnableDataSaver = in.readBoolean();
+        mEnableFirewall = in.readBoolean();
+        mEnableQuickDoze = in.readBoolean();
+        mForceAllAppsStandby = in.readBoolean();
+        mForceBackgroundCheck = in.readBoolean();
+        mGpsMode = Math.max(PowerManager.MIN_LOCATION_MODE,
+                Math.min(in.readInt(), PowerManager.MAX_LOCATION_MODE));
+    }
+
+    public static final Creator<BatterySaverPolicyConfig> CREATOR =
+            new Creator<BatterySaverPolicyConfig>() {
+                @Override
+                public BatterySaverPolicyConfig createFromParcel(Parcel in) {
+                    return new BatterySaverPolicyConfig(in);
+                }
+
+                @Override
+                public BatterySaverPolicyConfig[] newArray(int size) {
+                    return new BatterySaverPolicyConfig[size];
+                }
+            };
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeFloat(mAdjustBrightnessFactor);
+        dest.writeBoolean(mAdvertiseIsEnabled);
+        dest.writeBoolean(mDeferFullBackup);
+        dest.writeBoolean(mDeferKeyValueBackup);
+
+        final Set<Map.Entry<String, String>> entries = mDeviceSpecificSettings.entrySet();
+        final int size = entries.size();
+        dest.writeInt(size);
+        for (Map.Entry<String, String> entry : entries) {
+            dest.writeString(entry.getKey());
+            dest.writeString(entry.getValue());
+        }
+
+        dest.writeBoolean(mDisableAnimation);
+        dest.writeBoolean(mDisableAod);
+        dest.writeBoolean(mDisableLaunchBoost);
+        dest.writeBoolean(mDisableOptionalSensors);
+        dest.writeBoolean(mDisableSoundTrigger);
+        dest.writeBoolean(mDisableVibration);
+        dest.writeBoolean(mEnableAdjustBrightness);
+        dest.writeBoolean(mEnableDataSaver);
+        dest.writeBoolean(mEnableFirewall);
+        dest.writeBoolean(mEnableQuickDoze);
+        dest.writeBoolean(mForceAllAppsStandby);
+        dest.writeBoolean(mForceBackgroundCheck);
+        dest.writeInt(mGpsMode);
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        for (Map.Entry<String, String> entry : mDeviceSpecificSettings.entrySet()) {
+            sb.append(entry.getKey()).append("=").append(entry.getValue()).append(",");
+        }
+        return "adjust_brightness_disabled=" + !mEnableAdjustBrightness + ","
+                + "adjust_brightness_factor=" + mAdjustBrightnessFactor + ","
+                + "advertise_is_enabled=" + mAdvertiseIsEnabled + ","
+                + "animation_disabled=" + mDisableAnimation + ","
+                + "aod_disabled=" + mDisableAod + ","
+                + "datasaver_disabled=" + !mEnableDataSaver + ","
+                + "firewall_disabled=" + !mEnableFirewall + ","
+                + "force_all_apps_standby=" + mForceAllAppsStandby + ","
+                + "force_background_check=" + mForceBackgroundCheck + ","
+                + "fullbackup_deferred=" + mDeferFullBackup + ","
+                + "gps_mode=" + mGpsMode + ","
+                + "keyvaluebackup_deferred=" + mDeferKeyValueBackup + ","
+                + "launch_boost_disabled=" + mDisableLaunchBoost + ","
+                + "optional_sensors_disabled=" + mDisableOptionalSensors + ","
+                + "quick_doze_enabled=" + mEnableQuickDoze + ","
+                + "soundtrigger_disabled=" + mDisableSoundTrigger + ","
+                + "vibration_disabled=" + mDisableVibration + ","
+                + sb.toString();
+    }
+
+    /**
+     * How much to adjust the screen brightness while in Battery Saver. This will have no effect
+     * if {@link #getEnableAdjustBrightness()} is {@code false}.
+     */
+    public float getAdjustBrightnessFactor() {
+        return mAdjustBrightnessFactor;
+    }
+
+    /**
+     * Whether or not to tell the system (and other apps) that Battery Saver is currently enabled.
+     */
+    public boolean getAdvertiseIsEnabled() {
+        return mAdvertiseIsEnabled;
+    }
+
+    /** Whether or not to defer full backup while in Battery Saver. */
+    public boolean getDeferFullBackup() {
+        return mDeferFullBackup;
+    }
+
+    /** Whether or not to defer key-value backup while in Battery Saver. */
+    public boolean getDeferKeyValueBackup() {
+        return mDeferKeyValueBackup;
+    }
+
+    /**
+     * Returns the device-specific battery saver constants.
+     */
+    @NonNull
+    public Map<String, String> getDeviceSpecificSettings() {
+        return mDeviceSpecificSettings;
+    }
+
+    /** Whether or not to disable animation while in Battery Saver. */
+    public boolean getDisableAnimation() {
+        return mDisableAnimation;
+    }
+
+    /** Whether or not to disable Always On Display while in Battery Saver. */
+    public boolean getDisableAod() {
+        return mDisableAod;
+    }
+
+    /** Whether or not to disable launch boost while in Battery Saver. */
+    public boolean getDisableLaunchBoost() {
+        return mDisableLaunchBoost;
+    }
+
+    /** Whether or not to disable optional sensors while in Battery Saver. */
+    public boolean getDisableOptionalSensors() {
+        return mDisableOptionalSensors;
+    }
+
+    /** Whether or not to disable sound trigger while in Battery Saver. */
+    public boolean getDisableSoundTrigger() {
+        return mDisableSoundTrigger;
+    }
+
+    /** Whether or not to disable vibration while in Battery Saver. */
+    public boolean getDisableVibration() {
+        return mDisableVibration;
+    }
+
+    /** Whether or not to enable brightness adjustment while in Battery Saver. */
+    public boolean getEnableAdjustBrightness() {
+        return mEnableAdjustBrightness;
+    }
+
+    /** Whether or not to enable Data Saver while in Battery Saver. */
+    public boolean getEnableDataSaver() {
+        return mEnableDataSaver;
+    }
+
+    /** Whether or not to enable the network firewall while in Battery Saver. */
+    public boolean getEnableFirewall() {
+        return mEnableFirewall;
+    }
+
+    /** Whether or not to enable Quick Doze while in Battery Saver. */
+    public boolean getEnableQuickDoze() {
+        return mEnableQuickDoze;
+    }
+
+    /** Whether or not to force all apps to standby mode while in Battery Saver. */
+    public boolean getForceAllAppsStandby() {
+        return mForceAllAppsStandby;
+    }
+
+    /** Whether or not to force background check while in Battery Saver. */
+    public boolean getForceBackgroundCheck() {
+        return mForceBackgroundCheck;
+    }
+
+    /** The GPS mode while in Battery Saver. */
+    public int getGpsMode() {
+        return mGpsMode;
+    }
+
+    /** Builder class for constructing {@link BatterySaverPolicyConfig} objects. */
+    public static final class Builder {
+        private float mAdjustBrightnessFactor = 1f;
+        private boolean mAdvertiseIsEnabled = false;
+        private boolean mDeferFullBackup = false;
+        private boolean mDeferKeyValueBackup = false;
+        @NonNull
+        private final ArrayMap<String, String> mDeviceSpecificSettings = new ArrayMap<>();
+        private boolean mDisableAnimation = false;
+        private boolean mDisableAod = false;
+        private boolean mDisableLaunchBoost = false;
+        private boolean mDisableOptionalSensors = false;
+        private boolean mDisableSoundTrigger = false;
+        private boolean mDisableVibration = false;
+        private boolean mEnableAdjustBrightness = false;
+        private boolean mEnableDataSaver = false;
+        private boolean mEnableFirewall = false;
+        private boolean mEnableQuickDoze = false;
+        private boolean mForceAllAppsStandby = false;
+        private boolean mForceBackgroundCheck = false;
+        private int mGpsMode = PowerManager.LOCATION_MODE_NO_CHANGE;
+
+        public Builder() {
+        }
+
+        /**
+         * Set how much to adjust the screen brightness while in Battery Saver. The value should
+         * be in the [0, 1] range, where 1 will not change the brightness. This will have no
+         * effect if {@link #setEnableAdjustBrightness(boolean)} is not called with {@code true}.
+         */
+        @NonNull
+        public Builder setAdjustBrightnessFactor(float adjustBrightnessFactor) {
+            mAdjustBrightnessFactor = adjustBrightnessFactor;
+            return this;
+        }
+
+        /**
+         * Set whether or not to tell the system (and other apps) that Battery Saver is
+         * currently enabled.
+         */
+        @NonNull
+        public Builder setAdvertiseIsEnabled(boolean advertiseIsEnabled) {
+            mAdvertiseIsEnabled = advertiseIsEnabled;
+            return this;
+        }
+
+        /** Set whether or not to defer full backup while in Battery Saver. */
+        @NonNull
+        public Builder setDeferFullBackup(boolean deferFullBackup) {
+            mDeferFullBackup = deferFullBackup;
+            return this;
+        }
+
+        /** Set whether or not to defer key-value backup while in Battery Saver. */
+        @NonNull
+        public Builder setDeferKeyValueBackup(boolean deferKeyValueBackup) {
+            mDeferKeyValueBackup = deferKeyValueBackup;
+            return this;
+        }
+
+        /**
+         * Adds a key-value pair for device-specific battery saver constants. The supported keys
+         * and values are the same as those in
+         * {@link android.provider.Settings.Global#BATTERY_SAVER_DEVICE_SPECIFIC_CONSTANTS}.
+         *
+         * @throws IllegalArgumentException if the provided key is invalid (empty, null, or all
+         * whitespace)
+         */
+        @NonNull
+        public Builder addDeviceSpecificSetting(@NonNull String key, @NonNull String value) {
+            if (key == null) {
+                throw new IllegalArgumentException("Key cannot be null");
+            }
+            key = key.trim();
+            if (TextUtils.isEmpty(key)) {
+                throw new IllegalArgumentException("Key cannot be empty");
+            }
+            mDeviceSpecificSettings.put(key, TextUtils.emptyIfNull(value));
+            return this;
+        }
+
+        /** Set whether or not to disable animation while in Battery Saver. */
+        @NonNull
+        public Builder setDisableAnimation(boolean disableAnimation) {
+            mDisableAnimation = disableAnimation;
+            return this;
+        }
+
+        /** Set whether or not to disable Always On Display while in Battery Saver. */
+        @NonNull
+        public Builder setDisableAod(boolean disableAod) {
+            mDisableAod = disableAod;
+            return this;
+        }
+
+        /** Set whether or not to disable launch boost while in Battery Saver. */
+        @NonNull
+        public Builder setDisableLaunchBoost(boolean disableLaunchBoost) {
+            mDisableLaunchBoost = disableLaunchBoost;
+            return this;
+        }
+
+        /** Set whether or not to disable optional sensors while in Battery Saver. */
+        @NonNull
+        public Builder setDisableOptionalSensors(boolean disableOptionalSensors) {
+            mDisableOptionalSensors = disableOptionalSensors;
+            return this;
+        }
+
+        /** Set whether or not to disable sound trigger while in Battery Saver. */
+        @NonNull
+        public Builder setDisableSoundTrigger(boolean disableSoundTrigger) {
+            mDisableSoundTrigger = disableSoundTrigger;
+            return this;
+        }
+
+        /** Set whether or not to disable vibration while in Battery Saver. */
+        @NonNull
+        public Builder setDisableVibration(boolean disableVibration) {
+            mDisableVibration = disableVibration;
+            return this;
+        }
+
+        /** Set whether or not to enable brightness adjustment while in Battery Saver. */
+        @NonNull
+        public Builder setEnableAdjustBrightness(boolean enableAdjustBrightness) {
+            mEnableAdjustBrightness = enableAdjustBrightness;
+            return this;
+        }
+
+        /** Set whether or not to enable Data Saver while in Battery Saver. */
+        @NonNull
+        public Builder setEnableDataSaver(boolean enableDataSaver) {
+            mEnableDataSaver = enableDataSaver;
+            return this;
+        }
+
+        /** Set whether or not to enable the network firewall while in Battery Saver. */
+        @NonNull
+        public Builder setEnableFirewall(boolean enableFirewall) {
+            mEnableFirewall = enableFirewall;
+            return this;
+        }
+
+        /** Set whether or not to enable Quick Doze while in Battery Saver. */
+        @NonNull
+        public Builder setEnableQuickDoze(boolean enableQuickDoze) {
+            mEnableQuickDoze = enableQuickDoze;
+            return this;
+        }
+
+        /** Set whether or not to force all apps to standby mode while in Battery Saver. */
+        @NonNull
+        public Builder setForceAllAppsStandby(boolean forceAllAppsStandby) {
+            mForceAllAppsStandby = forceAllAppsStandby;
+            return this;
+        }
+
+        /** Set whether or not to force background check while in Battery Saver. */
+        @NonNull
+        public Builder setForceBackgroundCheck(boolean forceBackgroundCheck) {
+            mForceBackgroundCheck = forceBackgroundCheck;
+            return this;
+        }
+
+        /** Set the GPS mode while in Battery Saver. */
+        @NonNull
+        public Builder setGpsMode(@PowerManager.LocationPowerSaveMode int gpsMode) {
+            mGpsMode = gpsMode;
+            return this;
+        }
+
+        /**
+         * Build a {@link BatterySaverPolicyConfig} object using the set parameters. This object
+         * is immutable.
+         */
+        @NonNull
+        public BatterySaverPolicyConfig build() {
+            if (!mEnableAdjustBrightness && Float.compare(1f, mAdjustBrightnessFactor) != 0) {
+                throw new IllegalArgumentException("Brightness adjustment factor changed without "
+                        + "enabling brightness adjustment");
+            }
+            return new BatterySaverPolicyConfig(this);
+        }
+    }
+}
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index 1919fcc..ab6dd7c 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -16,6 +16,8 @@
 
 package android.os;
 
+import static android.app.ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE_LOCATION;
+
 import android.app.ActivityManager;
 import android.app.job.JobParameters;
 import android.content.Context;
@@ -578,7 +580,7 @@
             return ActivityManager.PROCESS_STATE_NONEXISTENT;
         } else if (procState == ActivityManager.PROCESS_STATE_TOP) {
             return Uid.PROCESS_STATE_TOP;
-        } else if (procState == ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE) {
+        } else if (ActivityManager.isForegroundService(procState)) {
             // State when app has put itself in the foreground.
             return Uid.PROCESS_STATE_FOREGROUND_SERVICE;
         } else if (procState <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) {
@@ -818,7 +820,9 @@
          * is not attributed to any non-critical process states.
          */
         public static final int[] CRITICAL_PROC_STATES = {
-            PROCESS_STATE_TOP, PROCESS_STATE_FOREGROUND_SERVICE, PROCESS_STATE_FOREGROUND
+                PROCESS_STATE_TOP,
+                PROCESS_STATE_FOREGROUND_SERVICE_LOCATION, PROCESS_STATE_FOREGROUND_SERVICE,
+                PROCESS_STATE_FOREGROUND
         };
 
         public abstract long getProcessStateTime(int state, long elapsedRealtimeUs, int which);
diff --git a/core/java/android/os/DumpstateOptions.java b/core/java/android/os/DumpstateOptions.java
deleted file mode 100644
index 53037b24..0000000
--- a/core/java/android/os/DumpstateOptions.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.os;
-
-/**
- * Options passed to dumpstate service.
- *
- * @hide
- */
-public final class DumpstateOptions implements Parcelable {
-    // If true the caller can get callbacks with per-section
-    // progress details.
-    private final boolean mGetSectionDetails;
-    // Name of the caller.
-    private final String mName;
-
-    public DumpstateOptions(Parcel in) {
-        mGetSectionDetails = in.readBoolean();
-        mName = in.readString();
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-     public void writeToParcel(Parcel out, int flags) {
-        out.writeBoolean(mGetSectionDetails);
-        out.writeString(mName);
-    }
-
-    public static final Parcelable.Creator<DumpstateOptions> CREATOR =
-            new Parcelable.Creator<DumpstateOptions>() {
-        public DumpstateOptions createFromParcel(Parcel in) {
-            return new DumpstateOptions(in);
-        }
-
-        public DumpstateOptions[] newArray(int size) {
-            return new DumpstateOptions[size];
-        }
-    };
-}
diff --git a/core/java/android/os/DynamicAndroidManager.java b/core/java/android/os/DynamicAndroidManager.java
new file mode 100644
index 0000000..5238896
--- /dev/null
+++ b/core/java/android/os/DynamicAndroidManager.java
@@ -0,0 +1,188 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os;
+
+import android.annotation.RequiresPermission;
+import android.annotation.SystemService;
+import android.content.Context;
+import android.gsi.GsiProgress;
+
+/**
+ * The DynamicAndroidManager offers a mechanism to use a new Android image temporarily. After the
+ * installation, the device can reboot into this image with a new created /data. This image will
+ * last until the next reboot and then the device will go back to the original image. However the
+ * installed image and the new created /data are not deleted but disabled. Thus the application can
+ * either re-enable the installed image by calling {@link #toggle} or use the {@link #remove} to
+ * delete it completely. In other words, there are three device states: no installation, installed
+ * and running. The procedure to install a DynamicAndroid starts with a {@link #startInstallation},
+ * followed by a series of {@link #write} and ends with a {@link commit}. Once the installation is
+ * complete, the device state changes from no installation to the installed state and a followed
+ * reboot will change its state to running. Note one instance of dynamic android can exist on a
+ * given device thus the {@link #startInstallation} will fail if the device is currently running a
+ * DynamicAndroid.
+ *
+ * @hide
+ */
+@SystemService(Context.DYNAMIC_ANDROID_SERVICE)
+public class DynamicAndroidManager {
+    private static final String TAG = "DynamicAndroidManager";
+
+    private final IDynamicAndroidService mService;
+
+    /** {@hide} */
+    public DynamicAndroidManager(IDynamicAndroidService service) {
+        mService = service;
+    }
+
+    /** The DynamicAndroidManager.Session represents a started session for the installation. */
+    public class Session {
+        private Session() {}
+        /**
+         * Write a chunk of the DynamicAndroid system image
+         *
+         * @return {@code true} if the call succeeds. {@code false} if there is any native runtime
+         *     error.
+         */
+        @RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_ANDROID)
+        public boolean write(byte[] buf) {
+            try {
+                return mService.write(buf);
+            } catch (RemoteException e) {
+                throw new RuntimeException(e.toString());
+            }
+        }
+
+        /**
+         * Finish write and make device to boot into the it after reboot.
+         *
+         * @return {@code true} if the call succeeds. {@code false} if there is any native runtime
+         *     error.
+         */
+        @RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_ANDROID)
+        public boolean commit() {
+            try {
+                return mService.commit();
+            } catch (RemoteException e) {
+                throw new RuntimeException(e.toString());
+            }
+        }
+    }
+    /**
+     * Start DynamicAndroid installation. This call may take an unbounded amount of time. The caller
+     * may use another thread to call the getStartProgress() to get the progress.
+     *
+     * @param systemSize system size in bytes
+     * @param userdataSize userdata size in bytes
+     * @return {@code true} if the call succeeds. {@code false} either the device does not contain
+     *     enough space or a DynamicAndroid is currently in use where the {@link #isInUse} would be
+     *     true.
+     */
+    @RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_ANDROID)
+    public Session startInstallation(long systemSize, long userdataSize) {
+        try {
+            if (mService.startInstallation(systemSize, userdataSize)) {
+                return new Session();
+            } else {
+                return null;
+            }
+        } catch (RemoteException e) {
+            throw new RuntimeException(e.toString());
+        }
+    }
+
+    /**
+     * Query the progress of the current installation operation. This can be called while the
+     * installation is in progress.
+     *
+     * @return GsiProgress GsiProgress { int status; long bytes_processed; long total_bytes; } The
+     *     status field can be IGsiService.STATUS_NO_OPERATION, IGsiService.STATUS_WORKING or
+     *     IGsiService.STATUS_COMPLETE.
+     */
+    @RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_ANDROID)
+    public GsiProgress getInstallationProgress() {
+        try {
+            return mService.getInstallationProgress();
+        } catch (RemoteException e) {
+            throw new RuntimeException(e.toString());
+        }
+    }
+
+    /**
+     * Abort the installation process. Note this method must be called in a thread other than the
+     * one calling the startInstallation method as the startInstallation method will not return
+     * until it is finished.
+     *
+     * @return {@code true} if the call succeeds. {@code false} if there is no installation
+     *     currently.
+     */
+    @RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_ANDROID)
+    public boolean abort() {
+        try {
+            return mService.abort();
+        } catch (RemoteException e) {
+            throw new RuntimeException(e.toString());
+        }
+    }
+
+    /** @return {@code true} if the device is running a dynamic android */
+    @RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_ANDROID)
+    public boolean isInUse() {
+        try {
+            return mService.isInUse();
+        } catch (RemoteException e) {
+            throw new RuntimeException(e.toString());
+        }
+    }
+
+    /** @return {@code true} if the device has a dynamic android installed */
+    @RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_ANDROID)
+    public boolean isInstalled() {
+        try {
+            return mService.isInstalled();
+        } catch (RemoteException e) {
+            throw new RuntimeException(e.toString());
+        }
+    }
+
+    /**
+     * Remove DynamicAndroid installation if present
+     *
+     * @return {@code true} if the call succeeds. {@code false} if there is no installed image.
+     */
+    @RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_ANDROID)
+    public boolean remove() {
+        try {
+            return mService.remove();
+        } catch (RemoteException e) {
+            throw new RuntimeException(e.toString());
+        }
+    }
+
+    /**
+     * Enable DynamicAndroid when it's not enabled, otherwise, disable it.
+     *
+     * @return {@code true} if the call succeeds. {@code false} if there is no installed image.
+     */
+    @RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_ANDROID)
+    public boolean toggle() {
+        try {
+            return mService.toggle();
+        } catch (RemoteException e) {
+            throw new RuntimeException(e.toString());
+        }
+    }
+}
diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java
index a236300..3feccf5 100644
--- a/core/java/android/os/Environment.java
+++ b/core/java/android/os/Environment.java
@@ -50,6 +50,7 @@
 
     /** {@hide} */
     public static final String DIR_ANDROID = "Android";
+    private static final String DIR_SANDBOX = "sandbox";
     private static final String DIR_DATA = "data";
     private static final String DIR_MEDIA = "media";
     private static final String DIR_OBB = "obb";
@@ -117,6 +118,10 @@
             return buildPaths(getExternalDirs(), type);
         }
 
+        public File[] buildExternalStorageAndroidSandboxDirs() {
+            return buildPaths(getExternalDirs(), DIR_ANDROID, DIR_SANDBOX);
+        }
+
         public File[] buildExternalStorageAndroidDataDirs() {
             return buildPaths(getExternalDirs(), DIR_ANDROID, DIR_DATA);
         }
@@ -824,6 +829,15 @@
      * Returns the path for android-specific data on the SD card.
      * @hide
      */
+    public static File[] buildExternalStorageAndroidSandboxDirs() {
+        throwIfUserRequired();
+        return sCurrentUser.buildExternalStorageAndroidSandboxDirs();
+    }
+
+    /**
+     * Returns the path for android-specific data on the SD card.
+     * @hide
+     */
     public static File[] buildExternalStorageAndroidDataDirs() {
         throwIfUserRequired();
         return sCurrentUser.buildExternalStorageAndroidDataDirs();
diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java
index efcad3e..ddec688 100644
--- a/core/java/android/os/GraphicsEnvironment.java
+++ b/core/java/android/os/GraphicsEnvironment.java
@@ -34,14 +34,11 @@
 
 import dalvik.system.VMRuntime;
 
-import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileDescriptor;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -63,7 +60,6 @@
     private static final boolean DEBUG = false;
     private static final String TAG = "GraphicsEnvironment";
     private static final String PROPERTY_GFX_DRIVER = "ro.gfx.driver.0";
-    private static final String GUP_WHITELIST_FILENAME = "whitelist.txt";
     private static final String ANGLE_RULES_FILE = "a4a_rules.json";
     private static final String ANGLE_TEMP_RULES = "debug.angle.rules";
     private static final String ACTION_ANGLE_FOR_ANDROID = "android.app.action.ANGLE_FOR_ANDROID";
@@ -529,44 +525,46 @@
             return;
         }
 
-        // GUP_DEV_ALL_APPS
+        // GAME_DRIVER_ALL_APPS
         // 0: Default (Invalid values fallback to default as well)
         // 1: All apps use Game Driver
         // 2: All apps use system graphics driver
-        int gupDevAllApps = coreSettings.getInt(Settings.Global.GUP_DEV_ALL_APPS, 0);
-        if (gupDevAllApps == 2) {
+        int gameDriverAllApps = coreSettings.getInt(Settings.Global.GAME_DRIVER_ALL_APPS, 0);
+        if (gameDriverAllApps == 2) {
             if (DEBUG) {
-                Log.w(TAG, "GUP is turned off on this device");
+                Log.w(TAG, "Game Driver is turned off on this device");
             }
             return;
         }
 
-        if (gupDevAllApps != 1) {
-            // GUP_DEV_OPT_OUT_APPS has higher priority than GUP_DEV_OPT_IN_APPS
-            if (getGlobalSettingsString(coreSettings, Settings.Global.GUP_DEV_OPT_OUT_APPS)
+        if (gameDriverAllApps != 1) {
+            // GAME_DRIVER_OPT_OUT_APPS has higher priority than GAME_DRIVER_OPT_IN_APPS
+            if (getGlobalSettingsString(coreSettings, Settings.Global.GAME_DRIVER_OPT_OUT_APPS)
                             .contains(ai.packageName)) {
                 if (DEBUG) {
-                    Log.w(TAG, ai.packageName + " opts out from GUP.");
+                    Log.w(TAG, ai.packageName + " opts out from Game Driver.");
                 }
                 return;
             }
-            boolean isDevOptIn = getGlobalSettingsString(coreSettings,
-                                                         Settings.Global.GUP_DEV_OPT_IN_APPS)
-                              .contains(ai.packageName);
-
-            if (!isDevOptIn && !onWhitelist(context, driverPackageName, ai.packageName)) {
+            boolean isOptIn =
+                    getGlobalSettingsString(coreSettings, Settings.Global.GAME_DRIVER_OPT_IN_APPS)
+                            .contains(ai.packageName);
+            if (!isOptIn
+                    && !getGlobalSettingsString(coreSettings, Settings.Global.GAME_DRIVER_WHITELIST)
+                        .contains(ai.packageName)) {
                 if (DEBUG) {
                     Log.w(TAG, ai.packageName + " is not on the whitelist.");
                 }
                 return;
             }
 
-            if (!isDevOptIn) {
+            if (!isOptIn) {
                 // At this point, the application is on the whitelist only, check whether it's
                 // on the blacklist, terminate early when it's on the blacklist.
                 try {
                     // TODO(b/121350991) Switch to DeviceConfig with property listener.
-                    String base64String = coreSettings.getString(Settings.Global.GUP_BLACKLIST);
+                    String base64String =
+                            coreSettings.getString(Settings.Global.GAME_DRIVER_BLACKLIST);
                     if (base64String != null && !base64String.isEmpty()) {
                         Blacklists blacklistsProto = Blacklists.parseFrom(
                                 Base64.decode(base64String, BASE64_FLAGS));
@@ -646,31 +644,6 @@
         return null;
     }
 
-    private static boolean onWhitelist(Context context, String driverPackageName,
-            String applicationPackageName) {
-        try {
-            Context driverContext = context.createPackageContext(driverPackageName,
-                                                                 Context.CONTEXT_RESTRICTED);
-            AssetManager assets = driverContext.getAssets();
-            InputStream stream = assets.open(GUP_WHITELIST_FILENAME);
-            BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
-            for (String packageName; (packageName = reader.readLine()) != null; ) {
-                if (packageName.equals(applicationPackageName)) {
-                    return true;
-                }
-            }
-        } catch (PackageManager.NameNotFoundException e) {
-            if (DEBUG) {
-                Log.w(TAG, "driver package '" + driverPackageName + "' not installed");
-            }
-        } catch (IOException e) {
-            if (DEBUG) {
-                Log.w(TAG, "Failed to load whitelist driver package, abort.");
-            }
-        }
-        return false;
-    }
-
     private static native int getCanLoadSystemLibraries();
     private static native void setLayerPaths(ClassLoader classLoader, String layerPaths);
     private static native void setDebugLayers(String layers);
diff --git a/core/java/android/os/IDynamicAndroidService.aidl b/core/java/android/os/IDynamicAndroidService.aidl
new file mode 100644
index 0000000..0b28799
--- /dev/null
+++ b/core/java/android/os/IDynamicAndroidService.aidl
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.os;
+
+import android.gsi.GsiProgress;
+
+/** {@hide} */
+interface IDynamicAndroidService
+{
+    /**
+     * Start DynamicAndroid installation. This call may take 60~90 seconds. The caller
+     * may use another thread to call the getStartProgress() to get the progress.
+     *
+     * @param systemSize system size in bytes
+     * @param userdataSize userdata size in bytes
+     * @return true if the call succeeds
+     */
+    boolean startInstallation(long systemSize, long userdataSize);
+
+    /**
+     * Query the progress of the current installation operation. This can be called while
+     * the installation is in progress.
+     *
+     * @return GsiProgress
+     */
+    GsiProgress getInstallationProgress();
+
+    /**
+     * Abort the installation process. Note this method must be called in a thread other
+     * than the one calling the startInstallation method as the startInstallation
+     * method will not return until it is finished.
+     *
+     * @return true if the call succeeds
+     */
+    boolean abort();
+
+    /**
+     * @return true if the device is running an DynamicAnroid image
+     */
+    boolean isInUse();
+
+    /**
+     * @return true if the device has an DynamicAndroid image installed
+     */
+    boolean isInstalled();
+
+    /**
+     * Remove DynamicAndroid installation if present
+     *
+     * @return true if the call succeeds
+     */
+    boolean remove();
+
+    /**
+     * Enable DynamicAndroid when it's not enabled, otherwise, disable it.
+     *
+     * @return true if the call succeeds
+     */
+    boolean toggle();
+
+    /**
+     * Write a chunk of the DynamicAndroid system image
+     *
+     * @return true if the call succeeds
+     */
+    boolean write(in byte[] buf);
+
+    /**
+     * Finish write and make device to boot into the it after reboot.
+     *
+     * @return true if the call succeeds
+     */
+    boolean commit();
+}
diff --git a/core/java/android/os/IPowerManager.aidl b/core/java/android/os/IPowerManager.aidl
index ca5b233..093897a 100644
--- a/core/java/android/os/IPowerManager.aidl
+++ b/core/java/android/os/IPowerManager.aidl
@@ -17,8 +17,9 @@
 
 package android.os;
 
-import android.os.WorkSource;
+import android.os.BatterySaverPolicyConfig;
 import android.os.PowerSaveState;
+import android.os.WorkSource;
 
 /** @hide */
 
@@ -49,6 +50,8 @@
     PowerSaveState getPowerSaveState(int serviceType);
     boolean setPowerSaveMode(boolean mode);
     boolean setDynamicPowerSavings(boolean dynamicPowerSavingsEnabled, int disableThreshold);
+    boolean setAdaptivePowerSavePolicy(in BatterySaverPolicyConfig config);
+    boolean setAdaptivePowerSaveEnabled(boolean enabled);
     int getPowerSaveMode();
     boolean isDeviceIdleMode();
     boolean isLightDeviceIdleMode();
diff --git a/core/java/android/os/IncidentManager.java b/core/java/android/os/IncidentManager.java
index 0e6652d..a1c7b08 100644
--- a/core/java/android/os/IncidentManager.java
+++ b/core/java/android/os/IncidentManager.java
@@ -16,13 +16,25 @@
 
 package android.os;
 
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.annotation.RequiresPermission;
 import android.annotation.SystemApi;
 import android.annotation.SystemService;
 import android.annotation.TestApi;
 import android.content.Context;
+import android.net.Uri;
 import android.util.Slog;
 
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * Class to take an incident report.
  *
@@ -34,9 +46,331 @@
 public class IncidentManager {
     private static final String TAG = "IncidentManager";
 
+    /**
+     * Authority for pending report id urls.
+     *
+     * @hide
+     */
+    public static final String URI_SCHEME = "content";
+
+    /**
+     * Authority for pending report id urls.
+     *
+     * @hide
+     */
+    public static final String URI_AUTHORITY = "android.os.IncidentManager";
+
+    /**
+     * Authority for pending report id urls.
+     *
+     * @hide
+     */
+    public static final String URI_PATH = "/pending";
+
+    /**
+     * Query parameter for the uris for the pending report id.
+     *
+     * @hide
+     */
+    public static final String URI_PARAM_ID = "id";
+
+    /**
+     * Query parameter for the uris for the pending report id.
+     *
+     * @hide
+     */
+    public static final String URI_PARAM_CALLING_PACKAGE = "pkg";
+
+    /**
+     * Query parameter for the uris for the pending report id, in wall clock
+     * ({@link System.currentTimeMillis()}) timebase.
+     *
+     * @hide
+     */
+    public static final String URI_PARAM_TIMESTAMP = "t";
+
+    /**
+     * Query parameter for the uris for the pending report id.
+     *
+     * @hide
+     */
+    public static final String URI_PARAM_FLAGS = "flags";
+
+    /**
+     * Do the confirmation with a dialog instead of the default, which is a notification.
+     * It is possible for the dialog to be downgraded to a notification in some cases.
+     */
+    public static final int FLAG_CONFIRMATION_DIALOG = 0x1;
+
+    /**
+     * Flag marking fields and incident reports than can be taken
+     * off the device only via adb.
+     */
+    public static final int PRIVACY_POLICY_LOCAL = 0;
+
+    /**
+     * Flag marking fields and incident reports than can be taken
+     * off the device with contemporary consent.
+     */
+    public static final int PRIVACY_POLICY_EXPLICIT = 100;
+
+    /**
+     * Flag marking fields and incident reports than can be taken
+     * off the device with prior consent.
+     */
+    public static final int PRIVACY_POLICY_AUTO = 200;
+
+    /** @hide */
+    @IntDef(flag = false, prefix = { "PRIVACY_POLICY_" }, value = {
+            PRIVACY_POLICY_AUTO,
+            PRIVACY_POLICY_EXPLICIT,
+            PRIVACY_POLICY_LOCAL,
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface PrivacyPolicy {}
+
     private final Context mContext;
 
-    private IIncidentManager mService;
+    private Object mLock = new Object();
+    private IIncidentManager mIncidentService;
+    private IIncidentCompanion mCompanionService;
+
+    /**
+     * Record for a report that has been taken and is pending user authorization
+     * to share it.
+     * @hide
+     */
+    @SystemApi
+    @TestApi
+    public static class PendingReport {
+        /**
+         * Encoded data.
+         */
+        private final Uri mUri;
+
+        /**
+         * URI_PARAM_FLAGS from the uri
+         */
+        private final int mFlags;
+
+        /**
+         * URI_PARAM_CALLING_PACKAGE from the uri
+         */
+        private final String mRequestingPackage;
+
+        /**
+         * URI_PARAM_TIMESTAMP from the uri
+         */
+        private final long mTimestamp;
+
+        /**
+         * Constructor.
+         */
+        public PendingReport(@NonNull Uri uri) {
+            int flags = 0;
+            try {
+                flags = Integer.parseInt(uri.getQueryParameter(URI_PARAM_FLAGS));
+            } catch (NumberFormatException ex) {
+                throw new RuntimeException("Invalid URI: No " + URI_PARAM_FLAGS
+                        + " parameter. " + uri);
+            }
+            mFlags = flags;
+
+            String requestingPackage = uri.getQueryParameter(URI_PARAM_CALLING_PACKAGE);
+            if (requestingPackage == null) {
+                throw new RuntimeException("Invalid URI: No " + URI_PARAM_CALLING_PACKAGE
+                        + " parameter. " + uri);
+            }
+            mRequestingPackage = requestingPackage;
+
+            long timestamp = -1;
+            try {
+                timestamp = Long.parseLong(uri.getQueryParameter(URI_PARAM_TIMESTAMP));
+            } catch (NumberFormatException ex) {
+                throw new RuntimeException("Invalid URI: No " + URI_PARAM_TIMESTAMP
+                        + " parameter. " + uri);
+            }
+            mTimestamp = timestamp;
+
+            mUri = uri;
+        }
+
+        /**
+         * Get the package with which this report will be shared.
+         */
+        public @NonNull String getRequestingPackage() {
+            return mRequestingPackage;
+        }
+
+        /**
+         * Get the flags requested for this pending report.
+         *
+         * @see #FLAG_CONFIRMATION_DIALOG
+         */
+        public int getFlags() {
+            return mFlags;
+        }
+
+        /**
+         * Get the time this pending report was posted.
+         */
+        public long getTimestamp() {
+            return mTimestamp;
+        }
+
+        /**
+         * Get the URI associated with this PendingReport.  It can be used to
+         * re-retrieve it from {@link IncidentManager} or set as the data field of
+         * an Intent.
+         */
+        public @NonNull Uri getUri() {
+            return mUri;
+        }
+
+        /**
+         * String representation of this PendingReport.
+         */
+        @Override
+        public @NonNull String toString() {
+            return "PendingReport(" + getUri().toString() + ")";
+        }
+    }
+
+    /**
+     * Record of an incident report that has previously been taken.
+     * @hide
+     */
+    @SystemApi
+    @TestApi
+    public static class IncidentReport implements Parcelable, Closeable {
+        private final long mTimestampMs;
+        private final int mPrivacyPolicy;
+        private ParcelFileDescriptor mFileDescriptor;
+
+        public IncidentReport(Parcel in) {
+            mTimestampMs = in.readLong();
+            mPrivacyPolicy = in.readInt();
+            if (in.readInt() != 0) {
+                mFileDescriptor = ParcelFileDescriptor.CREATOR.createFromParcel(in);
+            } else {
+                mFileDescriptor = null;
+            }
+        }
+
+        /**
+         * Close the input stream associated with this entry.
+         */
+        public void close() {
+            try {
+                if (mFileDescriptor != null) {
+                    mFileDescriptor.close();
+                    mFileDescriptor = null;
+                }
+            } catch (IOException e) {
+            }
+        }
+
+        /**
+         * Get the time at which this incident report was taken, in wall clock time
+         * ({@link System#uptimeMillis System.uptimeMillis()} time base).
+         */
+        public long getTimestamp() {
+            return mTimestampMs;
+        }
+
+        /**
+         * Get the privacy level to which this report has been filtered.
+         *
+         * @see #PRIVACY_POLICY_AUTO
+         * @see #PRIVACY_POLICY_EXPLICIT
+         * @see #PRIVACY_POLICY_LOCAL
+         */
+        public long getPrivacyPolicy() {
+            return mPrivacyPolicy;
+        }
+
+        /**
+         * Get the contents of this incident report.
+         */
+        public InputStream getInputStream() throws IOException {
+            if (mFileDescriptor == null) {
+                return null;
+            }
+            return new ParcelFileDescriptor.AutoCloseInputStream(mFileDescriptor);
+        }
+
+        /**
+         * @inheritDoc
+         */
+        public int describeContents() {
+            return mFileDescriptor != null ? Parcelable.CONTENTS_FILE_DESCRIPTOR : 0;
+        }
+
+        /**
+         * @inheritDoc
+         */
+        public void writeToParcel(Parcel out, int flags) {
+            out.writeLong(mTimestampMs);
+            out.writeInt(mPrivacyPolicy);
+            if (mFileDescriptor != null) {
+                out.writeInt(1);
+                mFileDescriptor.writeToParcel(out, flags);
+            } else {
+                out.writeInt(0);
+            }
+        }
+
+        /**
+         * {@link Parcelable.Creator Creator} for {@link IncidentReport}.
+         */
+        public static final Parcelable.Creator<IncidentReport> CREATOR = new Parcelable.Creator() {
+            /**
+             * @inheritDoc
+             */
+            public IncidentReport[] newArray(int size) {
+                return new IncidentReport[size];
+            }
+
+            /**
+             * @inheritDoc
+             */
+            public IncidentReport createFromParcel(Parcel in) {
+                return new IncidentReport(in);
+            }
+        };
+    }
+
+    /**
+     * Listener for the status of an incident report being authroized or denied.
+     *
+     * @see #requestAuthorization
+     * @see #cancelAuthorization
+     */
+    public static class AuthListener {
+        IIncidentAuthListener.Stub mBinder = new IIncidentAuthListener.Stub() {
+            @Override
+            public void onReportApproved() {
+                AuthListener.this.onReportApproved();
+            }
+
+            @Override
+            public void onReportDenied() {
+                AuthListener.this.onReportDenied();
+            }
+        };
+
+        /**
+         * Called when a report is approved.
+         */
+        public void onReportApproved() {
+        }
+
+        /**
+         * Called when a report is denied.
+         */
+        public void onReportDenied() {
+        }
+    }
 
     /**
      * @hide
@@ -46,7 +380,7 @@
     }
 
     /**
-     * Take an incident report and put it in dropbox.
+     * Take an incident report.
      */
     @RequiresPermission(allOf = {
             android.Manifest.permission.DUMP,
@@ -56,15 +390,125 @@
         reportIncidentInternal(args);
     }
 
-    private class IncidentdDeathRecipient implements IBinder.DeathRecipient {
-        @Override
-        public void binderDied() {
-            synchronized (this) {
-                mService = null;
-            }
+    /**
+     * Request authorization of an incident report.
+     */
+    @RequiresPermission(android.Manifest.permission.REQUEST_INCIDENT_REPORT_APPROVAL)
+    public void requestAuthorization(int callingUid, String callingPackage, int flags,
+            AuthListener listener) {
+        try {
+            getCompanionServiceLocked().authorizeReport(callingUid, callingPackage, flags,
+                    listener.mBinder);
+        } catch (RemoteException ex) {
+            // System process going down
+            throw new RuntimeException(ex);
         }
     }
 
+    /**
+     * Cancel a previous request for incident report authorization.
+     */
+    @RequiresPermission(android.Manifest.permission.REQUEST_INCIDENT_REPORT_APPROVAL)
+    public void cancelAuthorization(AuthListener listener) {
+        try {
+            getCompanionServiceLocked().cancelAuthorization(listener.mBinder);
+        } catch (RemoteException ex) {
+            // System process going down
+            throw new RuntimeException(ex);
+        }
+    }
+
+    /**
+     * Get incident (and bug) reports that are pending approval to share.
+     */
+    @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS)
+    public List<PendingReport> getPendingReports() {
+        List<String> strings;
+        try {
+            strings = getCompanionServiceLocked().getPendingReports();
+        } catch (RemoteException ex) {
+            throw new RuntimeException(ex);
+        }
+        final int size = strings.size();
+        ArrayList<PendingReport> result = new ArrayList(size);
+        for (int i = 0; i < size; i++) {
+            result.add(new PendingReport(Uri.parse(strings.get(i))));
+        }
+        return result;
+    }
+
+    /**
+     * Allow this report to be shared with the given app.
+     */
+    @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS)
+    public void approveReport(Uri uri) {
+        try {
+            getCompanionServiceLocked().approveReport(uri.toString());
+        } catch (RemoteException ex) {
+            // System process going down
+            throw new RuntimeException(ex);
+        }
+    }
+
+    /**
+     * Do not allow this report to be shared with the given app.
+     */
+    @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS)
+    public void denyReport(Uri uri) {
+        try {
+            getCompanionServiceLocked().denyReport(uri.toString());
+        } catch (RemoteException ex) {
+            // System process going down
+            throw new RuntimeException(ex);
+        }
+    }
+
+    /**
+     * Get the incident reports that are available for upload for the supplied
+     * broadcast recevier.
+     *
+     * @param receiverClass Class name of broadcast receiver in this package that
+     *   was registered to retrieve reports.
+     *
+     * @return A list of {@link Uri Uris} that are awaiting upload.
+     */
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.DUMP,
+            android.Manifest.permission.PACKAGE_USAGE_STATS
+    })
+    public @NonNull List<Uri> getIncidentReportList(String receiverClass) {
+        throw new RuntimeException("implement me");
+    }
+
+    /**
+     * Get the incident report with the given URI id.
+     *
+     * @param uri Identifier of the incident report.
+     *
+     * @return an IncidentReport object, or null if the incident report has been
+     *  expired from disk.
+     */
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.DUMP,
+            android.Manifest.permission.PACKAGE_USAGE_STATS
+    })
+    public @Nullable IncidentReport getIncidentReport(Uri uri) {
+        throw new RuntimeException("implement me");
+    }
+
+    /**
+     * Delete the incident report with the given URI id.
+     *
+     * @param uri Identifier of the incident report.
+     */
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.DUMP,
+            android.Manifest.permission.PACKAGE_USAGE_STATS
+    })
+    public void deleteIncidentReports(Uri uri) {
+        throw new RuntimeException("implement me");
+    }
+
     private void reportIncidentInternal(IncidentReportArgs args) {
         try {
             final IIncidentManager service = getIIncidentManagerLocked();
@@ -79,22 +523,47 @@
     }
 
     private IIncidentManager getIIncidentManagerLocked() throws RemoteException {
-        if (mService != null) {
-            return mService;
+        if (mIncidentService != null) {
+            return mIncidentService;
         }
 
-        synchronized (this) {
-            if (mService != null) {
-                return mService;
+        synchronized (mLock) {
+            if (mIncidentService != null) {
+                return mIncidentService;
             }
-            mService = IIncidentManager.Stub.asInterface(
+            mIncidentService = IIncidentManager.Stub.asInterface(
                 ServiceManager.getService(Context.INCIDENT_SERVICE));
-            if (mService != null) {
-                mService.asBinder().linkToDeath(new IncidentdDeathRecipient(), 0);
+            if (mIncidentService != null) {
+                mIncidentService.asBinder().linkToDeath(() -> {
+                    synchronized (mLock) {
+                        mIncidentService = null;
+                    }
+                }, 0);
             }
-            return mService;
+            return mIncidentService;
         }
     }
 
+    private IIncidentCompanion getCompanionServiceLocked() throws RemoteException {
+        if (mCompanionService != null) {
+            return mCompanionService;
+        }
+
+        synchronized (this) {
+            if (mCompanionService != null) {
+                return mCompanionService;
+            }
+            mCompanionService = IIncidentCompanion.Stub.asInterface(
+                ServiceManager.getService(Context.INCIDENT_COMPANION_SERVICE));
+            if (mCompanionService != null) {
+                mCompanionService.asBinder().linkToDeath(() -> {
+                    synchronized (mLock) {
+                        mCompanionService = null;
+                    }
+                }, 0);
+            }
+            return mCompanionService;
+        }
+    }
 }
 
diff --git a/core/java/android/os/IncidentReportArgs.java b/core/java/android/os/IncidentReportArgs.java
index 3ca7f77..8d44727 100644
--- a/core/java/android/os/IncidentReportArgs.java
+++ b/core/java/android/os/IncidentReportArgs.java
@@ -32,19 +32,16 @@
 @TestApi
 public final class IncidentReportArgs implements Parcelable {
 
-    private static final int DEST_EXPLICIT = 100;
-    private static final int DEST_AUTO = 200;
-
     private final IntArray mSections = new IntArray();
     private final ArrayList<byte[]> mHeaders = new ArrayList<byte[]>();
     private boolean mAll;
-    private int mDest;
+    private int mPrivacyPolicy;
 
     /**
      * Construct an incident report args with no fields.
      */
     public IncidentReportArgs() {
-        mDest = DEST_AUTO;
+        mPrivacyPolicy = IncidentManager.PRIVACY_POLICY_AUTO;
     }
 
     /**
@@ -75,7 +72,7 @@
             out.writeByteArray(mHeaders.get(i));
         }
 
-        out.writeInt(mDest);
+        out.writeInt(mPrivacyPolicy);
     }
 
     public void readFromParcel(Parcel in) {
@@ -93,7 +90,7 @@
             mHeaders.add(in.createByteArray());
         }
 
-        mDest = in.readInt();
+        mPrivacyPolicy = in.readInt();
     }
 
     public static final Parcelable.Creator<IncidentReportArgs> CREATOR
@@ -128,7 +125,7 @@
         sb.append(", ");
         sb.append(mHeaders.size());
         sb.append(" headers), ");
-        sb.append("Dest enum value: ").append(mDest);
+        sb.append("privacy: ").append(mPrivacyPolicy);
         return sb.toString();
     }
 
@@ -145,14 +142,15 @@
     /**
      * Set this incident report privacy policy spec.
      */
-    public void setPrivacyPolicy(int dest) {
-        switch (dest) {
-            case DEST_EXPLICIT:
-            case DEST_AUTO:
-                mDest = dest;
+    public void setPrivacyPolicy(int privacyPolicy) {
+        switch (privacyPolicy) {
+            case IncidentManager.PRIVACY_POLICY_LOCAL:
+            case IncidentManager.PRIVACY_POLICY_EXPLICIT:
+            case IncidentManager.PRIVACY_POLICY_AUTO:
+                mPrivacyPolicy = privacyPolicy;
                 break;
             default:
-                mDest = DEST_AUTO;
+                mPrivacyPolicy = IncidentManager.PRIVACY_POLICY_AUTO;
         }
     }
 
diff --git a/core/java/android/os/OWNERS b/core/java/android/os/OWNERS
new file mode 100644
index 0000000..b568f15
--- /dev/null
+++ b/core/java/android/os/OWNERS
@@ -0,0 +1,2 @@
+# Zygote
+per-file ZygoteProcess.java = chriswailes@google.com, ngeoffray@google.com, sehr@google.com, narayan@google.com, maco@google.com
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index 7f4254e..0441ba2 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -640,6 +640,9 @@
      */
     public static final int LOCATION_MODE_FOREGROUND_ONLY = 3;
 
+    static final int MIN_LOCATION_MODE = LOCATION_MODE_NO_CHANGE;
+    static final int MAX_LOCATION_MODE = LOCATION_MODE_FOREGROUND_ONLY;
+
     /**
      * @hide
      */
@@ -1272,6 +1275,48 @@
     }
 
     /**
+     * Sets the policy for adaptive power save.
+     *
+     * @return true if there was an effectual change. If full battery saver is enabled or the
+     * adaptive policy is not enabled, then this will return false.
+     *
+     * @hide
+     */
+    @SystemApi
+    @RequiresPermission(anyOf = {
+            android.Manifest.permission.DEVICE_POWER,
+            android.Manifest.permission.POWER_SAVER
+    })
+    public boolean setAdaptivePowerSavePolicy(@NonNull BatterySaverPolicyConfig config) {
+        try {
+            return mService.setAdaptivePowerSavePolicy(config);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * Enables or disables adaptive power save.
+     *
+     * @return true if there was an effectual change. If full battery saver is enabled, then this
+     * will return false.
+     *
+     * @hide
+     */
+    @SystemApi
+    @RequiresPermission(anyOf = {
+            android.Manifest.permission.DEVICE_POWER,
+            android.Manifest.permission.POWER_SAVER
+    })
+    public boolean setAdaptivePowerSaveEnabled(boolean enabled) {
+        try {
+            return mService.setAdaptivePowerSaveEnabled(enabled);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
      * Indicates automatic battery saver toggling by the system will be based on percentage.
      *
      * @see PowerManager#getPowerSaveMode()
diff --git a/core/java/android/os/UserHandle.java b/core/java/android/os/UserHandle.java
index ad8a4d5..40c48a0 100644
--- a/core/java/android/os/UserHandle.java
+++ b/core/java/android/os/UserHandle.java
@@ -226,6 +226,7 @@
      * @hide
      */
     @TestApi
+    @SystemApi
     public static @AppIdInt int getAppId(int uid) {
         return uid % PER_USER_RANGE;
     }
diff --git a/core/java/android/os/ZygoteProcess.java b/core/java/android/os/ZygoteProcess.java
index 9e47179..e94ad2b 100644
--- a/core/java/android/os/ZygoteProcess.java
+++ b/core/java/android/os/ZygoteProcess.java
@@ -74,6 +74,19 @@
     public static final String ZYGOTE_SECONDARY_SOCKET_NAME = "zygote_secondary";
 
     /**
+     * @hide for internal use only.
+     */
+    public static final int ZYGOTE_CONNECT_TIMEOUT_MS = 20000;
+
+    /**
+     * @hide for internal use only.
+     *
+     * Use a relatively short delay, because for app zygote, this is in the critical path of
+     * service launch.
+     */
+    public static final int ZYGOTE_CONNECT_RETRY_DELAY_MS = 50;
+
+    /**
      * @hide for internal use only
      */
     public static final String BLASTULA_POOL_SOCKET_NAME = "blastula_pool";
@@ -933,7 +946,8 @@
      * @param address The name of the socket to connect to.
      */
     public static void waitForConnectionToZygote(LocalSocketAddress zygoteSocketAddress) {
-        for (int n = 20; n >= 0; n--) {
+        int numRetries = ZYGOTE_CONNECT_TIMEOUT_MS / ZYGOTE_CONNECT_RETRY_DELAY_MS;
+        for (int n = numRetries; n >= 0; n--) {
             try {
                 final ZygoteState zs =
                         ZygoteState.connect(zygoteSocketAddress, null);
@@ -945,7 +959,7 @@
             }
 
             try {
-                Thread.sleep(1000);
+                Thread.sleep(ZYGOTE_CONNECT_RETRY_DELAY_MS);
             } catch (InterruptedException ie) {
             }
         }
diff --git a/core/java/android/provider/CalendarContract.java b/core/java/android/provider/CalendarContract.java
index 8a52f1f..3e5bd4b 100644
--- a/core/java/android/provider/CalendarContract.java
+++ b/core/java/android/provider/CalendarContract.java
@@ -138,8 +138,8 @@
      * Action used to help apps show calendar events in the managed profile.
      */
     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
-    public static final String ACTION_VIEW_WORK_CALENDAR_EVENT =
-            "android.provider.calendar.action.VIEW_WORK_CALENDAR_EVENT";
+    public static final String ACTION_VIEW_MANAGED_PROFILE_CALENDAR_EVENT =
+            "android.provider.calendar.action.VIEW_MANAGED_PROFILE_CALENDAR_EVENT";
 
     /**
      * Intent Extras key: {@link EventsColumns#CUSTOM_APP_URI} for the event in
@@ -166,7 +166,7 @@
     public static final String EXTRA_EVENT_ALL_DAY = "allDay";
 
     /**
-     * Intent Extras key: The id of an event.
+     * Intent Extras key: An extra of type {@code long} holding the id of an event.
      */
     public static final String EXTRA_EVENT_ID = "id";
 
@@ -218,7 +218,7 @@
      * When this API is called, the system will attempt to start an activity
      * in the managed profile with an intent targeting the same caller package.
      * The intent will have its action set to
-     * {@link CalendarContract#ACTION_VIEW_WORK_CALENDAR_EVENT} and contain extras
+     * {@link CalendarContract#ACTION_VIEW_MANAGED_PROFILE_CALENDAR_EVENT} and contain extras
      * corresponding to the API's arguments. A calendar app intending to support
      * cross-profile events viewing should handle this intent, parse the arguments
      * and show the appropriate UI.
@@ -226,10 +226,10 @@
      * @param context the context.
      * @param eventId the id of the event to be viewed. Will be put into {@link #EXTRA_EVENT_ID}
      *                field of the intent.
-     * @param start the start time of the event. Will be put into {@link #EXTRA_EVENT_BEGIN_TIME}
-     *              field of the intent.
-     * @param end the end time of the event. Will be put into {@link #EXTRA_EVENT_END_TIME} field
-     *            of the intent.
+     * @param startMs the start time of the event in milliseconds since epoch.
+     *                Will be put into {@link #EXTRA_EVENT_BEGIN_TIME} field of the intent.
+     * @param endMs the end time of the event in milliseconds since epoch.
+     *              Will be put into {@link #EXTRA_EVENT_END_TIME} field of the intent.
      * @param allDay if the event is an all-day event. Will be put into
      *               {@link #EXTRA_EVENT_ALL_DAY} field of the intent.
      * @param flags flags to be set on the intent via {@link Intent#setFlags}
@@ -241,12 +241,12 @@
      * @see #EXTRA_EVENT_ALL_DAY
      */
     public static boolean startViewCalendarEventInManagedProfile(@NonNull Context context,
-            long eventId, long start, long end, boolean allDay, int flags) {
+            long eventId, long startMs, long endMs, boolean allDay, int flags) {
         Preconditions.checkNotNull(context, "Context is null");
         final DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(
                 Context.DEVICE_POLICY_SERVICE);
-        return dpm.startViewCalendarEventInManagedProfile(eventId, start,
-                end, allDay, flags);
+        return dpm.startViewCalendarEventInManagedProfile(eventId, startMs,
+                endMs, allDay, flags);
     }
 
     /**
diff --git a/core/java/android/provider/DeviceConfig.java b/core/java/android/provider/DeviceConfig.java
index d58e00a..92650e1 100644
--- a/core/java/android/provider/DeviceConfig.java
+++ b/core/java/android/provider/DeviceConfig.java
@@ -24,6 +24,7 @@
 import android.annotation.Nullable;
 import android.annotation.RequiresPermission;
 import android.annotation.SystemApi;
+import android.annotation.TestApi;
 import android.app.ActivityThread;
 import android.content.ContentResolver;
 import android.database.ContentObserver;
@@ -44,6 +45,7 @@
  * @hide
  */
 @SystemApi
+@TestApi
 public final class DeviceConfig {
     /**
      * The content:// style URL for the config table.
@@ -70,6 +72,39 @@
     public static final String NAMESPACE_AUTOFILL = "autofill";
 
     /**
+     * ContentCapture-related properties definitions.
+     *
+     * @hide
+     */
+    @SystemApi
+    public interface ContentCapture {
+        String NAMESPACE = "content_capture";
+
+        /**
+         * Property used by {@code com.android.server.SystemServer} on start to decide whether
+         * the Content Capture service should be created or not.
+         *
+         * <p>Possible values are:
+         *
+         * <ul>
+         *   <li>If set to {@code default}, it will only be set if the OEM provides and defines the
+         *   service name by overlaying {@code config_defaultContentCaptureService} (this is the
+         *   "default" mode)
+         *   <li>If set to {@code always}, it will always be enabled, even when the resource is not
+         *   overlaid (this is useful during development and to run the CTS tests on AOSP builds).
+         *   <li>Otherwise, it's explicitly disabled (this could work as a "kill switch" so OEMs
+         *   can disable it remotely in case of emergency by setting to something else (like
+         *   {@code "false"}); notice that it's also disabled if the OEM doesn't explicitly set one
+         *   of the values above).
+         * </ul>
+         *
+         * @hide
+         */
+        // TODO(b/121153631): revert back to SERVICE_EXPLICITLY_ENABLED approach
+        String PROPERTY_CONTENTCAPTURE_ENABLED = "enable_contentcapture";
+    }
+
+    /**
      * Namespace for content capture feature used by on-device machine intelligence
      * to provide suggestions in a privacy-safe manner.
      *
@@ -102,7 +137,39 @@
      * @hide
      */
     @SystemApi
-    public static final String NAMESPACE_NOTIFICATION_ASSISTANT = "notification_assistant";
+    public interface NotificationAssistant {
+        String NAMESPACE = "notification_assistant";
+        /**
+         * Whether the Notification Assistant should generate replies for notifications.
+         */
+        String GENERATE_REPLIES = "generate_replies";
+        /**
+         * Whether the Notification Assistant should generate contextual actions for notifications.
+         */
+        String GENERATE_ACTIONS = "generate_actions";
+    }
+
+    /**
+     * Namespace for all runtime native related features.
+     *
+     * @hide
+     */
+    @SystemApi
+    public interface RuntimeNative {
+        String NAMESPACE = "runtime_native";
+    }
+
+    /**
+     * Namespace for all activity manager related features that are used at the native level.
+     * These features are applied at reboot.
+     *
+     * @hide
+     */
+    @SystemApi
+    public interface ActivityManagerNativeBoot {
+        String NAMESPACE = "activity_manager_native_boot";
+        String OFFLOAD_QUEUE_ENABLED = "offload_queue_enabled";
+    }
 
     /**
      * Namespace for attention-based features provided by on-device machine intelligence.
@@ -114,10 +181,34 @@
         String NAMESPACE = "intelligence_attention";
 
         /** If {@code true}, enables the attention features. */
-        String PROPERTY_ATTENTION_ENABLED = "attention_enabled";
+        String ATTENTION_ENABLED = "attention_enabled";
 
         /** Settings for the attention features. */
-        String PROPERTY_ATTENTION_SETTINGS = "attention_settings";
+        String ATTENTION_SETTINGS = "attention_settings";
+    }
+
+    /**
+     * Privacy related properties definitions.
+     *
+     * @hide
+     */
+    @SystemApi
+    @TestApi
+    public interface Privacy {
+        String NAMESPACE = "privacy";
+
+        /**
+         * Whether to show the Permissions Hub.
+         *
+         * @hide
+         */
+        @SystemApi
+        String PROPERTY_PERMISSIONS_HUB_ENABLED = "permissions_hub_enabled";
+
+        /**
+         * Whether to show location access check notifications.
+         */
+        String PROPERTY_LOCATION_ACCESS_CHECK_ENABLED = "location_access_check_enabled";
     }
 
     /**
@@ -129,26 +220,29 @@
     public interface Telephony {
         String NAMESPACE = "telephony";
         /**
-         * Whether to apply ramping ringer on incoming phone calls.
-         */
-        String PROPERTY_ENABLE_RAMPING_RINGER = "enable_ramping_ringer";
-        /**
          * Ringer ramping time in milliseconds.
          */
-        String PROPERTY_RAMPING_RINGER_DURATION = "ramping_duration";
+        String RAMPING_RINGER_DURATION = "ramping_ringer_duration";
+        /**
+         * Whether to apply ramping ringer on incoming phone calls.
+         */
+        String RAMPING_RINGER_ENABLED = "ramping_ringer_enabled";
+        /**
+         * Vibration time in milliseconds before ramping ringer starts.
+         */
+        String RAMPING_RINGER_VIBRATION_DURATION = "ramping_ringer_vibration_duration";
     }
 
     /**
-     * Namespace for Full Stack Integrity to run privileged apps only in JIT mode. The flag applies
-     * at process start, so reboot is a way to bring the device to a clean state.
+     * Namespace for how dex runs.  The feature may requires reboot to a clean state.
      *
      * @hide
      */
     @SystemApi
-    public interface FsiBoot {
-        String NAMESPACE = "fsi_boot";
-        String OOB_ENABLED = "oob_enabled";
-        String OOB_WHITELIST = "oob_whitelist";
+    public interface DexBoot {
+        String NAMESPACE = "dex_boot";
+        String PRIV_APPS_OOB_ENABLED = "priv_apps_oob_enabled";
+        String PRIV_APPS_OOB_WHITELIST = "priv_apps_oob_whitelist";
     }
 
     /**
@@ -171,6 +265,7 @@
         String KEY_COMPACT_THROTTLE_2 = "compact_throttle_2";
         String KEY_COMPACT_THROTTLE_3 = "compact_throttle_3";
         String KEY_COMPACT_THROTTLE_4 = "compact_throttle_4";
+        String KEY_COMPACT_STATSD_SAMPLE_RATE = "compact_statsd_sample_rate";
 
         /**
          * Maximum number of cached processes. See
@@ -189,10 +284,10 @@
         String NAMESPACE = "attention_manager_service";
 
         /** If {@code true}, enables {@link AttentionManagerService} features. */
-        String PROPERTY_SERVICE_ENABLED = "service_enabled";
+        String SERVICE_ENABLED = "service_enabled";
 
         /** Allows a CTS to inject a fake implementation. */
-        String PROPERTY_COMPONENT_NAME = "component_name";
+        String COMPONENT_NAME = "component_name";
     }
 
     /**
@@ -259,6 +354,7 @@
      * @see #resetToDefaults(int, String).
      */
     @SystemApi
+    @TestApi
     @RequiresPermission(WRITE_DEVICE_CONFIG)
     public static boolean setProperty(
             String namespace, String name, String value, boolean makeDefault) {
@@ -279,6 +375,7 @@
      * @see #setProperty(String, String, String, boolean)
      */
     @SystemApi
+    @TestApi
     @RequiresPermission(WRITE_DEVICE_CONFIG)
     public static void resetToDefaults(@ResetMode int resetMode, @Nullable String namespace) {
         ContentResolver contentResolver = ActivityThread.currentApplication().getContentResolver();
@@ -425,7 +522,10 @@
      * Interface for monitoring to properties.
      * <p>
      * Override {@link #onPropertyChanged(String, String, String)} to handle callbacks for changes.
+     *
+     * @hide
      */
+    @SystemApi
     public interface OnPropertyChangedListener {
         /**
          * Called when a property has changed.
diff --git a/core/java/android/provider/Downloads.java b/core/java/android/provider/Downloads.java
index b348da4..89d1c44 100644
--- a/core/java/android/provider/Downloads.java
+++ b/core/java/android/provider/Downloads.java
@@ -419,12 +419,20 @@
 
         /**
          * The column that is used to remember whether the media scanner was invoked.
-         * It can take the values: null or 0(not scanned), 1(scanned), 2 (not scannable).
+         * It can take the values: {@link #MEDIA_NOT_SCANNED}, {@link #MEDIA_SCANNED} or
+         * {@link #MEDIA_NOT_SCANNABLE} or {@code null}. If it's value is {@code null}, it will be
+         * treated as {@link #MEDIA_NOT_SCANNED}.
+         *
          * <P>Type: TEXT</P>
          */
         @UnsupportedAppUsage
         public static final String COLUMN_MEDIA_SCANNED = "scanned";
 
+        /** Possible values for column {@link #COLUMN_MEDIA_SCANNED} */
+        public static final int MEDIA_NOT_SCANNED = 0;
+        public static final int MEDIA_SCANNED = 1;
+        public static final int MEDIA_NOT_SCANNABLE = 2;
+
         /**
          * The column with errorMsg for a failed downloaded.
          * Used only for debugging purposes.
@@ -837,6 +845,14 @@
         }
     }
 
+    /** @hide */
+    public static final String MEDIASTORE_DOWNLOADS_DELETED_CALL = "mediastore_downloads_deleted";
+
+    /** @hide */
+    public static final String EXTRA_IDS = "ids";
+    /** @hide */
+    public static final String EXTRA_MIME_TYPES = "mime_types";
+
     /**
      * Query where clause for general querying.
      */
diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java
index 887175a..0743c23 100644
--- a/core/java/android/provider/MediaStore.java
+++ b/core/java/android/provider/MediaStore.java
@@ -158,6 +158,8 @@
     public static final String PARAM_PROGRESS = "progress";
     /** {@hide} */
     public static final String PARAM_REQUIRE_ORIGINAL = "requireOriginal";
+    /** {@hide} */
+    public static final String PARAM_LIMIT = "limit";
 
     /**
      * Activity Action: Launch a music player.
@@ -513,7 +515,12 @@
      * @see MediaStore#createPending(Context, PendingParams)
      */
     public static @NonNull Uri setIncludePending(@NonNull Uri uri) {
-        return uri.buildUpon().appendQueryParameter(PARAM_INCLUDE_PENDING, "1").build();
+        return setIncludePending(uri.buildUpon()).build();
+    }
+
+    /** @hide */
+    public static @NonNull Uri.Builder setIncludePending(@NonNull Uri.Builder uriBuilder) {
+        return uriBuilder.appendQueryParameter(PARAM_INCLUDE_PENDING, "1");
     }
 
     /**
@@ -634,6 +641,8 @@
          * location. For example, when this value is left undefined, pending
          * {@link MediaStore.Audio.Media} items are stored under
          * {@link Environment#DIRECTORY_MUSIC}.
+         *
+         * @see MediaColumns#PRIMARY_DIRECTORY
          */
         public void setPrimaryDirectory(@Nullable String primaryDirectory) {
             this.primaryDirectory = primaryDirectory;
@@ -645,6 +654,8 @@
          * <p>
          * You may leave this value undefined to store the media as a direct
          * descendant of the {@link #setPrimaryDirectory(String)} location.
+         *
+         * @see MediaColumns#SECONDARY_DIRECTORY
          */
         public void setSecondaryDirectory(@Nullable String secondaryDirectory) {
             this.secondaryDirectory = secondaryDirectory;
@@ -973,6 +984,26 @@
          * Type: TEXT
          */
         public static final String OWNER_PACKAGE_NAME = "owner_package_name";
+
+        /**
+         * The primary directory name this media exists under. The value may be
+         * {@code NULL} if the media doesn't have a primary directory name.
+         * <p>
+         * Type: TEXT
+         *
+         * @see PendingParams#setPrimaryDirectory(String)
+         */
+        public static final String PRIMARY_DIRECTORY = "primary_directory";
+
+        /**
+         * The secondary directory name this media exists under. The value may
+         * be {@code NULL} if the media doesn't have a secondary directory name.
+         * <p>
+         * Type: TEXT
+         *
+         * @see PendingParams#setSecondaryDirectory(String)
+         */
+        public static final String SECONDARY_DIRECTORY = "secondary_directory";
     }
 
     /**
@@ -982,6 +1013,11 @@
      * work with multiple media file types in a single query.
      */
     public static final class Files {
+        /** @hide */
+        public static final String TABLE = "files";
+
+        /** @hide */
+        public static final Uri EXTERNAL_CONTENT_URI = getContentUri(VOLUME_EXTERNAL);
 
         /**
          * Get the content:// style URI for the files table on the
@@ -1416,13 +1452,20 @@
             public static final String BUCKET_DISPLAY_NAME = "bucket_display_name";
 
             /**
-             * The secondary bucket ID of this media item. This can be useful to
-             * present the user a second-level clustering of related media
-             * items. This is a read-only column that is automatically computed.
+             * The group ID of this media item. This can be useful to present
+             * the user a grouping of related media items, such a burst of
+             * images, or a {@code JPG} and {@code DNG} version of the same
+             * image.
+             * <p>
+             * This is a read-only column that is automatically computed based
+             * on the first portion of the filename. For example,
+             * {@code IMG1024.BURST001.JPG} and {@code IMG1024.BURST002.JPG}
+             * will have the same {@link #GROUP_ID} because the first portion of
+             * their filenames is identical.
              * <p>
              * Type: INTEGER
              */
-            public static final String SECONDARY_BUCKET_ID = "secondary_bucket_id";
+            public static final String GROUP_ID = "group_id";
         }
 
         public static final class Media implements ImageColumns {
@@ -2685,13 +2728,20 @@
             public static final String BUCKET_DISPLAY_NAME = "bucket_display_name";
 
             /**
-             * The secondary bucket ID of this media item. This can be useful to
-             * present the user a second-level clustering of related media
-             * items. This is a read-only column that is automatically computed.
+             * The group ID of this media item. This can be useful to present
+             * the user a grouping of related media items, such a burst of
+             * images, or a {@code JPG} and {@code DNG} version of the same
+             * image.
+             * <p>
+             * This is a read-only column that is automatically computed based
+             * on the first portion of the filename. For example,
+             * {@code IMG1024.BURST001.JPG} and {@code IMG1024.BURST002.JPG}
+             * will have the same {@link #GROUP_ID} because the first portion of
+             * their filenames is identical.
              * <p>
              * Type: INTEGER
              */
-            public static final String SECONDARY_BUCKET_ID = "secondary_bucket_id";
+            public static final String GROUP_ID = "group_id";
 
             /**
              * The bookmark for the video. Time in ms. Represents the location in the video that the
diff --git a/core/java/android/provider/SearchIndexablesContract.java b/core/java/android/provider/SearchIndexablesContract.java
index adf437c..42c2d5c 100644
--- a/core/java/android/provider/SearchIndexablesContract.java
+++ b/core/java/android/provider/SearchIndexablesContract.java
@@ -81,6 +81,21 @@
     public static final String SITE_MAP_PAIRS_PATH = SETTINGS + "/" + SITE_MAP_PAIRS_KEYS;
 
     /**
+     * Last path segment for Preference Key, Slice Uri pair.
+     * <p>
+     *     The (Key, Slice Uri) pairs are a mapping between the primary key of the search result and
+     *     a Uri for a Slice that represents the same data. Thus, an app can specify a list of Uris
+     *     for Slices that replace regular intent-based search results with inline content.
+     * </p>
+     */
+    public static final String SLICE_URI_PAIRS = "slice_uri_pairs";
+
+    /**
+     * ContentProvider path for Slice Uri pairs.
+     */
+    public static final String SLICE_URI_PAIRS_PATH = SETTINGS + "/" + SLICE_URI_PAIRS;
+
+    /**
      * Indexable xml resources columns.
      */
     public static final String[] INDEXABLES_XML_RES_COLUMNS = new String[] {
@@ -177,6 +192,30 @@
     public static final int COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE = 0;
 
     /**
+     * Columns for the SliceUri and Preference Key pairs.
+     */
+    public static final class SliceUriPairColumns {
+        private SliceUriPairColumns() {}
+
+        /**
+         * The preference key for the Setting.
+         */
+        public static final String KEY = "key";
+        /**
+         * The Slice Uri corresponding to the Setting key.
+         */
+        public static final String SLICE_URI = "slice_uri";
+    }
+
+    /**
+     * Cursor schema for SliceUriPairs.
+     */
+    public static final String[] SLICE_URI_PAIRS_COLUMNS = new String[]{
+            SliceUriPairColumns.KEY,
+            SliceUriPairColumns.SLICE_URI
+    };
+
+    /**
      * Constants related to a {@link SearchIndexableResource}.
      *
      * This is a description of
@@ -211,7 +250,6 @@
      * {@link android.preference.Preference} and its attributes like
      * {@link android.preference.Preference#getTitle()},
      * {@link android.preference.Preference#getSummary()}, etc.
-     *
      */
     public static final class RawData extends BaseColumns {
         private RawData() {
@@ -262,12 +300,14 @@
 
         /**
          * Identifier for the Payload object type.
+         *
          * @hide
          */
         public static final String PAYLOAD_TYPE = "payload_type";
 
         /**
          * Generic payload for improving Search result expressiveness.
+         *
          * @hide
          */
         public static final String PAYLOAD = "payload";
diff --git a/core/java/android/provider/SearchIndexablesProvider.java b/core/java/android/provider/SearchIndexablesProvider.java
index 02a5e6f..1549c45 100644
--- a/core/java/android/provider/SearchIndexablesProvider.java
+++ b/core/java/android/provider/SearchIndexablesProvider.java
@@ -17,6 +17,7 @@
 package android.provider;
 
 import android.annotation.SystemApi;
+import android.app.slice.Slice;
 import android.content.ContentProvider;
 import android.content.ContentValues;
 import android.content.Context;
@@ -73,6 +74,7 @@
     private static final int MATCH_RAW_CODE = 2;
     private static final int MATCH_NON_INDEXABLE_KEYS_CODE = 3;
     private static final int MATCH_SITE_MAP_PAIRS_CODE = 4;
+    private static final int MATCH_SLICE_URI_PAIRS_CODE = 5;
 
     /**
      * Implementation is provided by the parent class.
@@ -90,6 +92,8 @@
                 MATCH_NON_INDEXABLE_KEYS_CODE);
         mMatcher.addURI(mAuthority, SearchIndexablesContract.SITE_MAP_PAIRS_PATH,
                 MATCH_SITE_MAP_PAIRS_CODE);
+        mMatcher.addURI(mAuthority, SearchIndexablesContract.SLICE_URI_PAIRS_PATH,
+                MATCH_SLICE_URI_PAIRS_CODE);
 
         // Sanity check our setup
         if (!info.exported) {
@@ -117,6 +121,8 @@
                 return queryNonIndexableKeys(null);
             case MATCH_SITE_MAP_PAIRS_CODE:
                 return querySiteMapPairs();
+            case MATCH_SLICE_URI_PAIRS_CODE:
+                return querySliceUriPairs();
             default:
                 throw new UnsupportedOperationException("Unknown Uri " + uri);
         }
@@ -166,6 +172,15 @@
         return null;
     }
 
+    /**
+     * Returns a {@link Cursor} linking {@link Slice} {@link Uri Uris} to the
+     * corresponding Settings key.
+     */
+    public Cursor querySliceUriPairs() {
+        // By default no-op;
+        return null;
+    }
+
     @Override
     public String getType(Uri uri) {
         switch (mMatcher.match(uri)) {
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index f04c752..e14bb66 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -1861,6 +1861,7 @@
      * This is the only type of reset available to non-system clients.
      * @hide
      */
+    @TestApi
     public static final int RESET_MODE_PACKAGE_DEFAULTS = 1;
 
     /**
@@ -3535,6 +3536,16 @@
         private static final Validator MASTER_MONO_VALIDATOR = BOOLEAN_VALIDATOR;
 
         /**
+         * Master balance (float -1.f = 100% left, 0.f = dead center, 1.f = 100% right).
+         *
+         * @hide
+         */
+        public static final String MASTER_BALANCE = "master_balance";
+
+        private static final Validator MASTER_BALANCE_VALIDATOR =
+                new SettingsValidators.InclusiveFloatRangeValidator(-1.f, 1.f);
+
+        /**
          * Whether the notifications should use the ring volume (value of 1) or
          * a separate notification volume (value of 0). In most cases, users
          * will have this enabled so the notification and ringer volumes will be
@@ -4287,6 +4298,7 @@
             HEARING_AID,
             TTY_MODE,
             MASTER_MONO,
+            MASTER_BALANCE,
             SOUND_EFFECTS_ENABLED,
             HAPTIC_FEEDBACK_ENABLED,
             POWER_SOUNDS_ENABLED,       // moved to global
@@ -4394,6 +4406,7 @@
             PRIVATE_SETTINGS.add(VIBRATE_INPUT_DEVICES);
             PRIVATE_SETTINGS.add(VOLUME_MASTER);
             PRIVATE_SETTINGS.add(MASTER_MONO);
+            PRIVATE_SETTINGS.add(MASTER_BALANCE);
             PRIVATE_SETTINGS.add(NOTIFICATIONS_USE_RING_VOLUME);
             PRIVATE_SETTINGS.add(VIBRATE_IN_SILENT);
             PRIVATE_SETTINGS.add(MEDIA_BUTTON_RECEIVER);
@@ -4487,6 +4500,7 @@
             VALIDATORS.put(SCREEN_AUTO_BRIGHTNESS_ADJ, SCREEN_AUTO_BRIGHTNESS_ADJ_VALIDATOR);
             VALIDATORS.put(VIBRATE_INPUT_DEVICES, VIBRATE_INPUT_DEVICES_VALIDATOR);
             VALIDATORS.put(MASTER_MONO, MASTER_MONO_VALIDATOR);
+            VALIDATORS.put(MASTER_BALANCE, MASTER_BALANCE_VALIDATOR);
             VALIDATORS.put(NOTIFICATIONS_USE_RING_VOLUME, NOTIFICATIONS_USE_RING_VOLUME_VALIDATOR);
             VALIDATORS.put(VIBRATE_IN_SILENT, VIBRATE_IN_SILENT_VALIDATOR);
             VALIDATORS.put(MEDIA_BUTTON_RECEIVER, MEDIA_BUTTON_RECEIVER_VALIDATOR);
@@ -5687,6 +5701,14 @@
                 "autofill_user_data_min_value_length";
 
         /**
+         * Defines whether Content Capture is enabled  for the user.
+         * @hide
+         */
+        @SystemApi
+        @TestApi
+        public static final String CONTENT_CAPTURE_ENABLED = "content_capture_enabled";
+
+        /**
          * @deprecated Use {@link android.provider.Settings.Global#DEVICE_PROVISIONED} instead
          */
         @Deprecated
@@ -5831,6 +5853,16 @@
         public static final String ALWAYS_ON_VPN_LOCKDOWN = "always_on_vpn_lockdown";
 
         /**
+         * Comma separated list of packages that are allowed to access the network when VPN is in
+         * lockdown mode but not running.
+         * @see #ALWAYS_ON_VPN_LOCKDOWN
+         *
+         * @hide
+         */
+        public static final String ALWAYS_ON_VPN_LOCKDOWN_WHITELIST =
+                "always_on_vpn_lockdown_whitelist";
+
+        /**
          * Whether applications can be installed for this user via the system's
          * {@link Intent#ACTION_INSTALL_PACKAGE} mechanism.
          *
@@ -5855,30 +5887,24 @@
                 "unknown_sources_default_reversed";
 
         /**
-         * Comma-separated list of location providers that activities may access. Do not rely on
-         * this value being present in settings.db or on ContentObserver notifications on the
+         * Comma-separated list of location providers that are accessible. Do not rely on
+         * this value being present or correct, or on ContentObserver notifications on the
          * corresponding Uri.
          *
-         * @deprecated Providers should not be controlled individually. See {@link #LOCATION_MODE}
-          * documentation for information on reading/writing location information.
+         * @deprecated The preferred methods for checking provider status and listening for changes
+         * are via {@link LocationManager#isProviderEnabled(String)} and
+         * {@link LocationManager#PROVIDERS_CHANGED_ACTION}.
          */
         @Deprecated
         public static final String LOCATION_PROVIDERS_ALLOWED = "location_providers_allowed";
 
         /**
-         * The degree of location access enabled by the user.
-         * <p>
-         * When used with {@link #putInt(ContentResolver, String, int)}, must be one of {@link
-         * #LOCATION_MODE_HIGH_ACCURACY}, {@link #LOCATION_MODE_SENSORS_ONLY}, {@link
-         * #LOCATION_MODE_BATTERY_SAVING}, or {@link #LOCATION_MODE_OFF}. When used with {@link
-         * #getInt(ContentResolver, String)}, the caller must gracefully handle additional location
-         * modes that might be added in the future.
-         * <p>
-         * Note: do not rely on this value being present in settings.db or on ContentObserver
-         * notifications for the corresponding Uri. Use {@link LocationManager#MODE_CHANGED_ACTION}
-         * to receive changes in this value.
+         * The current location mode of the device. Do not rely on this value being present or on
+         * ContentObserver notifications on the corresponding Uri.
          *
-         * @deprecated To check location mode, use {@link LocationManager#isLocationEnabled()}.
+         * @deprecated The preferred methods for checking location mode and listening for changes
+         * are via {@link LocationManager#isLocationEnabled()} and
+         * {@link LocationManager#MODE_CHANGED_ACTION}.
          */
         @Deprecated
         public static final String LOCATION_MODE = "location_mode";
@@ -5905,7 +5931,7 @@
         public static final int LOCATION_CHANGER_QUICK_SETTINGS = 2;
 
         /**
-         * Location access disabled.
+         * Location mode is off.
          *
          * @deprecated See {@link #LOCATION_MODE}.
          */
@@ -5913,32 +5939,39 @@
         public static final int LOCATION_MODE_OFF = 0;
 
         /**
-         * Network Location Provider disabled, but GPS and other sensors enabled.
+         * This mode no longer has any distinct meaning, but is interpreted as the location mode is
+         * on.
          *
-         * @deprecated To check location status, use {@link LocationManager#isLocationEnabled()}. To
-         *             get the status of a location provider, use
-         *             {@link LocationManager#isProviderEnabled(String)}.
+         * @deprecated See {@link #LOCATION_MODE_ON}.
          */
         @Deprecated
         public static final int LOCATION_MODE_SENSORS_ONLY = 1;
 
         /**
-         * Reduced power usage, such as limiting the number of GPS updates per hour. Requests
-         * with {@link android.location.Criteria#POWER_HIGH} may be downgraded to
-         * {@link android.location.Criteria#POWER_MEDIUM}.
+         * This mode no longer has any distinct meaning, but is interpreted as the location mode is
+         * on.
          *
-         * @deprecated See {@link #LOCATION_MODE}.
+         * @deprecated See {@link #LOCATION_MODE_ON}.
          */
         @Deprecated
         public static final int LOCATION_MODE_BATTERY_SAVING = 2;
 
         /**
-         * Best-effort location computation allowed.
+         * This mode no longer has any distinct meaning, but is interpreted as the location mode is
+         * on.
+         *
+         * @deprecated See {@link #LOCATION_MODE_ON}.
+         */
+        @Deprecated
+        public static final int LOCATION_MODE_HIGH_ACCURACY = 3;
+
+        /**
+         * Location mode is on.
          *
          * @deprecated See {@link #LOCATION_MODE}.
          */
         @Deprecated
-        public static final int LOCATION_MODE_HIGH_ACCURACY = 3;
+        public static final int LOCATION_MODE_ON = LOCATION_MODE_HIGH_ACCURACY;
 
         /**
          * A flag containing settings used for biometric weak
@@ -7447,14 +7480,6 @@
         private static final Validator DOZE_TAP_SCREEN_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR;
 
         /**
-         * Gesture that wakes up the lock screen.
-         * @hide
-         */
-        public static final String DOZE_WAKE_LOCK_SCREEN_GESTURE = "doze_wake_lock_screen_gesture";
-
-        private static final Validator DOZE_WAKE_LOCK_SCREEN_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR;
-
-        /**
          * Gesture that wakes up the display, showing the ambient version of the status bar.
          * @hide
          */
@@ -8569,7 +8594,6 @@
             DOZE_PICK_UP_GESTURE,
             DOZE_DOUBLE_TAP_GESTURE,
             DOZE_TAP_SCREEN_GESTURE,
-            DOZE_WAKE_LOCK_SCREEN_GESTURE,
             DOZE_WAKE_SCREEN_GESTURE,
             NFC_PAYMENT_DEFAULT_COMPONENT,
             AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN,
@@ -8729,7 +8753,6 @@
             VALIDATORS.put(DOZE_PICK_UP_GESTURE, DOZE_PICK_UP_GESTURE_VALIDATOR);
             VALIDATORS.put(DOZE_DOUBLE_TAP_GESTURE, DOZE_DOUBLE_TAP_GESTURE_VALIDATOR);
             VALIDATORS.put(DOZE_TAP_SCREEN_GESTURE, DOZE_TAP_SCREEN_GESTURE_VALIDATOR);
-            VALIDATORS.put(DOZE_WAKE_LOCK_SCREEN_GESTURE, DOZE_WAKE_LOCK_SCREEN_GESTURE_VALIDATOR);
             VALIDATORS.put(DOZE_WAKE_SCREEN_GESTURE, DOZE_WAKE_SCREEN_GESTURE_VALIDATOR);
             VALIDATORS.put(NFC_PAYMENT_DEFAULT_COMPONENT, NFC_PAYMENT_DEFAULT_COMPONENT_VALIDATOR);
             VALIDATORS.put(AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN,
@@ -10502,8 +10525,10 @@
         /**
          * Setting to enable connected MAC randomization in Wi-Fi; disabled by default, and
          * setting to 1 will enable it. In the future, additional values may be supported.
+         * @deprecated MAC randomization is now a per-network setting
          * @hide
          */
+        @Deprecated
         public static final String WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED =
                 "wifi_connected_mac_randomization_enabled";
 
@@ -10579,6 +10604,18 @@
         private static final Validator WIFI_PNO_RECENCY_SORTING_ENABLED_VALIDATOR =
                 BOOLEAN_VALIDATOR;
 
+        /**
+         * Setting to enable the Wi-Fi link probing.
+         * Disabled by default, and setting it to 1 will enable it.
+         * The value is boolean (0 or 1).
+         * @hide
+         */
+        public static final String WIFI_LINK_PROBING_ENABLED =
+                "wifi_link_probing_enabled";
+
+        private static final Validator WIFI_LINK_PROBING_ENABLED_VALIDATOR =
+                BOOLEAN_VALIDATOR;
+
        /**
         * The maximum number of times we will retry a connection to an access
         * point for which we have failed in acquiring an IP address from DHCP.
@@ -11404,6 +11441,9 @@
          * The following keys are supported:
          *
          * <pre>
+         * advertise_is_enabled              (boolean)
+         * datasaver_disabled                (boolean)
+         * launch_boost_disabled             (boolean)
          * vibration_disabled                (boolean)
          * animation_disabled                (boolean)
          * soundtrigger_disabled             (boolean)
@@ -11427,6 +11467,14 @@
         /**
          * Battery Saver device specific settings
          * This is encoded as a key=value list, separated by commas.
+         *
+         * The following keys are supported:
+         *
+         * <pre>
+         *     cpufreq-i (list of "core-number:frequency" pairs concatenated with /)
+         *     cpufreq-n (list of "core-number:frequency" pairs concatenated with /)
+         * </pre>
+         *
          * See {@link com.android.server.power.batterysaver.BatterySaverPolicy} for the details.
          *
          * @hide
@@ -11435,6 +11483,24 @@
                 "battery_saver_device_specific_constants";
 
         /**
+         * Settings for adaptive Battery Saver mode. Uses the same flags as
+         * {@link #BATTERY_SAVER_CONSTANTS}.
+         *
+         * @hide
+         */
+        public static final String BATTERY_SAVER_ADAPTIVE_CONSTANTS =
+                "battery_saver_adaptive_constants";
+
+        /**
+         * Device specific settings for adaptive Battery Saver mode. Uses the same flags as
+         * {@link #BATTERY_SAVER_DEVICE_SPECIFIC_CONSTANTS}.
+         *
+         * @hide
+         */
+        public static final String BATTERY_SAVER_ADAPTIVE_DEVICE_SPECIFIC_CONSTANTS =
+                "battery_saver_adaptive_device_specific_constants";
+
+        /**
          * Battery tip specific settings
          * This is encoded as a key=value list, separated by commas. Ex:
          *
@@ -11755,6 +11821,7 @@
          * entity_list_not_editable                 (String[])
          * entity_list_editable                     (String[])
          * lang_id_threshold_override               (float)
+         * template_intent_factory_enabled          (boolean)
          * </pre>
          *
          * <p>
@@ -11799,6 +11866,44 @@
         public static final String SYNC_MANAGER_CONSTANTS = "sync_manager_constants";
 
         /**
+         * Broadcast dispatch tuning parameters specific to foreground broadcasts.
+         *
+         * This is encoded as a key=value list, separated by commas. Ex: "foo=1,bar=true"
+         *
+         * The following keys are supported:
+         * <pre>
+         * bcast_timeout                (long)
+         * bcast_slow_time              (long)
+         * bcast_deferral               (long)
+         * bcast_deferral_decay_factor  (float)
+         * bcast_deferral_floor         (long)
+         * </pre>
+         *
+         * @hide
+         */
+        public static final String BROADCAST_FG_CONSTANTS = "bcast_fg_constants";
+
+        /**
+         * Broadcast dispatch tuning parameters specific to background broadcasts.
+         *
+         * This is encoded as a key=value list, separated by commas. Ex: "foo=1,bar=true".
+         * See {@link #BROADCAST_FG_CONSTANTS} for the list of supported keys.
+         *
+         * @hide
+         */
+        public static final String BROADCAST_BG_CONSTANTS = "bcast_bg_constants";
+
+        /**
+         * Broadcast dispatch tuning parameters specific to specific "offline" broadcasts.
+         *
+         * This is encoded as a key=value list, separated by commas. Ex: "foo=1,bar=true".
+         * See {@link #BROADCAST_FG_CONSTANTS} for the list of supported keys.
+         *
+         * @hide
+         */
+        public static final String BROADCAST_OFFLOAD_CONSTANTS = "bcast_offload_constants";
+
+        /**
          * Whether or not App Standby feature is enabled by system. This controls throttling of apps
          * based on usage patterns and predictions. Platform will turn on this feature if both this
          * flag and {@link #ADAPTIVE_BATTERY_MANAGEMENT_ENABLED} is on.
@@ -12193,33 +12298,33 @@
                 "angle_whitelist";
 
         /**
-         * Game Update Package global preference for all Apps.
+         * Game Driver global preference for all Apps.
          * 0 = Default
-         * 1 = All Apps use Game Update Package
+         * 1 = All Apps use Game Driver
          * 2 = All Apps use system graphics driver
          * @hide
          */
-        public static final String GUP_DEV_ALL_APPS = "gup_dev_all_apps";
+        public static final String GAME_DRIVER_ALL_APPS = "game_driver_all_apps";
 
         /**
-         * List of Apps selected to use Game Update Package.
+         * List of Apps selected to use Game Driver.
          * i.e. <pkg1>,<pkg2>,...,<pkgN>
          * @hide
          */
-        public static final String GUP_DEV_OPT_IN_APPS = "gup_dev_opt_in_apps";
+        public static final String GAME_DRIVER_OPT_IN_APPS = "game_driver_opt_in_apps";
 
         /**
-         * List of Apps selected not to use Game Update Package.
+         * List of Apps selected not to use Game Driver.
          * i.e. <pkg1>,<pkg2>,...,<pkgN>
          * @hide
          */
-        public static final String GUP_DEV_OPT_OUT_APPS = "gup_dev_opt_out_apps";
+        public static final String GAME_DRIVER_OPT_OUT_APPS = "game_driver_opt_out_apps";
 
         /**
-         * Apps on the blacklist that are forbidden to use Game Update Package.
+         * Apps on the blacklist that are forbidden to use Game Driver.
          * @hide
          */
-        public static final String GUP_BLACKLIST = "gup_blacklist";
+        public static final String GAME_DRIVER_BLACKLIST = "game_driver_blacklist";
 
         /**
          * Apps on the whitelist that are allowed to use Game Driver.
@@ -13223,29 +13328,6 @@
         public static final String MAX_SOUND_TRIGGER_DETECTION_SERVICE_OPS_PER_DAY =
                 "max_sound_trigger_detection_service_ops_per_day";
 
-        /**
-         * Property used by {@code com.android.server.SystemServer} on start to decide whether
-         * the Content Capture service should be created or not.
-         *
-         * <p>Possible values are:
-         *
-         * <ul>
-         *   <li>If set to {@code default}, it will only be set if the OEM provides and defines the
-         *   service name by overlaying {@code config_defaultContentCaptureService} (this is the
-         *   "default" mode)
-         *   <li>If set to {@code always}, it will always be enabled, even when the resource is not
-         *   overlaid (this is useful during development and to run the CTS tests on AOSP builds).
-         *   <li>Otherwise, it's explicitly disabled (this could work as a "kill switch" so OEMs
-         *   can disable it remotely in case of emergency by setting to something else (like
-         *   {@code "false"}); notice that it's also disabled if the OEM doesn't explicitly set one
-         *   of the values above).
-         * </ul>
-         *
-         * @hide
-         */
-        public static final String CONTENT_CAPTURE_SERVICE_EXPLICITLY_ENABLED =
-                "content_capture_service_explicitly_enabled";
-
         /** {@hide} */
         public static final String ISOLATED_STORAGE_LOCAL = "isolated_storage_local";
         /** {@hide} */
@@ -13356,6 +13438,7 @@
                     WIFI_PNO_FREQUENCY_CULLING_ENABLED_VALIDATOR);
             VALIDATORS.put(WIFI_PNO_RECENCY_SORTING_ENABLED,
                     WIFI_PNO_RECENCY_SORTING_ENABLED_VALIDATOR);
+            VALIDATORS.put(WIFI_LINK_PROBING_ENABLED, WIFI_LINK_PROBING_ENABLED_VALIDATOR);
         }
 
         /**
@@ -14082,6 +14165,7 @@
          * edit_choices_before_sending       (boolean)
          * show_in_heads_up                  (boolean)
          * min_num_system_generated_replies  (int)
+         * max_num_actions                   (int)
          * </pre>
          * @see com.android.systemui.statusbar.policy.SmartReplyConstants
          * @hide
@@ -14244,6 +14328,19 @@
         public static final String LOOPER_STATS = "looper_stats";
 
         /**
+         * Settings for collecting statistics on CPU usage per thread
+         *
+         * The following strings are supported as keys:
+         * <pre>
+         *     num_buckets          (int)
+         *     collected_uids       (string)
+         * </pre>
+         *
+         * @hide
+         */
+        public static final String KERNEL_CPU_THREAD_READER = "kernel_cpu_thread_reader";
+
+        /**
          * Default user id to boot into. They map to user ids, for example, 10, 11, 12.
          *
          * @hide
diff --git a/core/java/android/service/appprediction/AppPredictionService.java b/core/java/android/service/appprediction/AppPredictionService.java
index b77405a..d012851 100644
--- a/core/java/android/service/appprediction/AppPredictionService.java
+++ b/core/java/android/service/appprediction/AppPredictionService.java
@@ -21,6 +21,7 @@
 import android.annotation.MainThread;
 import android.annotation.NonNull;
 import android.annotation.SystemApi;
+import android.annotation.TestApi;
 import android.app.Service;
 import android.app.prediction.AppPredictionContext;
 import android.app.prediction.AppPredictionSessionId;
@@ -49,6 +50,7 @@
  * @hide
  */
 @SystemApi
+@TestApi
 public abstract class AppPredictionService extends Service {
 
     private static final String TAG = "AppPredictionService";
@@ -140,6 +142,7 @@
 
     @Override
     public final IBinder onBind(Intent intent) {
+        // TODO(b/111701043): Verify that the action is valid
         return mInterface.asBinder();
     }
 
@@ -228,6 +231,7 @@
     public void onStopPredictionUpdates() {}
 
     private void doRequestPredictionUpdate(@NonNull AppPredictionSessionId sessionId) {
+        // Just an optimization, if there are no callbacks, then don't bother notifying the service
         final ArrayList<CallbackWrapper> callbacks = mSessionCallbacks.get(sessionId);
         if (callbacks != null && !callbacks.isEmpty()) {
             onRequestPredictionUpdate(sessionId);
diff --git a/core/java/android/service/attention/AttentionService.java b/core/java/android/service/attention/AttentionService.java
index f6e448dc..24d74ff 100644
--- a/core/java/android/service/attention/AttentionService.java
+++ b/core/java/android/service/attention/AttentionService.java
@@ -64,10 +64,10 @@
     /** Attention is present. */
     public static final int ATTENTION_SUCCESS_PRESENT = 1;
 
-    /** Preempted by other camera user. */
+    /** Preempted by other client. */
     public static final int ATTENTION_FAILURE_PREEMPTED = 2;
 
-    /** Preempted by other camera user. */
+    /** Request timed out. */
     public static final int ATTENTION_FAILURE_TIMED_OUT = 3;
 
     /** Unknown reasons for failing to determine the attention. */
diff --git a/core/java/android/service/contentsuggestions/ContentSuggestionsService.java b/core/java/android/service/contentsuggestions/ContentSuggestionsService.java
index 0da8039..333f4be 100644
--- a/core/java/android/service/contentsuggestions/ContentSuggestionsService.java
+++ b/core/java/android/service/contentsuggestions/ContentSuggestionsService.java
@@ -31,6 +31,7 @@
 import android.content.Intent;
 import android.graphics.Bitmap;
 import android.graphics.GraphicBuffer;
+import android.hardware.HardwareBuffer;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.IBinder;
@@ -62,7 +63,8 @@
             mHandler.sendMessage(
                     obtainMessage(ContentSuggestionsService::processContextImage,
                             ContentSuggestionsService.this, taskId,
-                            Bitmap.createHardwareBitmap(contextImage),
+                            Bitmap.wrapHardwareBuffer(
+                                    HardwareBuffer.createFromGraphicBuffer(contextImage), null),
                             imageContextRequestExtras));
         }
 
diff --git a/core/java/android/service/dreams/OWNERS b/core/java/android/service/dreams/OWNERS
index 3c9bbf8..426f002 100644
--- a/core/java/android/service/dreams/OWNERS
+++ b/core/java/android/service/dreams/OWNERS
@@ -1,3 +1,3 @@
-dsandler@google.com
+dsandler@android.com
 michaelwr@google.com
 roosa@google.com
diff --git a/core/java/android/service/notification/INotificationListener.aidl b/core/java/android/service/notification/INotificationListener.aidl
index 1ddc099e..22104b5 100644
--- a/core/java/android/service/notification/INotificationListener.aidl
+++ b/core/java/android/service/notification/INotificationListener.aidl
@@ -33,6 +33,7 @@
     void onListenerConnected(in NotificationRankingUpdate update);
     void onNotificationPosted(in IStatusBarNotificationHolder notificationHolder,
             in NotificationRankingUpdate update);
+    void onStatusBarIconsBehaviorChanged(boolean hideSilentStatusIcons);
     // stats only for assistant
     void onNotificationRemoved(in IStatusBarNotificationHolder notificationHolder,
             in NotificationRankingUpdate update, in NotificationStats stats, int reason);
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java
index c734b63..d4e8879 100644
--- a/core/java/android/service/notification/NotificationListenerService.java
+++ b/core/java/android/service/notification/NotificationListenerService.java
@@ -469,6 +469,17 @@
     }
 
     /**
+     * Implement this method to be notified when the behavior of silent notifications in the status
+     * bar changes. See {@link NotificationManager#shouldHideSilentStatusBarIcons()}.
+     *
+     * @param hideSilentStatusIcons whether or not status bar icons should be hidden for silent
+     *                              notifications
+     */
+    public void onStatusBarIconsBehaviorChanged(boolean hideSilentStatusIcons) {
+        // optional
+    }
+
+    /**
      * Implement this method to learn about notification channel modifications.
      *
      * <p>The caller must have {@link CompanionDeviceManager#getAssociations() an associated
@@ -1411,6 +1422,12 @@
             mHandler.obtainMessage(
                     MyHandler.MSG_ON_NOTIFICATION_CHANNEL_GROUP_MODIFIED, args).sendToTarget();
         }
+
+        @Override
+        public void onStatusBarIconsBehaviorChanged(boolean hideSilentStatusIcons) {
+            mHandler.obtainMessage(MyHandler.MSG_ON_STATUS_BAR_ICON_BEHAVIOR_CHANGED,
+                    hideSilentStatusIcons).sendToTarget();
+        }
     }
 
     /**
@@ -2142,6 +2159,7 @@
         public static final int MSG_ON_INTERRUPTION_FILTER_CHANGED = 6;
         public static final int MSG_ON_NOTIFICATION_CHANNEL_MODIFIED = 7;
         public static final int MSG_ON_NOTIFICATION_CHANNEL_GROUP_MODIFIED = 8;
+        public static final int MSG_ON_STATUS_BAR_ICON_BEHAVIOR_CHANGED = 9;
 
         public MyHandler(Looper looper) {
             super(looper, null, false);
@@ -2207,6 +2225,10 @@
                     int modificationType = (int) args.arg4;
                     onNotificationChannelGroupModified(pkgName, user, group, modificationType);
                 } break;
+
+                case MSG_ON_STATUS_BAR_ICON_BEHAVIOR_CHANGED: {
+                    onStatusBarIconsBehaviorChanged((Boolean) msg.obj);
+                } break;
             }
         }
     }
diff --git a/core/java/android/service/notification/StatusBarNotification.java b/core/java/android/service/notification/StatusBarNotification.java
index 3a644d4..551bb8a 100644
--- a/core/java/android/service/notification/StatusBarNotification.java
+++ b/core/java/android/service/notification/StatusBarNotification.java
@@ -28,6 +28,7 @@
 import android.os.Parcelable;
 import android.os.UserHandle;
 
+import com.android.internal.logging.nano.MetricsProto;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 
 /**
@@ -410,7 +411,9 @@
             .clearSubtype()
             .addTaggedData(MetricsEvent.FIELD_NOTIFICATION_GROUP_ID, getGroupLogTag())
             .addTaggedData(MetricsEvent.FIELD_NOTIFICATION_GROUP_SUMMARY,
-                getNotification().isGroupSummary() ? 1 : 0);
+                getNotification().isGroupSummary() ? 1 : 0)
+            .addTaggedData(MetricsProto.MetricsEvent.FIELD_NOTIFICATION_CATEGORY,
+                    getNotification().category);
     }
 
     private String getGroupLogTag() {
diff --git a/core/java/android/service/voice/VoiceInteractionService.java b/core/java/android/service/voice/VoiceInteractionService.java
index 2789651..e76e096 100644
--- a/core/java/android/service/voice/VoiceInteractionService.java
+++ b/core/java/android/service/voice/VoiceInteractionService.java
@@ -16,7 +16,6 @@
 
 package android.service.voice;
 
-import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.SdkConstant;
@@ -41,8 +40,6 @@
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
@@ -80,33 +77,6 @@
      */
     public static final String SERVICE_META_DATA = "android.voice_interaction";
 
-    /** @hide */
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef(prefix = {"VOICE_STATE_"}, value = {
-            VOICE_STATE_NONE,
-            VOICE_STATE_CONDITIONAL_LISTENING,
-            VOICE_STATE_LISTENING,
-            VOICE_STATE_FULFILLING})
-    public @interface VoiceState {
-    }
-
-    /**
-     * Voice assistant inactive.
-     */
-    public static final int VOICE_STATE_NONE = 0;
-    /**
-     * Voice assistant listening, but will only trigger if it hears a request it can fulfill.
-     */
-    public static final int VOICE_STATE_CONDITIONAL_LISTENING = 1;
-    /**
-     * Voice assistant is listening to user speech.
-     */
-    public static final int VOICE_STATE_LISTENING = 2;
-    /**
-     * Voice assistant is fulfilling an action requested by the user.
-     */
-    public static final int VOICE_STATE_FULFILLING = 3;
-
     IVoiceInteractionService mInterface = new IVoiceInteractionService.Stub() {
         @Override
         public void ready() {
@@ -376,7 +346,7 @@
      *
      * @param state value indicating whether the assistant is listening, fulfilling, etc.
      */
-    public final void setVoiceState(@VoiceState int state) {
+    public final void setVoiceState(int state) {
         try {
             mSystemService.setVoiceState(state);
         } catch (RemoteException e) {
diff --git a/core/java/android/text/BoringLayout.java b/core/java/android/text/BoringLayout.java
index 2b33fae..cf6987c 100644
--- a/core/java/android/text/BoringLayout.java
+++ b/core/java/android/text/BoringLayout.java
@@ -272,16 +272,27 @@
     }
 
     /**
-     * Returns null if not boring; the width, ascent, and descent if boring.
+     * Determine and compute metrics if given text can be handled by BoringLayout.
+     *
+     * @param text a text
+     * @param paint a paint
+     * @return layout metric for the given text. null if given text is unable to be handled by
+     *         BoringLayout.
      */
     public static Metrics isBoring(CharSequence text, TextPaint paint) {
         return isBoring(text, paint, TextDirectionHeuristics.FIRSTSTRONG_LTR, null);
     }
 
     /**
-     * Returns null if not boring; the width, ascent, and descent in the
-     * provided Metrics object (or a new one if the provided one was null)
-     * if boring.
+     * Determine and compute metrics if given text can be handled by BoringLayout.
+     *
+     * @param text a text
+     * @param paint a paint
+     * @param metrics a metrics object to be recycled. If null is passed, this function creat new
+     *                object.
+     * @return layout metric for the given text. If metrics is not null, this method fills values
+     *         to given metrics object instead of allocating new metrics object. null if given text
+     *         is unable to be handled by BoringLayout.
      */
     public static Metrics isBoring(CharSequence text, TextPaint paint, Metrics metrics) {
         return isBoring(text, paint, TextDirectionHeuristics.FIRSTSTRONG_LTR, metrics);
diff --git a/core/java/android/util/FeatureFlagUtils.java b/core/java/android/util/FeatureFlagUtils.java
index db9351b..1ca6398 100644
--- a/core/java/android/util/FeatureFlagUtils.java
+++ b/core/java/android/util/FeatureFlagUtils.java
@@ -36,6 +36,7 @@
     public static final String FFLAG_PREFIX = "sys.fflag.";
     public static final String FFLAG_OVERRIDE_PREFIX = FFLAG_PREFIX + "override.";
     public static final String PERSIST_PREFIX = "persist." + FFLAG_OVERRIDE_PREFIX;
+    public static final String SEAMLESS_TRANSFER = "settings_seamless_transfer";
     public static final String HEARING_AID_SETTINGS = "settings_bluetooth_hearing_aid";
     public static final String SAFETY_HUB = "settings_safety_hub";
     public static final String SCREENRECORD_LONG_PRESS = "settings_screenrecord_long_press";
@@ -51,12 +52,13 @@
         DEFAULT_FLAGS.put("settings_dynamic_homepage", "true");
         DEFAULT_FLAGS.put("settings_mobile_network_v2", "true");
         DEFAULT_FLAGS.put("settings_network_and_internet_v2", "false");
-        DEFAULT_FLAGS.put("settings_seamless_transfer", "false");
         DEFAULT_FLAGS.put("settings_slice_injection", "true");
         DEFAULT_FLAGS.put("settings_systemui_theme", "true");
         DEFAULT_FLAGS.put("settings_wifi_dpp", "true");
         DEFAULT_FLAGS.put("settings_wifi_mac_randomization", "true");
         DEFAULT_FLAGS.put("settings_wifi_sharing", "true");
+        DEFAULT_FLAGS.put("settings_mainline_module", "false");
+        DEFAULT_FLAGS.put(SEAMLESS_TRANSFER, "false");
         DEFAULT_FLAGS.put(HEARING_AID_SETTINGS, "false");
         DEFAULT_FLAGS.put(SAFETY_HUB, "false");
         DEFAULT_FLAGS.put(SCREENRECORD_LONG_PRESS, "false");
diff --git a/core/java/android/util/KeyValueListParser.java b/core/java/android/util/KeyValueListParser.java
index d051ed8..fbc66e6 100644
--- a/core/java/android/util/KeyValueListParser.java
+++ b/core/java/android/util/KeyValueListParser.java
@@ -373,4 +373,57 @@
             proto.write(tag, mValue);
         }
     }
+
+    /** Represents an float config value. */
+    public static class FloatValue {
+        private final String mKey;
+        private final float mDefaultValue;
+        private float mValue;
+
+        /** Constructor, initialize with a config key and a default value. */
+        public FloatValue(String key, float defaultValue) {
+            mKey = key;
+            mDefaultValue = defaultValue;
+            mValue = mDefaultValue;
+        }
+
+        /** Read a value from {@link KeyValueListParser} */
+        public void parse(KeyValueListParser parser) {
+            mValue = parser.getFloat(mKey, mDefaultValue);
+        }
+
+        /** Return the config key. */
+        public String getKey() {
+            return mKey;
+        }
+
+        /** Return the default value. */
+        public float getDefaultValue() {
+            return mDefaultValue;
+        }
+
+        /** Return the actual config value. */
+        public float getValue() {
+            return mValue;
+        }
+
+        /** Overwrites with a value. */
+        public void setValue(float value) {
+            mValue = value;
+        }
+
+        /** Used for dumpsys */
+        public void dump(PrintWriter pw, String prefix) {
+            pw.print(prefix);
+            pw.print(mKey);
+            pw.print("=");
+            pw.print(mValue);
+            pw.println();
+        }
+
+        /** Used for proto dumpsys */
+        public void dumpProto(ProtoOutputStream proto, long tag) {
+            proto.write(tag, mValue);
+        }
+    }
 }
diff --git a/core/java/android/util/proto/EncodedBuffer.java b/core/java/android/util/proto/EncodedBuffer.java
index ed38e6f..56a0bfa 100644
--- a/core/java/android/util/proto/EncodedBuffer.java
+++ b/core/java/android/util/proto/EncodedBuffer.java
@@ -147,6 +147,14 @@
         return mReadableSize;
     }
 
+    /**
+     * Returns the buffer size
+     * @return the buffer size
+     */
+    public int getSize() {
+        return ((mBufferCount - 1) * mChunkSize) + mWriteIndex;
+    }
+
     //
     // Reading from the read position.
     //
diff --git a/core/java/android/util/proto/ProtoOutputStream.java b/core/java/android/util/proto/ProtoOutputStream.java
index a1ee61c..6efcfbf 100644
--- a/core/java/android/util/proto/ProtoOutputStream.java
+++ b/core/java/android/util/proto/ProtoOutputStream.java
@@ -188,6 +188,18 @@
     }
 
     /**
+     * Returns the uncompressed buffer size
+     * @return the uncompressed buffer size
+     */
+    public int getRawSize() {
+        if (mCompacted) {
+            return getBytes().length;
+        } else {
+            return mBuffer.getSize();
+        }
+    }
+
+    /**
      * Write a value for the given fieldId.
      *
      * Will automatically convert for the following field types, and
diff --git a/core/java/android/view/AccessibilityInteractionController.java b/core/java/android/view/AccessibilityInteractionController.java
index eb41e07..59e562f 100644
--- a/core/java/android/view/AccessibilityInteractionController.java
+++ b/core/java/android/view/AccessibilityInteractionController.java
@@ -41,12 +41,14 @@
 import android.view.accessibility.AccessibilityInteractionClient;
 import android.view.accessibility.AccessibilityManager;
 import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
 import android.view.accessibility.AccessibilityNodeProvider;
 import android.view.accessibility.AccessibilityRequestPreparer;
 import android.view.accessibility.IAccessibilityInteractionConnectionCallback;
 
 import com.android.internal.R;
 import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.os.SomeArgs;
 
 import java.util.ArrayList;
@@ -64,8 +66,11 @@
  * called from the interaction connection ViewAncestor gives the system to
  * talk to it and a corresponding *UiThread method that is executed on the
  * UI thread.
+ *
+ * @hide
  */
-final class AccessibilityInteractionController {
+@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+public final class AccessibilityInteractionController {
 
     private static final String LOG_TAG = "AccessibilityInteractionController";
 
@@ -85,7 +90,7 @@
 
     private final Object mLock = new Object();
 
-    private final Handler mHandler;
+    private final PrivateHandler mHandler;
 
     private final ViewRootImpl mViewRootImpl;
 
@@ -131,11 +136,19 @@
             // thread in this process, set the message as a static reference so
             // after this call completes the same thread but in the interrogating
             // client can handle the message to generate the result.
-            if (interrogatingPid == mMyProcessId && interrogatingTid == mMyLooperThreadId) {
+            if (interrogatingPid == mMyProcessId && interrogatingTid == mMyLooperThreadId
+                    && mHandler.hasAccessibilityCallback(message)) {
                 AccessibilityInteractionClient.getInstanceForThread(
                         interrogatingTid).setSameThreadMessage(message);
             } else {
-                mHandler.sendMessage(message);
+                // For messages without callback of interrogating client, just handle the
+                // message immediately if this is UI thread.
+                if (!mHandler.hasAccessibilityCallback(message)
+                        && Thread.currentThread().getId() == mMyLooperThreadId) {
+                    mHandler.handleMessage(message);
+                } else {
+                    mHandler.sendMessage(message);
+                }
             }
         }
     }
@@ -731,6 +744,52 @@
         }
     }
 
+    /**
+     * Finds the accessibility focused node in the root, and clears the accessibility focus.
+     */
+    public void clearAccessibilityFocusClientThread() {
+        final Message message = mHandler.obtainMessage();
+        message.what = PrivateHandler.MSG_CLEAR_ACCESSIBILITY_FOCUS;
+
+        // Don't care about pid and tid because there's no interrogating client for this message.
+        scheduleMessage(message, 0, 0, CONSIDER_REQUEST_PREPARERS);
+    }
+
+    private void clearAccessibilityFocusUiThread() {
+        if (mViewRootImpl.mView == null || mViewRootImpl.mAttachInfo == null) {
+            return;
+        }
+        try {
+            mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags =
+                    AccessibilityNodeInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
+            final View root = mViewRootImpl.mView;
+            if (root != null && isShown(root)) {
+                final View host = mViewRootImpl.mAccessibilityFocusedHost;
+                // If there is no accessibility focus host or it is not a descendant
+                // of the root from which to start the search, then the search failed.
+                if (host == null || !ViewRootImpl.isViewDescendantOf(host, root)) {
+                    return;
+                }
+                final AccessibilityNodeProvider provider = host.getAccessibilityNodeProvider();
+                final AccessibilityNodeInfo focusNode =
+                        mViewRootImpl.mAccessibilityFocusedVirtualView;
+                if (provider != null && focusNode != null) {
+                    final int virtualNodeId = AccessibilityNodeInfo.getVirtualDescendantId(
+                            focusNode.getSourceNodeId());
+                    provider.performAction(virtualNodeId,
+                            AccessibilityAction.ACTION_CLEAR_ACCESSIBILITY_FOCUS.getId(),
+                            null);
+                } else {
+                    host.performAccessibilityAction(
+                            AccessibilityAction.ACTION_CLEAR_ACCESSIBILITY_FOCUS.getId(),
+                            null);
+                }
+            }
+        } finally {
+            mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
+        }
+    }
+
     private View findViewByAccessibilityId(int accessibilityId) {
         View root = mViewRootImpl.mView;
         if (root == null) {
@@ -1294,6 +1353,12 @@
         private static final int MSG_APP_PREPARATION_FINISHED = 8;
         private static final int MSG_APP_PREPARATION_TIMEOUT = 9;
 
+        // Uses FIRST_NO_ACCESSIBILITY_CALLBACK_MSG for messages that don't need to call back
+        // results to interrogating client.
+        private static final int FIRST_NO_ACCESSIBILITY_CALLBACK_MSG = 100;
+        private static final int MSG_CLEAR_ACCESSIBILITY_FOCUS =
+                FIRST_NO_ACCESSIBILITY_CALLBACK_MSG + 1;
+
         public PrivateHandler(Looper looper) {
             super(looper);
         }
@@ -1320,6 +1385,8 @@
                     return "MSG_APP_PREPARATION_FINISHED";
                 case MSG_APP_PREPARATION_TIMEOUT:
                     return "MSG_APP_PREPARATION_TIMEOUT";
+                case MSG_CLEAR_ACCESSIBILITY_FOCUS:
+                    return "MSG_CLEAR_ACCESSIBILITY_FOCUS";
                 default:
                     throw new IllegalArgumentException("Unknown message type: " + type);
             }
@@ -1356,10 +1423,17 @@
                 case MSG_APP_PREPARATION_TIMEOUT: {
                     requestPreparerTimeoutUiThread();
                 } break;
+                case MSG_CLEAR_ACCESSIBILITY_FOCUS: {
+                    clearAccessibilityFocusUiThread();
+                } break;
                 default:
                     throw new IllegalArgumentException("Unknown message type: " + type);
             }
         }
+
+        boolean hasAccessibilityCallback(Message message) {
+            return message.what < FIRST_NO_ACCESSIBILITY_CALLBACK_MSG ? true : false;
+        }
     }
 
     private final class AddNodeInfosForViewId implements Predicate<View> {
diff --git a/core/java/android/view/GestureDetector.java b/core/java/android/view/GestureDetector.java
index 7d9ec70..c794a69 100644
--- a/core/java/android/view/GestureDetector.java
+++ b/core/java/android/view/GestureDetector.java
@@ -237,16 +237,6 @@
     private static final int LONG_PRESS = 2;
     private static final int TAP = 3;
 
-    /**
-     * If a MotionEvent has CLASSIFICATION_AMBIGUOUS_GESTURE set, then certain actions, such as
-     * scrolling, will be inhibited. However, to account for the possibility of incorrect
-     * classification, the default scrolling will only be inhibited if the gesture moves beyond
-     * (default touch slop * AMBIGUOUS_GESTURE_MULTIPLIER). Likewise, the default long press
-     * timeout will be increased for some situations where the default behaviour
-     * is to cancel it.
-     */
-    private static final int AMBIGUOUS_GESTURE_MULTIPLIER = 2;
-
     private final Handler mHandler;
     @UnsupportedAppUsage
     private final OnGestureListener mListener;
@@ -636,6 +626,7 @@
                             hasPendingLongPress && ambiguousGesture;
                     if (shouldInhibitDefaultAction) {
                         // Inhibit default long press
+                        final float multiplier = ViewConfiguration.getAmbiguousGestureMultiplier();
                         if (distance > slopSquare) {
                             // The default action here is to remove long press. But if the touch
                             // slop below gets increased, and we never exceed the modified touch
@@ -643,15 +634,15 @@
                             // will happen in response to user input. To prevent this,
                             // reschedule long press with a modified timeout.
                             mHandler.removeMessages(LONG_PRESS);
-                            final int longPressTimeout = ViewConfiguration.getLongPressTimeout();
+                            final long longPressTimeout = ViewConfiguration.getLongPressTimeout();
                             mHandler.sendEmptyMessageAtTime(LONG_PRESS, ev.getDownTime()
-                                    + longPressTimeout * AMBIGUOUS_GESTURE_MULTIPLIER);
+                                    + (long) (longPressTimeout * multiplier));
                         }
                         // Inhibit default scroll. If a gesture is ambiguous, we prevent scroll
                         // until the gesture is resolved.
                         // However, for safety, simply increase the touch slop in case the
                         // classification is erroneous. Since the value is squared, multiply twice.
-                        slopSquare *= AMBIGUOUS_GESTURE_MULTIPLIER * AMBIGUOUS_GESTURE_MULTIPLIER;
+                        slopSquare *= multiplier * multiplier;
                     }
 
                     if (distance > slopSquare) {
diff --git a/packages/overlays/FontRubikRubikOverlay/res/values/strings.xml b/core/java/android/view/IDisplayFoldListener.aidl
similarity index 60%
rename from packages/overlays/FontRubikRubikOverlay/res/values/strings.xml
rename to core/java/android/view/IDisplayFoldListener.aidl
index 4bac7da..2c91149 100644
--- a/packages/overlays/FontRubikRubikOverlay/res/values/strings.xml
+++ b/core/java/android/view/IDisplayFoldListener.aidl
@@ -1,12 +1,11 @@
-<!--
-/**
- * Copyright (c) 2018, The Android Open Source Project
+/*
+ * Copyright (C) 2019 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *     http://www.apache.org/licenses/LICENSE-2.0
+ *      http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -14,8 +13,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
--->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- Headline / Body font Rubik overlay -->
-    <string name="font_rubik_rubik_overlay" translatable="false">Rubik / Rubik</string>
-</resources>
+
+package android.view;
+
+/**
+ * {@hide}
+ */
+oneway interface IDisplayFoldListener
+{
+    /** Called when the foldedness of a display changes */
+    void onDisplayFoldChanged(int displayId, boolean folded);
+}
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index 42ac880..8ae4757 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -34,6 +34,7 @@
 import android.view.IApplicationToken;
 import android.view.IAppTransitionAnimationSpecsFuture;
 import android.view.IDockedStackListener;
+import android.view.IDisplayFoldListener;
 import android.view.IOnKeyguardExitResult;
 import android.view.IPinnedStackListener;
 import android.view.RemoteAnimationAdapter;
@@ -403,6 +404,16 @@
     Region getCurrentImeTouchRegion();
 
     /**
+     * Registers an IDisplayFoldListener.
+     */
+    void registerDisplayFoldListener(IDisplayFoldListener listener);
+
+    /**
+     * Unregisters an IDisplayFoldListener.
+     */
+    void unregisterDisplayFoldListener(IDisplayFoldListener listener);
+
+    /**
      * Starts a window trace.
      */
     void startWindowTrace();
diff --git a/core/java/android/view/InputWindowHandle.java b/core/java/android/view/InputWindowHandle.java
index 92e0009..ec79eea 100644
--- a/core/java/android/view/InputWindowHandle.java
+++ b/core/java/android/view/InputWindowHandle.java
@@ -16,10 +16,10 @@
 
 package android.view;
 
+import static android.view.Display.INVALID_DISPLAY;
+
 import android.graphics.Region;
 import android.os.IBinder;
-import android.view.IWindow;
-import android.view.InputChannel;
 
 /**
  * Functions as a handle for a window that can receive input.
@@ -94,6 +94,10 @@
     // Display this input is on.
     public int displayId;
 
+    // If this value is set to a valid display ID, it indicates this window is a portal which
+    // transports the touch of this window to the display indicated by portalToDisplayId.
+    public int portalToDisplayId = INVALID_DISPLAY;
+
     private native void nativeDispose();
 
     public InputWindowHandle(InputApplicationHandle inputApplicationHandle,
diff --git a/core/java/android/view/LayoutInflater.java b/core/java/android/view/LayoutInflater.java
index dc7c343..6a290b7 100644
--- a/core/java/android/view/LayoutInflater.java
+++ b/core/java/android/view/LayoutInflater.java
@@ -20,6 +20,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.SystemService;
+import android.annotation.TestApi;
 import android.annotation.UnsupportedAppUsage;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
@@ -399,17 +400,21 @@
     }
 
     private void initPrecompiledViews() {
-        // Check if precompiled layouts are enabled by a system property.
-        mUseCompiledView =
-            SystemProperties.getBoolean(USE_PRECOMPILED_LAYOUT_SYSTEM_PROPERTY, false);
+        initPrecompiledViews(
+                SystemProperties.getBoolean(USE_PRECOMPILED_LAYOUT_SYSTEM_PROPERTY, false));
+    }
+
+    private void initPrecompiledViews(boolean enablePrecompiledViews) {
+        mUseCompiledView = enablePrecompiledViews;
+
         if (!mUseCompiledView) {
+            mPrecompiledClassLoader = null;
             return;
         }
 
         // Make sure the application allows code generation
         ApplicationInfo appInfo = mContext.getApplicationInfo();
-        if ((appInfo.privateFlags & ApplicationInfo.PRIVATE_FLAG_PREFER_CODE_INTEGRITY) != 0
-            || appInfo.isPrivilegedApp()) {
+        if (appInfo.isEmbeddedDexUsed() || appInfo.isPrivilegedApp()) {
             mUseCompiledView = false;
             return;
         }
@@ -431,6 +436,17 @@
             }
             mUseCompiledView = false;
         }
+        if (!mUseCompiledView) {
+            mPrecompiledClassLoader = null;
+        }
+    }
+
+    /**
+     * @hide for use by CTS tests
+     */
+    @TestApi
+    public void setPrecompiledLayoutsEnabledForTesting(boolean enablePrecompiledLayouts) {
+        initPrecompiledViews(enablePrecompiledLayouts);
     }
 
     /**
diff --git a/core/java/android/view/MotionEvent.java b/core/java/android/view/MotionEvent.java
index 9d3552f..b6a4a09 100644
--- a/core/java/android/view/MotionEvent.java
+++ b/core/java/android/view/MotionEvent.java
@@ -431,8 +431,9 @@
 
     /**
      * This flag indicates that the window that received this motion event is partly
-     * or wholly obscured by another visible window above it.  This flag is set to true
-     * even if the event did not directly pass through the obscured area.
+     * or wholly obscured by another visible window above it. This flag is set to true
+     * if the event directly passed through the obscured area.
+     *
      * A security sensitive application can check this flag to identify situations in which
      * a malicious application may have covered up part of its content for the purpose
      * of misleading the user or hijacking touches.  An appropriate response might be
@@ -443,16 +444,17 @@
 
     /**
      * This flag indicates that the window that received this motion event is partly
-     * or wholly obscured by another visible window above it.  This flag is set to true
+     * or wholly obscured by another visible window above it. This flag is set to true
      * even if the event did not directly pass through the obscured area.
+     *
      * A security sensitive application can check this flag to identify situations in which
      * a malicious application may have covered up part of its content for the purpose
      * of misleading the user or hijacking touches.  An appropriate response might be
      * to drop the suspect touches or to take additional precautions to confirm the user's
      * actual intent.
      *
-     * Unlike FLAG_WINDOW_IS_OBSCURED, this is actually true.
-     * @hide
+     * Unlike FLAG_WINDOW_IS_OBSCURED, this is true even if the window that received this event is
+     * obstructed in areas other than the touched location.
      */
     public static final int FLAG_WINDOW_IS_PARTIALLY_OBSCURED = 0x2;
 
diff --git a/core/java/android/view/RemoteAnimationTarget.java b/core/java/android/view/RemoteAnimationTarget.java
index 1d2cf4b..9b3efe1 100644
--- a/core/java/android/view/RemoteAnimationTarget.java
+++ b/core/java/android/view/RemoteAnimationTarget.java
@@ -246,8 +246,12 @@
         position.writeToProto(proto, POSITION);
         sourceContainerBounds.writeToProto(proto, SOURCE_CONTAINER_BOUNDS);
         windowConfiguration.writeToProto(proto, WINDOW_CONFIGURATION);
-        startLeash.writeToProto(proto, START_LEASH);
-        startBounds.writeToProto(proto, START_BOUNDS);
+        if (startLeash != null) {
+            startLeash.writeToProto(proto, START_LEASH);
+        }
+        if (startBounds != null) {
+            startBounds.writeToProto(proto, START_BOUNDS);
+        }
         proto.end(token);
     }
 
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index 4032a6b..8061cc3 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -41,6 +41,7 @@
 import android.graphics.Point;
 import android.graphics.Rect;
 import android.graphics.Region;
+import android.hardware.HardwareBuffer;
 import android.hardware.display.DisplayedContentSample;
 import android.hardware.display.DisplayedContentSamplingAttributes;
 import android.os.IBinder;
@@ -154,6 +155,8 @@
     private static native int nativeGetActiveConfig(IBinder displayToken);
     private static native boolean nativeSetActiveConfig(IBinder displayToken, int id);
     private static native int[] nativeGetDisplayColorModes(IBinder displayToken);
+    private static native SurfaceControl.DisplayPrimaries nativeGetDisplayNativePrimaries(
+            IBinder displayToken);
     private static native int[] nativeGetCompositionDataspaces();
     private static native int nativeGetActiveColorMode(IBinder displayToken);
     private static native boolean nativeSetActiveColorMode(IBinder displayToken,
@@ -1535,6 +1538,73 @@
     }
 
     /**
+     * Color coordinates in CIE1931 XYZ color space
+     *
+     * @hide
+     */
+    public static final class CieXyz {
+        /**
+         * @hide
+         */
+        public float X;
+
+        /**
+         * @hide
+         */
+        public float Y;
+
+        /**
+         * @hide
+         */
+        public float Z;
+    }
+
+    /**
+     * Contains a display's color primaries
+     *
+     * @hide
+     */
+    public static final class DisplayPrimaries {
+        /**
+         * @hide
+         */
+        public CieXyz red;
+
+        /**
+         * @hide
+         */
+        public CieXyz green;
+
+        /**
+         * @hide
+         */
+        public CieXyz blue;
+
+        /**
+         * @hide
+         */
+        public CieXyz white;
+
+        /**
+         * @hide
+         */
+        public DisplayPrimaries() {
+        }
+    }
+
+    /**
+     * @hide
+     */
+    public static SurfaceControl.DisplayPrimaries getDisplayNativePrimaries(
+            IBinder displayToken) {
+        if (displayToken == null) {
+            throw new IllegalArgumentException("displayToken must not be null");
+        }
+
+        return nativeGetDisplayNativePrimaries(displayToken);
+    }
+
+    /**
      * @hide
      */
     public static int getActiveColorMode(IBinder displayToken) {
@@ -1734,7 +1804,10 @@
             Log.w(TAG, "Failed to take screenshot");
             return null;
         }
-        return Bitmap.createHardwareBitmap(buffer);
+        // TODO(b/116112787) Now that hardware bitmap creation can take color space, we
+        // should continue to fix screenshot.
+        return Bitmap.wrapHardwareBuffer(HardwareBuffer.createFromGraphicBuffer(buffer),
+                ColorSpace.get(ColorSpace.Named.SRGB));
     }
 
     /**
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index cd3decf..992b996 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -16,6 +16,7 @@
 
 package android.view;
 
+import static android.content.res.Resources.ID_NULL;
 import static android.view.ViewRootImpl.NEW_INSETS_MODE_FULL;
 import static android.view.accessibility.AccessibilityEvent.CONTENT_CHANGE_TYPE_UNDEFINED;
 
@@ -3985,15 +3986,6 @@
     public static final int SCROLL_AXIS_VERTICAL = 1 << 1;
 
     /**
-     * If a MotionEvent has CLASSIFICATION_AMBIGUOUS_GESTURE set, then certain the default
-     * long press action will be inhibited. However, to account for the possibility of incorrect
-     * classification, the default long press timeout will instead be increased for some situations
-     * by the following factor.
-     * Likewise, the touch slop for allowing long press will be increased when gesture is uncertain.
-     */
-    private static final int AMBIGUOUS_GESTURE_MULTIPLIER = 2;
-
-    /**
      * Controls the over-scroll mode for this view.
      * See {@link #overScrollBy(int, int, int, int, int, int, int, int, boolean)},
      * {@link #OVER_SCROLL_ALWAYS}, {@link #OVER_SCROLL_IF_CONTENT_SCROLLS},
@@ -5052,6 +5044,9 @@
     @Nullable
     private WeakReference<ContentCaptureSession> mContentCaptureSession;
 
+    @LayoutRes
+    private int mSourceLayoutId = ID_NULL;
+
     /**
      * Simple constructor to use when creating a view from code.
      *
@@ -5217,6 +5212,8 @@
     public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
         this(context);
 
+        mSourceLayoutId = Resources.getAttributeSetSourceResId(attrs);
+
         final TypedArray a = context.obtainStyledAttributes(
                 attrs, com.android.internal.R.styleable.View, defStyleAttr, defStyleRes);
 
@@ -8210,7 +8207,7 @@
      * changed by calling
      * {@link ContentCaptureSession#notifyViewAppeared(ViewStructure)},
      * {@link ContentCaptureSession#notifyViewDisappeared(AutofillId)}, and
-     * {@link ContentCaptureSession#notifyViewTextChanged(AutofillId, CharSequence, int)}
+     * {@link ContentCaptureSession#notifyViewTextChanged(AutofillId, CharSequence)}
      * respectively. The structure for the a child must be created using
      * {@link ContentCaptureSession#newVirtualViewStructure(AutofillId, long)}, and the
      * {@code autofillId} for a child can be obtained either through
@@ -11396,7 +11393,6 @@
      * @see #setAssistBlocked(boolean)
      * @attr ref android.R.styleable#View_assistBlocked
      */
-    @InspectableProperty
     public boolean isAssistBlocked() {
         return (mPrivateFlags3 & PFLAG3_ASSIST_BLOCKED) != 0;
     }
@@ -14802,18 +14798,20 @@
                             motionClassification == MotionEvent.CLASSIFICATION_AMBIGUOUS_GESTURE;
                     int touchSlop = mTouchSlop;
                     if (ambiguousGesture && hasPendingLongPressCallback()) {
+                        final float ambiguousMultiplier =
+                                ViewConfiguration.getAmbiguousGestureMultiplier();
                         if (!pointInView(x, y, touchSlop)) {
                             // The default action here is to cancel long press. But instead, we
                             // just extend the timeout here, in case the classification
                             // stays ambiguous.
                             removeLongPressCallback();
-                            long delay = ViewConfiguration.getLongPressTimeout()
-                                    * AMBIGUOUS_GESTURE_MULTIPLIER;
+                            long delay = (long) (ViewConfiguration.getLongPressTimeout()
+                                    * ambiguousMultiplier);
                             // Subtract the time already spent
                             delay -= event.getEventTime() - event.getDownTime();
                             checkForLongClick(delay, x, y);
                         }
-                        touchSlop *= AMBIGUOUS_GESTURE_MULTIPLIER;
+                        touchSlop *= ambiguousMultiplier;
                     }
 
                     // Be lenient about moving outside of buttons
@@ -18272,7 +18270,7 @@
      *
      * @attr ref android.R.styleable#View_scrollbarDefaultDelayBeforeFade
      */
-    @InspectableProperty
+    @InspectableProperty(name = "scrollbarDefaultDelayBeforeFade")
     public int getScrollBarDefaultDelayBeforeFade() {
         return mScrollCache == null ? ViewConfiguration.getScrollDefaultDelay() :
                 mScrollCache.scrollBarDefaultDelayBeforeFade;
@@ -18297,7 +18295,7 @@
      *
      * @attr ref android.R.styleable#View_scrollbarFadeDuration
      */
-    @InspectableProperty
+    @InspectableProperty(name = "scrollbarFadeDuration")
     public int getScrollBarFadeDuration() {
         return mScrollCache == null ? ViewConfiguration.getScrollBarFadeDuration() :
                 mScrollCache.scrollBarFadeDuration;
@@ -18322,7 +18320,7 @@
      *
      * @attr ref android.R.styleable#View_scrollbarSize
      */
-    @InspectableProperty
+    @InspectableProperty(name = "scrollbarSize")
     public int getScrollBarSize() {
         return mScrollCache == null ? ViewConfiguration.get(mContext).getScaledScrollBarSize() :
                 mScrollCache.scrollBarSize;
@@ -18382,7 +18380,7 @@
             @ViewDebug.IntToString(from = SCROLLBARS_OUTSIDE_OVERLAY, to = "OUTSIDE_OVERLAY"),
             @ViewDebug.IntToString(from = SCROLLBARS_OUTSIDE_INSET, to = "OUTSIDE_INSET")
     })
-    @InspectableProperty(enumMapping = {
+    @InspectableProperty(name = "scrollbarStyle", enumMapping = {
             @EnumMap(value = SCROLLBARS_INSIDE_OVERLAY, name = "insideOverlay"),
             @EnumMap(value = SCROLLBARS_INSIDE_INSET, name = "insideInset"),
             @EnumMap(value = SCROLLBARS_OUTSIDE_OVERLAY, name = "outsideOverlay"),
@@ -23254,6 +23252,18 @@
     }
 
     /**
+     * A {@link View} can be inflated from an XML layout. For such Views this method returns the
+     * resource ID of the source layout.
+     *
+     * @return The layout resource id if this view was inflated from XML, otherwise
+     * {@link Resources#ID_NULL}.
+     */
+    @LayoutRes
+    public int getSourceLayoutResId() {
+        return mSourceLayoutId;
+    }
+
+    /**
      * Returns the top padding of this view.
      *
      * @return the top padding in pixels
diff --git a/core/java/android/view/ViewConfiguration.java b/core/java/android/view/ViewConfiguration.java
index d03d97e..94d1b6d 100644
--- a/core/java/android/view/ViewConfiguration.java
+++ b/core/java/android/view/ViewConfiguration.java
@@ -16,6 +16,7 @@
 
 package android.view;
 
+import android.annotation.FloatRange;
 import android.annotation.TestApi;
 import android.annotation.UnsupportedAppUsage;
 import android.app.AppGlobals;
@@ -286,6 +287,11 @@
     private static final int HAS_PERMANENT_MENU_KEY_TRUE = 1;
     private static final int HAS_PERMANENT_MENU_KEY_FALSE = 2;
 
+    /**
+     * The multiplication factor for inhibiting default gestures.
+     */
+    private static final float AMBIGUOUS_GESTURE_MULTIPLIER = 2f;
+
     private final int mEdgeSlop;
     private final int mFadingEdgeLength;
     private final int mMinimumFlingVelocity;
@@ -911,6 +917,22 @@
     }
 
     /**
+     * If a MotionEvent has CLASSIFICATION_AMBIGUOUS_GESTURE set, then certain actions, such as
+     * scrolling, will be inhibited.
+     * However, to account for the possibility of incorrect classification,
+     * the default scrolling will only be inhibited if the pointer travels less than
+     * (getScaledTouchSlop() * this factor).
+     * Likewise, the default long press timeout will be increased by this factor for some situations
+     * where the default behaviour is to cancel it.
+     *
+     * @return The multiplication factor for inhibiting default gestures.
+     */
+    @FloatRange(from = 1.0)
+    public static float getAmbiguousGestureMultiplier() {
+        return AMBIGUOUS_GESTURE_MULTIPLIER;
+    }
+
+    /**
      * Report if the device has a permanent menu key available to the user.
      *
      * <p>As of Android 3.0, devices may not have a permanent menu key available.
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index f47eb10..9213f32 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -8718,6 +8718,15 @@
                 }
             }
         }
+
+        @Override
+        public void clearAccessibilityFocus() {
+            ViewRootImpl viewRootImpl = mViewRootImpl.get();
+            if (viewRootImpl != null && viewRootImpl.mView != null) {
+                viewRootImpl.getAccessibilityInteractionController()
+                        .clearAccessibilityFocusClientThread();
+            }
+        }
     }
 
     private class SendWindowContentChangedAccessibilityEvent implements Runnable {
diff --git a/core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl b/core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl
index 4c0fdfd..947ff05 100644
--- a/core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl
+++ b/core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl
@@ -55,4 +55,6 @@
     void performAccessibilityAction(long accessibilityNodeId, int action, in Bundle arguments,
         int interactionId, IAccessibilityInteractionConnectionCallback callback, int flags,
         int interrogatingPid, long interrogatingTid);
+
+    void clearAccessibilityFocus();
 }
diff --git a/core/java/android/view/contentcapture/ContentCaptureContext.java b/core/java/android/view/contentcapture/ContentCaptureContext.java
index 1928613..5814759 100644
--- a/core/java/android/view/contentcapture/ContentCaptureContext.java
+++ b/core/java/android/view/contentcapture/ContentCaptureContext.java
@@ -27,6 +27,7 @@
 import android.os.Bundle;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.view.Display;
 import android.view.View;
 
 import com.android.internal.util.Preconditions;
@@ -90,8 +91,8 @@
     // Fields below are set by server when the session starts
     private final @Nullable ComponentName mComponentName;
     private final int mTaskId;
-    private final int mDisplayId;
     private final int mFlags;
+    private final int mDisplayId;
 
     // Fields below are set by the service upon "delivery" and are not marshalled in the parcel
     private @Nullable String mParentSessionId;
@@ -123,7 +124,8 @@
         mAction = builder.mAction;
 
         mComponentName  = null;
-        mTaskId = mFlags = mDisplayId = 0;
+        mTaskId = mFlags = 0;
+        mDisplayId = Display.INVALID_DISPLAY;
     }
 
     /**
diff --git a/core/java/android/view/contentcapture/ContentCaptureManager.java b/core/java/android/view/contentcapture/ContentCaptureManager.java
index d7f1b9f..f31856c 100644
--- a/core/java/android/view/contentcapture/ContentCaptureManager.java
+++ b/core/java/android/view/contentcapture/ContentCaptureManager.java
@@ -15,12 +15,12 @@
  */
 package android.view.contentcapture;
 
+import static android.view.contentcapture.ContentCaptureHelper.DEBUG;
 import static android.view.contentcapture.ContentCaptureHelper.VERBOSE;
 
-import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
-
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.SystemApi;
 import android.annotation.SystemService;
 import android.annotation.UiThread;
 import android.content.ComponentName;
@@ -33,7 +33,6 @@
 import android.view.contentcapture.ContentCaptureSession.FlushReason;
 
 import com.android.internal.annotations.GuardedBy;
-import com.android.internal.os.IResultReceiver;
 import com.android.internal.util.Preconditions;
 import com.android.internal.util.SyncResultReceiver;
 
@@ -54,6 +53,13 @@
 
     private static final String TAG = ContentCaptureManager.class.getSimpleName();
 
+    /** @hide */
+    public static final int RESULT_CODE_TRUE = 1;
+    /** @hide */
+    public static final int RESULT_CODE_FALSE = 2;
+    /** @hide */
+    public static final int RESULT_CODE_NOT_SERVICE = -1;
+
     /**
      * Timeout for calls to system_server.
      */
@@ -61,9 +67,6 @@
 
     private final Object mLock = new Object();
 
-    @GuardedBy("mLock")
-    private boolean mDisabled;
-
     @NonNull
     private final Context mContext;
 
@@ -109,11 +112,8 @@
     public MainContentCaptureSession getMainContentCaptureSession() {
         synchronized (mLock) {
             if (mMainSession == null) {
-                mMainSession = new MainContentCaptureSession(mContext, mHandler, mService,
-                        mDisabled);
-                if (VERBOSE) {
-                    Log.v(TAG, "getDefaultContentCaptureSession(): created " + mMainSession);
-                }
+                mMainSession = new MainContentCaptureSession(mContext, this, mHandler, mService);
+                if (VERBOSE) Log.v(TAG, "getMainContentCaptureSession(): created " + mMainSession);
             }
             return mMainSession;
         }
@@ -150,29 +150,43 @@
      */
     @Nullable
     public ComponentName getServiceComponentName() {
-        if (!isContentCaptureEnabled()) {
-            return null;
-        }
-        // Wait for system server to return the component name.
-        final SyncResultReceiver resultReceiver = new SyncResultReceiver(SYNC_CALLS_TIMEOUT_MS);
-        mHandler.sendMessage(obtainMessage(
-                ContentCaptureManager::handleGetComponentName, this, resultReceiver));
+        if (!isContentCaptureEnabled()) return null;
 
+        final SyncResultReceiver resultReceiver = new SyncResultReceiver(SYNC_CALLS_TIMEOUT_MS);
         try {
+            mService.getServiceComponentName(resultReceiver);
             return resultReceiver.getParcelableResult();
         } catch (RemoteException e) {
-            // Unable to retrieve component name in a reasonable amount of time.
             throw e.rethrowFromSystemServer();
         }
     }
 
     /**
      * Checks whether content capture is enabled for this activity.
+     *
+     * <p>There are many reasons it could be disabled, such as:
+     * <ul>
+     *   <li>App itself disabled content capture through {@link #setContentCaptureEnabled(boolean)}.
+     *   <li>Service disabled content capture for this specific activity.
+     *   <li>Service disabled content capture for all activities of this package.
+     *   <li>Service disabled content capture globally.
+     *   <li>User disabled content capture globally (through Settings).
+     *   <li>OEM disabled content capture globally.
+     *   <li>Transient errors.
+     * </ul>
      */
     public boolean isContentCaptureEnabled() {
+        if (mService == null) return false;
+
+        final MainContentCaptureSession mainSession;
         synchronized (mLock) {
-            return mService != null && !mDisabled;
+            mainSession = mMainSession;
         }
+        // The main session is only set when the activity starts, so we need to return true until
+        // then.
+        if (mainSession != null && mainSession.isDisabled()) return false;
+
+        return true;
     }
 
     /**
@@ -182,12 +196,82 @@
      * it on {@link android.app.Activity#onCreate(android.os.Bundle, android.os.PersistableBundle)}.
      */
     public void setContentCaptureEnabled(boolean enabled) {
+        if (DEBUG) {
+            Log.d(TAG, "setContentCaptureEnabled(): setting to " + enabled + " for " + mContext);
+        }
+
         synchronized (mLock) {
             mFlags |= enabled ? 0 : ContentCaptureContext.FLAG_DISABLED_BY_APP;
         }
     }
 
     /**
+     * Gets whether Content Capture is enabled for the given user.
+     *
+     * <p>This method is typically used by the Content Capture Service settings page, so it can
+     * provide a toggle to enable / disable it.
+     *
+     * @throws SecurityException if caller is not the app that owns the Content Capture service
+     * associated with the user.
+     *
+     * @hide
+     */
+    @SystemApi
+    public boolean isContentCaptureFeatureEnabled() {
+        if (mService == null) return false;
+
+        final SyncResultReceiver resultReceiver = new SyncResultReceiver(SYNC_CALLS_TIMEOUT_MS);
+        final int resultCode;
+        try {
+            mService.isContentCaptureFeatureEnabled(resultReceiver);
+            resultCode = resultReceiver.getIntResult();
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+        switch (resultCode) {
+            case RESULT_CODE_TRUE:
+                return true;
+            case RESULT_CODE_FALSE:
+                return false;
+            case RESULT_CODE_NOT_SERVICE:
+                throw new SecurityException("caller is not user's ContentCapture service");
+            default:
+                throw new IllegalStateException("received invalid result: " + resultCode);
+        }
+    }
+
+    /**
+     * Sets whether Content Capture is enabled for the given user.
+     *
+     * @throws SecurityException if caller is not the app that owns the Content Capture service
+     * associated with the user.
+     *
+     * @hide
+     */
+    @SystemApi
+    public void setContentCaptureFeatureEnabled(boolean enabled) {
+        if (DEBUG) Log.d(TAG, "setContentCaptureFeatureEnabled(): setting to " + enabled);
+
+        final SyncResultReceiver resultReceiver = new SyncResultReceiver(SYNC_CALLS_TIMEOUT_MS);
+        final int resultCode;
+        try {
+            mService.setContentCaptureFeatureEnabled(enabled, resultReceiver);
+            resultCode = resultReceiver.getIntResult();
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+        switch (resultCode) {
+            case RESULT_CODE_TRUE:
+                // Our work is done here, in our void existance...
+                return;
+            case RESULT_CODE_NOT_SERVICE:
+                throw new SecurityException("caller is not user's ContentCapture service");
+            default:
+                throw new IllegalStateException("received invalid result: " + resultCode);
+        }
+    }
+
+    /**
      * Called by the app to request the Content Capture service to remove user-data associated with
      * some context.
      *
@@ -207,7 +291,8 @@
     public void dump(String prefix, PrintWriter pw) {
         synchronized (mLock) {
             pw.print(prefix); pw.println("ContentCaptureManager");
-            pw.print(prefix); pw.print("Disabled: "); pw.println(mDisabled);
+            pw.print(prefix); pw.print("isContentCaptureEnabled(): ");
+            pw.println(isContentCaptureEnabled());
             pw.print(prefix); pw.print("Context: "); pw.println(mContext);
             pw.print(prefix); pw.print("User: "); pw.println(mContext.getUserId());
             if (mService != null) {
@@ -223,14 +308,4 @@
             }
         }
     }
-
-
-    /** Retrieves the component name of the target content capture service through system_server. */
-    private void handleGetComponentName(@NonNull IResultReceiver resultReceiver) {
-        try {
-            mService.getServiceComponentName(resultReceiver);
-        } catch (RemoteException e) {
-            Log.w(TAG, "Unable to retrieve service component name: " + e);
-        }
-    }
 }
diff --git a/core/java/android/view/contentcapture/ContentCaptureSession.java b/core/java/android/view/contentcapture/ContentCaptureSession.java
index c425e7b..68a3e8a 100644
--- a/core/java/android/view/contentcapture/ContentCaptureSession.java
+++ b/core/java/android/view/contentcapture/ContentCaptureSession.java
@@ -54,7 +54,7 @@
      * @hide
      */
     // NOTE: not prefixed by STATE_ so it's not printed on getStateAsString()
-    public static final int UNKNWON_STATE = 0x0;
+    public static final int UNKNOWN_STATE = 0x0;
 
     /**
      * Service's startSession() was called, but server didn't confirm it was created yet.
@@ -99,7 +99,8 @@
     public static final int STATE_FLAG_SECURE = 0x20;
 
     /**
-     * Session is disabled manually by the specific app.
+     * Session is disabled manually by the specific app
+     * (through {@link ContentCaptureManager#setContentCaptureEnabled(boolean)}).
      *
      * @hide
      */
@@ -159,7 +160,7 @@
     @Nullable
     protected final String mId;
 
-    private int mState = UNKNWON_STATE;
+    private int mState = UNKNOWN_STATE;
 
     // Lazily created on demand.
     private ContentCaptureSessionId mContentCaptureSessionId;
@@ -349,10 +350,8 @@
      *
      * @param id of the node.
      * @param text new text.
-     * @param flags currently ignored.
      */
-    public final void notifyViewTextChanged(@NonNull AutofillId id, @Nullable CharSequence text,
-            int flags) {
+    public final void notifyViewTextChanged(@NonNull AutofillId id, @Nullable CharSequence text) {
         Preconditions.checkNotNull(id);
 
         if (!isContentCaptureEnabled()) return;
@@ -438,7 +437,7 @@
     /** @hide */
     @NonNull
     protected static String getStateAsString(int state) {
-        return state + " (" + (state == UNKNWON_STATE ? "UNKNOWN"
+        return state + " (" + (state == UNKNOWN_STATE ? "UNKNOWN"
                 : DebugUtils.flagsToString(ContentCaptureSession.class, "STATE_", state)) + ")";
     }
 
diff --git a/core/java/android/view/contentcapture/IContentCaptureManager.aidl b/core/java/android/view/contentcapture/IContentCaptureManager.aidl
index 56ed8bf..26cf34c 100644
--- a/core/java/android/view/contentcapture/IContentCaptureManager.aidl
+++ b/core/java/android/view/contentcapture/IContentCaptureManager.aidl
@@ -62,4 +62,14 @@
      * Requests the removal of user data for the calling user.
      */
     void removeUserData(in UserDataRemovalRequest request);
+
+    /**
+     * Returns whether the content capture feature is enabled for the calling user.
+     */
+    void isContentCaptureFeatureEnabled(in IResultReceiver result);
+
+    /**
+     * Sets whether the content capture feature is enabled for the given user.
+     */
+    void setContentCaptureFeatureEnabled(boolean enabled, in IResultReceiver result);
 }
diff --git a/core/java/android/view/contentcapture/MainContentCaptureSession.java b/core/java/android/view/contentcapture/MainContentCaptureSession.java
index 83dbf2d..034c8fa 100644
--- a/core/java/android/view/contentcapture/MainContentCaptureSession.java
+++ b/core/java/android/view/contentcapture/MainContentCaptureSession.java
@@ -89,21 +89,23 @@
      */
     public static final String EXTRA_BINDER = "binder";
 
-    // TODO(b/111276913): make sure disabled state is in sync with manager's disabled
     @NonNull
-    private final AtomicBoolean mDisabled;
+    private final AtomicBoolean mDisabled = new AtomicBoolean(false);
 
     @NonNull
     private final Context mContext;
 
     @NonNull
+    private final ContentCaptureManager mManager;
+
+    @NonNull
     private final Handler mHandler;
 
     /**
      * Interface to the system_server binder object - it's only used to start the session (and
      * notify when the session is finished).
      */
-    @Nullable
+    @Nullable // TODO(b/122959591): shoul never be null, we should make main session null instead
     private final IContentCaptureManager mSystemServerInterface;
 
     /**
@@ -115,7 +117,7 @@
     @Nullable
     private DeathRecipient mDirectServiceVulture;
 
-    private int mState = UNKNWON_STATE;
+    private int mState = UNKNOWN_STATE;
 
     @Nullable
     private IBinder mApplicationToken;
@@ -136,13 +138,13 @@
     private final LocalLog mFlushHistory = new LocalLog(10);
 
     /** @hide */
-    protected MainContentCaptureSession(@NonNull Context context, @NonNull Handler handler,
-            @Nullable IContentCaptureManager systemServerInterface,
-            @NonNull boolean disabled) {
+    protected MainContentCaptureSession(@NonNull Context context,
+            @NonNull ContentCaptureManager manager, @NonNull Handler handler,
+            @Nullable IContentCaptureManager systemServerInterface) {
         mContext = context;
+        mManager = manager;
         mHandler = handler;
         mSystemServerInterface = systemServerInterface;
-        mDisabled = new AtomicBoolean(disabled);
     }
 
     @Override
@@ -235,8 +237,8 @@
 
     /**
      * Callback from {@code system_server} after call to
-     * {@link IContentCaptureManager#startSession(int, IBinder, ComponentName, String,
-     * int, IResultReceiver)}.
+     * {@link IContentCaptureManager#startSession(IBinder, ComponentName, String, int,
+     * IResultReceiver)}
      *
      * @param resultCode session state
      * @param binder handle to {@code IContentCaptureDirectManager}
@@ -367,7 +369,7 @@
     }
 
     private boolean handleHasStarted() {
-        return mState != UNKNWON_STATE;
+        return mState != UNKNOWN_STATE;
     }
 
     private void handleScheduleFlush(@FlushReason int reason, boolean checkExisting) {
@@ -402,7 +404,7 @@
     }
 
     private void handleFlushIfNeeded(@FlushReason int reason) {
-        if (mEvents.isEmpty()) {
+        if (mEvents == null || mEvents.isEmpty()) {
             if (VERBOSE) Log.v(TAG, "Nothing to flush");
             return;
         }
@@ -517,8 +519,12 @@
 
     @Override
     boolean isContentCaptureEnabled() {
-        return super.isContentCaptureEnabled() && mSystemServerInterface != null
-                && !mDisabled.get();
+        return super.isContentCaptureEnabled() && mManager.isContentCaptureEnabled();
+    }
+
+    // Called by ContentCaptureManager.isContentCaptureEnabled
+    boolean isDisabled() {
+        return mDisabled.get();
     }
 
     // TODO(b/122454205): refactor "notifyXXXX" methods below to a common "Buffer" object that is
diff --git a/core/java/android/view/contentcapture/UserDataRemovalRequest.java b/core/java/android/view/contentcapture/UserDataRemovalRequest.java
index 8ee63ef..8fedcd5 100644
--- a/core/java/android/view/contentcapture/UserDataRemovalRequest.java
+++ b/core/java/android/view/contentcapture/UserDataRemovalRequest.java
@@ -16,7 +16,6 @@
 package android.view.contentcapture;
 
 import android.annotation.NonNull;
-import android.annotation.SystemApi;
 import android.app.ActivityThread;
 import android.net.Uri;
 import android.os.Parcel;
@@ -67,9 +66,7 @@
 
     /**
      * Gets the name of the app that's making the request.
-     * @hide
      */
-    @SystemApi
     @NonNull
     public String getPackageName() {
         return mPackageName;
@@ -77,20 +74,14 @@
 
     /**
      * Checks if app is requesting to remove all user data associated with its package.
-     *
-     * @hide
      */
-    @SystemApi
     public boolean isForEverything() {
         return mForEverything;
     }
 
     /**
      * Gets the list of {@code Uri}s the apps is requesting to remove.
-     *
-     * @hide
      */
-    @SystemApi
     @NonNull
     public List<UriRequest> getUriRequests() {
         return mUriRequests;
@@ -203,9 +194,7 @@
 
     /**
      * Representation of a request to remove data associated with an {@link Uri}.
-     * @hide
      */
-    @SystemApi
     public final class UriRequest {
         private final @NonNull Uri mUri;
         private final boolean mRecursive;
diff --git a/core/java/android/view/textclassifier/ExtrasUtils.java b/core/java/android/view/textclassifier/ExtrasUtils.java
new file mode 100644
index 0000000..602455c
--- /dev/null
+++ b/core/java/android/view/textclassifier/ExtrasUtils.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.textclassifier;
+
+import android.annotation.Nullable;
+import android.app.RemoteAction;
+import android.content.Intent;
+import android.os.Bundle;
+
+import java.util.ArrayList;
+
+/**
+ * Utility class for inserting and retrieving data in TextClassifier request/response extras.
+ * @hide
+ */
+public final class ExtrasUtils {
+
+    private static final String ACTIONS_INTENTS = "actions-intents";
+    private static final String FOREIGN_LANGUAGE = "foreign-language";
+    private static final String ENTITY_TYPE = "entity-type";
+    private static final String SCORE = "score";
+    private static final String MODEL_VERSION = "model-version";
+    private static final String MODEL_NAME = "model-name";
+
+    private ExtrasUtils() {}
+
+    /**
+     * Bundles and returns foreign language detection information for TextClassifier responses.
+     */
+    static Bundle createForeignLanguageExtra(
+            String language, float score, int modelVersion) {
+        final Bundle bundle = new Bundle();
+        bundle.putString(ENTITY_TYPE, language);
+        bundle.putFloat(SCORE, score);
+        bundle.putInt(MODEL_VERSION, modelVersion);
+        bundle.putString(MODEL_NAME, "langId_v" + modelVersion);
+        return bundle;
+    }
+
+    /**
+     * Stores {@code extra} as foreign language information in TextClassifier response object's
+     * extras {@code container}.
+     */
+    static void putForeignLanguageExtra(Bundle container, Bundle extra) {
+        container.putParcelable(FOREIGN_LANGUAGE, extra);
+    }
+
+    /**
+     * Returns foreign language detection information contained in the TextClassification object.
+     * responses.
+     */
+    @Nullable
+    public static Bundle getForeignLanguageExtra(TextClassification classification) {
+        return classification.getExtras().getBundle(FOREIGN_LANGUAGE);
+    }
+
+    /**
+     * Stores {@code actionIntents} information in TextClassifier response object's extras
+     * {@code container}.
+     */
+    static void putActionsIntents(Bundle container, ArrayList<Intent> actionsIntents) {
+        container.putParcelableArrayList(ACTIONS_INTENTS, actionsIntents);
+    }
+
+    /**
+     * Returns {@code actionIntents} information contained in the TextClassification object.
+     */
+    @Nullable
+    public static ArrayList<Intent> getActionsIntents(TextClassification classification) {
+        return classification.getExtras().getParcelableArrayList(ACTIONS_INTENTS);
+    }
+
+    /**
+     * Returns the first "translate" action found in the {@code classification} object.
+     */
+    @Nullable
+    public static RemoteAction findTranslateAction(TextClassification classification) {
+        final ArrayList<Intent> actionIntents = getActionsIntents(classification);
+        if (actionIntents != null) {
+            final int size = actionIntents.size();
+            for (int i = 0; i < size; i++) {
+                if (Intent.ACTION_TRANSLATE.equals(actionIntents.get(i).getAction())) {
+                    return classification.getActions().get(i);
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Returns the entity type contained in the {@code extra}.
+     */
+    @Nullable
+    public static String getEntityType(Bundle extra) {
+        return extra.getString(ENTITY_TYPE);
+    }
+
+    /**
+     * Returns the score contained in the {@code extra}.
+     */
+    @Nullable
+    public static float getScore(Bundle extra) {
+        return extra.getFloat(SCORE, -1);
+    }
+
+    /**
+     * Returns the model name contained in the {@code extra}.
+     */
+    @Nullable
+    public static String getModelName(Bundle extra) {
+        return extra.getString(MODEL_NAME);
+    }
+}
diff --git a/core/java/android/view/textclassifier/IntentFactory.java b/core/java/android/view/textclassifier/IntentFactory.java
new file mode 100644
index 0000000..d9c03c8
--- /dev/null
+++ b/core/java/android/view/textclassifier/IntentFactory.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.view.textclassifier;
+
+import android.annotation.Nullable;
+import android.content.Context;
+import android.content.Intent;
+
+import com.google.android.textclassifier.AnnotatorModel;
+
+import java.time.Instant;
+import java.util.List;
+
+/**
+ * @hide
+ */
+public interface IntentFactory {
+
+    /**
+     * Return a list of LabeledIntent from the classification result.
+     */
+    List<TextClassifierImpl.LabeledIntent> create(
+            Context context,
+            String text,
+            boolean foreignText,
+            @Nullable Instant referenceTime,
+            @Nullable AnnotatorModel.ClassificationResult classification);
+
+    /**
+     * Inserts translate action to the list if it is a foreign text.
+     */
+    static void insertTranslateAction(
+            List<TextClassifierImpl.LabeledIntent> actions, Context context, String text) {
+        actions.add(new TextClassifierImpl.LabeledIntent(
+                context.getString(com.android.internal.R.string.translate),
+                context.getString(com.android.internal.R.string.translate_desc),
+                new Intent(Intent.ACTION_TRANSLATE)
+                        // TODO: Probably better to introduce a "translate" scheme instead of
+                        // using EXTRA_TEXT.
+                        .putExtra(Intent.EXTRA_TEXT, text),
+                text.hashCode()));
+    }
+}
diff --git a/core/java/android/view/textclassifier/LegacyIntentFactory.java b/core/java/android/view/textclassifier/LegacyIntentFactory.java
new file mode 100644
index 0000000..b6e5b3e2
--- /dev/null
+++ b/core/java/android/view/textclassifier/LegacyIntentFactory.java
@@ -0,0 +1,260 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.view.textclassifier;
+
+import static java.time.temporal.ChronoUnit.MILLIS;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.SearchManager;
+import android.content.ContentUris;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.UserManager;
+import android.provider.Browser;
+import android.provider.CalendarContract;
+import android.provider.ContactsContract;
+import android.view.textclassifier.TextClassifierImpl.LabeledIntent;
+
+import com.google.android.textclassifier.AnnotatorModel;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Creates intents based on the classification type.
+ * @hide
+ */
+public final class LegacyIntentFactory implements IntentFactory {
+
+    private static final String TAG = "LegacyIntentFactory";
+    private static final long MIN_EVENT_FUTURE_MILLIS = TimeUnit.MINUTES.toMillis(5);
+    private static final long DEFAULT_EVENT_DURATION = TimeUnit.HOURS.toMillis(1);
+
+    public LegacyIntentFactory() {}
+
+    @NonNull
+    @Override
+    public List<LabeledIntent> create(Context context, String text, boolean foreignText,
+            @Nullable Instant referenceTime,
+            AnnotatorModel.ClassificationResult classification) {
+        final String type = classification != null
+                ? classification.getCollection().trim().toLowerCase(Locale.ENGLISH)
+                : "";
+        text = text.trim();
+        final List<LabeledIntent> actions;
+        switch (type) {
+            case TextClassifier.TYPE_EMAIL:
+                actions = createForEmail(context, text);
+                break;
+            case TextClassifier.TYPE_PHONE:
+                actions = createForPhone(context, text);
+                break;
+            case TextClassifier.TYPE_ADDRESS:
+                actions = createForAddress(context, text);
+                break;
+            case TextClassifier.TYPE_URL:
+                actions = createForUrl(context, text);
+                break;
+            case TextClassifier.TYPE_DATE:  // fall through
+            case TextClassifier.TYPE_DATE_TIME:
+                if (classification.getDatetimeResult() != null) {
+                    final Instant parsedTime = Instant.ofEpochMilli(
+                            classification.getDatetimeResult().getTimeMsUtc());
+                    actions = createForDatetime(context, type, referenceTime, parsedTime);
+                } else {
+                    actions = new ArrayList<>();
+                }
+                break;
+            case TextClassifier.TYPE_FLIGHT_NUMBER:
+                actions = createForFlight(context, text);
+                break;
+            case TextClassifier.TYPE_DICTIONARY:
+                actions = createForDictionary(context, text);
+                break;
+            default:
+                actions = new ArrayList<>();
+                break;
+        }
+        if (foreignText) {
+            IntentFactory.insertTranslateAction(actions, context, text);
+        }
+        actions.forEach(
+                action -> action.getIntent()
+                        .putExtra(TextClassifier.EXTRA_FROM_TEXT_CLASSIFIER, true));
+        return actions;
+    }
+
+    @NonNull
+    private static List<LabeledIntent> createForEmail(Context context, String text) {
+        final List<LabeledIntent> actions = new ArrayList<>();
+        actions.add(new LabeledIntent(
+                context.getString(com.android.internal.R.string.email),
+                context.getString(com.android.internal.R.string.email_desc),
+                new Intent(Intent.ACTION_SENDTO)
+                        .setData(Uri.parse(String.format("mailto:%s", text))),
+                LabeledIntent.DEFAULT_REQUEST_CODE));
+        actions.add(new LabeledIntent(
+                context.getString(com.android.internal.R.string.add_contact),
+                context.getString(com.android.internal.R.string.add_contact_desc),
+                new Intent(Intent.ACTION_INSERT_OR_EDIT)
+                        .setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE)
+                        .putExtra(ContactsContract.Intents.Insert.EMAIL, text),
+                text.hashCode()));
+        return actions;
+    }
+
+    @NonNull
+    private static List<LabeledIntent> createForPhone(Context context, String text) {
+        final List<LabeledIntent> actions = new ArrayList<>();
+        final UserManager userManager = context.getSystemService(UserManager.class);
+        final Bundle userRestrictions = userManager != null
+                ? userManager.getUserRestrictions() : new Bundle();
+        if (!userRestrictions.getBoolean(UserManager.DISALLOW_OUTGOING_CALLS, false)) {
+            actions.add(new LabeledIntent(
+                    context.getString(com.android.internal.R.string.dial),
+                    context.getString(com.android.internal.R.string.dial_desc),
+                    new Intent(Intent.ACTION_DIAL).setData(
+                            Uri.parse(String.format("tel:%s", text))),
+                    LabeledIntent.DEFAULT_REQUEST_CODE));
+        }
+        actions.add(new LabeledIntent(
+                context.getString(com.android.internal.R.string.add_contact),
+                context.getString(com.android.internal.R.string.add_contact_desc),
+                new Intent(Intent.ACTION_INSERT_OR_EDIT)
+                        .setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE)
+                        .putExtra(ContactsContract.Intents.Insert.PHONE, text),
+                text.hashCode()));
+        if (!userRestrictions.getBoolean(UserManager.DISALLOW_SMS, false)) {
+            actions.add(new LabeledIntent(
+                    context.getString(com.android.internal.R.string.sms),
+                    context.getString(com.android.internal.R.string.sms_desc),
+                    new Intent(Intent.ACTION_SENDTO)
+                            .setData(Uri.parse(String.format("smsto:%s", text))),
+                    LabeledIntent.DEFAULT_REQUEST_CODE));
+        }
+        return actions;
+    }
+
+    @NonNull
+    private static List<LabeledIntent> createForAddress(Context context, String text) {
+        final List<LabeledIntent> actions = new ArrayList<>();
+        try {
+            final String encText = URLEncoder.encode(text, "UTF-8");
+            actions.add(new LabeledIntent(
+                    context.getString(com.android.internal.R.string.map),
+                    context.getString(com.android.internal.R.string.map_desc),
+                    new Intent(Intent.ACTION_VIEW)
+                            .setData(Uri.parse(String.format("geo:0,0?q=%s", encText))),
+                    LabeledIntent.DEFAULT_REQUEST_CODE));
+        } catch (UnsupportedEncodingException e) {
+            Log.e(TAG, "Could not encode address", e);
+        }
+        return actions;
+    }
+
+    @NonNull
+    private static List<LabeledIntent> createForUrl(Context context, String text) {
+        if (Uri.parse(text).getScheme() == null) {
+            text = "http://" + text;
+        }
+        final List<LabeledIntent> actions = new ArrayList<>();
+        actions.add(new LabeledIntent(
+                context.getString(com.android.internal.R.string.browse),
+                context.getString(com.android.internal.R.string.browse_desc),
+                new Intent(Intent.ACTION_VIEW, Uri.parse(text))
+                        .putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName()),
+                LabeledIntent.DEFAULT_REQUEST_CODE));
+        return actions;
+    }
+
+    @NonNull
+    private static List<LabeledIntent> createForDatetime(
+            Context context, String type, @Nullable Instant referenceTime,
+            Instant parsedTime) {
+        if (referenceTime == null) {
+            // If no reference time was given, use now.
+            referenceTime = Instant.now();
+        }
+        List<LabeledIntent> actions = new ArrayList<>();
+        actions.add(createCalendarViewIntent(context, parsedTime));
+        final long millisUntilEvent = referenceTime.until(parsedTime, MILLIS);
+        if (millisUntilEvent > MIN_EVENT_FUTURE_MILLIS) {
+            actions.add(createCalendarCreateEventIntent(context, parsedTime, type));
+        }
+        return actions;
+    }
+
+    @NonNull
+    private static List<LabeledIntent> createForFlight(Context context, String text) {
+        final List<LabeledIntent> actions = new ArrayList<>();
+        actions.add(new LabeledIntent(
+                context.getString(com.android.internal.R.string.view_flight),
+                context.getString(com.android.internal.R.string.view_flight_desc),
+                new Intent(Intent.ACTION_WEB_SEARCH)
+                        .putExtra(SearchManager.QUERY, text),
+                text.hashCode()));
+        return actions;
+    }
+
+    @NonNull
+    private static LabeledIntent createCalendarViewIntent(Context context, Instant parsedTime) {
+        Uri.Builder builder = CalendarContract.CONTENT_URI.buildUpon();
+        builder.appendPath("time");
+        ContentUris.appendId(builder, parsedTime.toEpochMilli());
+        return new LabeledIntent(
+                context.getString(com.android.internal.R.string.view_calendar),
+                context.getString(com.android.internal.R.string.view_calendar_desc),
+                new Intent(Intent.ACTION_VIEW).setData(builder.build()),
+                LabeledIntent.DEFAULT_REQUEST_CODE);
+    }
+
+    @NonNull
+    private static LabeledIntent createCalendarCreateEventIntent(
+            Context context, Instant parsedTime, @TextClassifier.EntityType String type) {
+        final boolean isAllDay = TextClassifier.TYPE_DATE.equals(type);
+        return new LabeledIntent(
+                context.getString(com.android.internal.R.string.add_calendar_event),
+                context.getString(com.android.internal.R.string.add_calendar_event_desc),
+                new Intent(Intent.ACTION_INSERT)
+                        .setData(CalendarContract.Events.CONTENT_URI)
+                        .putExtra(CalendarContract.EXTRA_EVENT_ALL_DAY, isAllDay)
+                        .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME,
+                                parsedTime.toEpochMilli())
+                        .putExtra(CalendarContract.EXTRA_EVENT_END_TIME,
+                                parsedTime.toEpochMilli() + DEFAULT_EVENT_DURATION),
+                parsedTime.hashCode());
+    }
+
+    @NonNull
+    private static List<LabeledIntent> createForDictionary(Context context, String text) {
+        final List<LabeledIntent> actions = new ArrayList<>();
+        actions.add(new LabeledIntent(
+                context.getString(com.android.internal.R.string.define),
+                context.getString(com.android.internal.R.string.define_desc),
+                new Intent(Intent.ACTION_DEFINE)
+                        .putExtra(Intent.EXTRA_TEXT, text),
+                text.hashCode()));
+        return actions;
+    }
+}
diff --git a/core/java/android/view/textclassifier/TemplateIntentFactory.java b/core/java/android/view/textclassifier/TemplateIntentFactory.java
new file mode 100644
index 0000000..97e11bb
--- /dev/null
+++ b/core/java/android/view/textclassifier/TemplateIntentFactory.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.view.textclassifier;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.text.TextUtils;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.ArrayUtils;
+import com.android.internal.util.Preconditions;
+
+import com.google.android.textclassifier.AnnotatorModel;
+import com.google.android.textclassifier.NamedVariant;
+import com.google.android.textclassifier.RemoteActionTemplate;
+
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Creates intents based on {@link RemoteActionTemplate} objects.
+ * @hide
+ */
+@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+public final class TemplateIntentFactory implements IntentFactory {
+    private static final String TAG = TextClassifier.DEFAULT_LOG_TAG;
+    private final IntentFactory mFallback;
+
+    public TemplateIntentFactory(IntentFactory fallback) {
+        mFallback = Preconditions.checkNotNull(fallback);
+    }
+
+    /**
+     * Returns a list of {@link android.view.textclassifier.TextClassifierImpl.LabeledIntent}
+     * that are constructed from the classification result.
+     */
+    @NonNull
+    @Override
+    public List<TextClassifierImpl.LabeledIntent> create(
+            Context context,
+            String text,
+            boolean foreignText,
+            @Nullable Instant referenceTime,
+            @Nullable AnnotatorModel.ClassificationResult classification) {
+        if (classification == null) {
+            return Collections.emptyList();
+        }
+        RemoteActionTemplate[] remoteActionTemplates = classification.getRemoteActionTemplates();
+        if (ArrayUtils.isEmpty(remoteActionTemplates)) {
+            // RemoteActionTemplate is missing, fallback.
+            Log.w(TAG, "RemoteActionTemplate is missing, fallback to LegacyIntentFactory.");
+            return mFallback.create(context, text, foreignText, referenceTime, classification);
+        }
+        final List<TextClassifierImpl.LabeledIntent> labeledIntents =
+                new ArrayList<>(createFromRemoteActionTemplates(remoteActionTemplates));
+        if (foreignText) {
+            IntentFactory.insertTranslateAction(labeledIntents, context, text.trim());
+        }
+        labeledIntents.forEach(
+                action -> action.getIntent()
+                        .putExtra(TextClassifier.EXTRA_FROM_TEXT_CLASSIFIER, true));
+        return labeledIntents;
+    }
+
+    private static List<TextClassifierImpl.LabeledIntent> createFromRemoteActionTemplates(
+            RemoteActionTemplate[] remoteActionTemplates) {
+        final List<TextClassifierImpl.LabeledIntent> labeledIntents = new ArrayList<>();
+        for (RemoteActionTemplate remoteActionTemplate : remoteActionTemplates) {
+            Intent intent = createIntent(remoteActionTemplate);
+            if (intent == null) {
+                continue;
+            }
+            TextClassifierImpl.LabeledIntent
+                    labeledIntent = new TextClassifierImpl.LabeledIntent(
+                    remoteActionTemplate.title,
+                    remoteActionTemplate.description,
+                    intent,
+                    remoteActionTemplate.requestCode == null
+                            ? TextClassifierImpl.LabeledIntent.DEFAULT_REQUEST_CODE
+                            : remoteActionTemplate.requestCode
+            );
+            labeledIntents.add(labeledIntent);
+        }
+        return labeledIntents;
+    }
+
+    @Nullable
+    private static Intent createIntent(RemoteActionTemplate remoteActionTemplate) {
+        Intent intent = new Intent();
+        if (!TextUtils.isEmpty(remoteActionTemplate.packageName)) {
+            Log.w(TAG, "A RemoteActionTemplate is skipped as package name is set.");
+            return null;
+        }
+        if (!TextUtils.isEmpty(remoteActionTemplate.action)) {
+            intent.setAction(remoteActionTemplate.action);
+        }
+        Uri data = null;
+        if (!TextUtils.isEmpty(remoteActionTemplate.data)) {
+            data = Uri.parse(remoteActionTemplate.data);
+        }
+        if (data != null || !TextUtils.isEmpty(remoteActionTemplate.type)) {
+            intent.setDataAndType(data, remoteActionTemplate.type);
+        }
+        if (remoteActionTemplate.flags != null) {
+            intent.setFlags(remoteActionTemplate.flags);
+        }
+        if (remoteActionTemplate.category != null) {
+            for (String category : remoteActionTemplate.category) {
+                intent.addCategory(category);
+            }
+        }
+        intent.putExtras(createExtras(remoteActionTemplate.extras));
+        return intent;
+    }
+
+    private static Bundle createExtras(NamedVariant[] namedVariants) {
+        if (namedVariants == null) {
+            return Bundle.EMPTY;
+        }
+        Bundle bundle = new Bundle();
+        for (NamedVariant namedVariant : namedVariants) {
+            switch (namedVariant.getType()) {
+                case NamedVariant.TYPE_INT:
+                    bundle.putInt(namedVariant.getName(), namedVariant.getInt());
+                    break;
+                case NamedVariant.TYPE_LONG:
+                    bundle.putLong(namedVariant.getName(), namedVariant.getLong());
+                    break;
+                case NamedVariant.TYPE_FLOAT:
+                    bundle.putFloat(namedVariant.getName(), namedVariant.getFloat());
+                    break;
+                case NamedVariant.TYPE_DOUBLE:
+                    bundle.putDouble(namedVariant.getName(), namedVariant.getDouble());
+                    break;
+                case NamedVariant.TYPE_BOOL:
+                    bundle.putBoolean(namedVariant.getName(), namedVariant.getBool());
+                    break;
+                case NamedVariant.TYPE_STRING:
+                    bundle.putString(namedVariant.getName(), namedVariant.getString());
+                    break;
+                default:
+                    Log.w(TAG,
+                            "Unsupported type found in createExtras : " + namedVariant.getType());
+            }
+        }
+        return bundle;
+    }
+}
diff --git a/core/java/android/view/textclassifier/TextClassification.java b/core/java/android/view/textclassifier/TextClassification.java
index d9f7965..a059209 100644
--- a/core/java/android/view/textclassifier/TextClassification.java
+++ b/core/java/android/view/textclassifier/TextClassification.java
@@ -378,6 +378,8 @@
         @Nullable private OnClickListener mLegacyOnClickListener;
         @Nullable private String mId;
         @Nullable private Bundle mExtras;
+        @NonNull private final ArrayList<Intent> mActionIntents = new ArrayList<>();
+        @Nullable private Bundle mForeignLanguageExtra;
 
         /**
          * Sets the classified text.
@@ -412,8 +414,19 @@
          */
         @NonNull
         public Builder addAction(@NonNull RemoteAction action) {
+            return addAction(action, null);
+        }
+
+        /**
+         * @param intent the intent in the remote action.
+         * @see #addAction(RemoteAction)
+         * @hide
+         */
+        @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+        public Builder addAction(RemoteAction action, @Nullable Intent intent) {
             Preconditions.checkArgument(action != null);
             mActions.add(action);
+            mActionIntents.add(intent);
             return this;
         }
 
@@ -499,13 +512,33 @@
         }
 
         /**
+         * @see #setExtras(Bundle)
+         * @hide
+         */
+        @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+        public Builder setForeignLanguageExtra(@Nullable Bundle extra) {
+            mForeignLanguageExtra = extra;
+            return this;
+        }
+
+        /**
          * Builds and returns a {@link TextClassification} object.
          */
         @NonNull
         public TextClassification build() {
             return new TextClassification(mText, mLegacyIcon, mLegacyLabel, mLegacyIntent,
-                    mLegacyOnClickListener, mActions, mEntityConfidence, mId,
-                    mExtras == null ? Bundle.EMPTY : mExtras.deepCopy());
+                    mLegacyOnClickListener, mActions, mEntityConfidence, mId, buildExtras());
+        }
+
+        private Bundle buildExtras() {
+            final Bundle extras = mExtras == null ? new Bundle() : mExtras.deepCopy();
+            if (!mActionIntents.isEmpty()) {
+                ExtrasUtils.putActionsIntents(extras, mActionIntents);
+            }
+            if (mForeignLanguageExtra != null) {
+                ExtrasUtils.putForeignLanguageExtra(extras, mForeignLanguageExtra);
+            }
+            return extras.isEmpty() ? Bundle.EMPTY : extras;
         }
     }
 
diff --git a/core/java/android/view/textclassifier/TextClassificationConstants.java b/core/java/android/view/textclassifier/TextClassificationConstants.java
index 7f928f7..ee9e04e 100644
--- a/core/java/android/view/textclassifier/TextClassificationConstants.java
+++ b/core/java/android/view/textclassifier/TextClassificationConstants.java
@@ -47,6 +47,7 @@
  * entity_list_not_editable                 (String[])
  * entity_list_editable                     (String[])
  * lang_id_threshold_override               (float)
+ * template_intent_factory_enabled          (boolean)
  * </pre>
  *
  * <p>
@@ -97,6 +98,7 @@
             "notification_conversation_action_types_default";
     private static final String LANG_ID_THRESHOLD_OVERRIDE =
             "lang_id_threshold_override";
+    private static final String TEMPLATE_INTENT_FACTORY_ENABLED = "template_intent_factory_enabled";
 
     private static final boolean LOCAL_TEXT_CLASSIFIER_ENABLED_DEFAULT = true;
     private static final boolean SYSTEM_TEXT_CLASSIFIER_ENABLED_DEFAULT = true;
@@ -137,6 +139,7 @@
      * @see EntityConfidence
      */
     private static final float LANG_ID_THRESHOLD_OVERRIDE_DEFAULT = -1f;
+    private static final boolean TEMPLATE_INTENT_FACTORY_ENABLED_DEFAULT = true;
 
     private final boolean mSystemTextClassifierEnabled;
     private final boolean mLocalTextClassifierEnabled;
@@ -155,6 +158,7 @@
     private final List<String> mInAppConversationActionTypesDefault;
     private final List<String> mNotificationConversationActionTypesDefault;
     private final float mLangIdThresholdOverride;
+    private final boolean mTemplateIntentFactoryEnabled;
 
     private TextClassificationConstants(@Nullable String settings) {
         final KeyValueListParser parser = new KeyValueListParser(',');
@@ -215,6 +219,8 @@
         mLangIdThresholdOverride = parser.getFloat(
                 LANG_ID_THRESHOLD_OVERRIDE,
                 LANG_ID_THRESHOLD_OVERRIDE_DEFAULT);
+        mTemplateIntentFactoryEnabled = parser.getBoolean(
+                TEMPLATE_INTENT_FACTORY_ENABLED, TEMPLATE_INTENT_FACTORY_ENABLED_DEFAULT);
     }
 
     /** Load from a settings string. */
@@ -290,6 +296,10 @@
         return mLangIdThresholdOverride;
     }
 
+    public boolean isTemplateIntentFactoryEnabled() {
+        return mTemplateIntentFactoryEnabled;
+    }
+
     private static List<String> parseStringList(String listStr) {
         return Collections.unmodifiableList(Arrays.asList(listStr.split(STRING_LIST_DELIMITER)));
     }
@@ -315,6 +325,7 @@
         pw.printPair("getNotificationConversationActionTypes",
                 mNotificationConversationActionTypesDefault);
         pw.printPair("getLangIdThresholdOverride", mLangIdThresholdOverride);
+        pw.printPair("isTemplateIntentFactoryEnabled", mTemplateIntentFactoryEnabled);
         pw.decreaseIndent();
         pw.println();
     }
diff --git a/core/java/android/view/textclassifier/TextClassificationSession.java b/core/java/android/view/textclassifier/TextClassificationSession.java
index 45668c0..ba1287f 100644
--- a/core/java/android/view/textclassifier/TextClassificationSession.java
+++ b/core/java/android/view/textclassifier/TextClassificationSession.java
@@ -71,10 +71,23 @@
 
     @Override
     public void onSelectionEvent(SelectionEvent event) {
-        checkDestroyed();
-        Preconditions.checkNotNull(event);
-        if (mEventHelper.sanitizeEvent(event)) {
-            mDelegate.onSelectionEvent(event);
+        try {
+            if (mEventHelper.sanitizeEvent(event)) {
+                mDelegate.onSelectionEvent(event);
+            }
+        } catch (Exception e) {
+            // Avoid crashing for event reporting.
+            Log.e(LOG_TAG, "Error reporting text classifier selection event", e);
+        }
+    }
+
+    @Override
+    public void onTextClassifierEvent(TextClassifierEvent event) {
+        try {
+            mDelegate.onTextClassifierEvent(event);
+        } catch (Exception e) {
+            // Avoid crashing for event reporting.
+            Log.e(LOG_TAG, "Error reporting text classifier event", e);
         }
     }
 
diff --git a/core/java/android/view/textclassifier/TextClassifier.java b/core/java/android/view/textclassifier/TextClassifier.java
index 5a56136..e010155 100644
--- a/core/java/android/view/textclassifier/TextClassifier.java
+++ b/core/java/android/view/textclassifier/TextClassifier.java
@@ -161,12 +161,18 @@
      * No-op TextClassifier.
      * This may be used to turn off TextClassifier features.
      */
-    TextClassifier NO_OP = new TextClassifier() {};
+    TextClassifier NO_OP = new TextClassifier() {
+        @Override
+        public String toString() {
+            return "TextClassifier.NO_OP";
+        }
+    };
 
     /**
-     * Used as a boolean value to indicate the intent is generated by TextClassifier.
+     * Extra that is included on activity intents coming from a TextClassifier when
+     * it suggests actions to its caller.
      * <p>
-     * All {@link TextClassifier} implementations should set this boolean extra to be true in their
+     * All {@link TextClassifier} implementations should make sure this extra exists in their
      * generated intents.
      */
     String EXTRA_FROM_TEXT_CLASSIFIER = "android.view.textclassifier.extra.FROM_TEXT_CLASSIFIER";
diff --git a/core/java/android/view/textclassifier/TextClassifierEvent.java b/core/java/android/view/textclassifier/TextClassifierEvent.java
index cd13cc0..0d4338b 100644
--- a/core/java/android/view/textclassifier/TextClassifierEvent.java
+++ b/core/java/android/view/textclassifier/TextClassifierEvent.java
@@ -141,6 +141,8 @@
     @Nullable private final String mLanguage;
     private final float mScore;
 
+    @Nullable private final String mModelName;
+
     private TextClassifierEvent(
             int eventCategory,
             int eventType,
@@ -156,7 +158,8 @@
             int relativeSuggestedWordEndIndex,
             int[] actionIndex,
             String language,
-            float score) {
+            float score,
+            String modelVersion) {
         mEventCategory = eventCategory;
         mEventType = eventType;
         mEntityTypes = entityTypes;
@@ -172,6 +175,7 @@
         mActionIndices = actionIndex;
         mLanguage = language;
         mScore = score;
+        mModelName = modelVersion;
     }
 
     @Override
@@ -196,6 +200,7 @@
         dest.writeIntArray(mActionIndices);
         dest.writeString(mLanguage);
         dest.writeFloat(mScore);
+        dest.writeString(mModelName);
     }
 
     private static TextClassifierEvent readFromParcel(Parcel in) {
@@ -214,7 +219,8 @@
                 /* relativeSuggestedWordEndIndex= */ in.readInt(),
                 /* actionIndices= */ in.createIntArray(),
                 /* language= */ in.readString(),
-                /* score= */ in.readFloat());
+                /* score= */ in.readFloat(),
+                /* modelVersion= */ in.readString());
     }
 
     /**
@@ -264,6 +270,7 @@
         return mEventIndex;
     }
 
+    // TODO: Remove this API.
     /**
      * Returns the time this event occurred. This is the number of milliseconds since
      * January 1, 1970, 00:00:00 GMT. 0 indicates not set.
@@ -339,6 +346,15 @@
     }
 
     /**
+     * Returns the model name.
+     * @hide
+     */
+    @Nullable
+    public String getModelName() {
+        return mModelName;
+    }
+
+    /**
      * Builder to build a text classifier event.
      */
     public static final class Builder {
@@ -359,6 +375,8 @@
         @Nullable private String mLanguage;
         private float mScore;
 
+        private String mModelName;
+
         /**
          * Creates a builder for building {@link TextClassifierEvent}s.
          *
@@ -407,6 +425,7 @@
             return this;
         }
 
+        // TODO: Remove this API.
         /**
          * Sets the time this event occurred. This is the number of milliseconds since
          * January 1, 1970, 00:00:00 GMT. 0 indicates not set.
@@ -501,6 +520,15 @@
         }
 
         /**
+         * Sets the model name string.
+         * @hide
+         */
+        public Builder setModelName(@Nullable String modelVersion) {
+            mModelName = modelVersion;
+            return this;
+        }
+
+        /**
          * Builds and returns a text classifier event.
          */
         @NonNull
@@ -521,7 +549,8 @@
                     mRelativeSuggestedWordEndIndex,
                     mActionIndices,
                     mLanguage,
-                    mScore);
+                    mScore,
+                    mModelName);
         }
         // TODO: Add build(boolean validate).
     }
@@ -544,6 +573,7 @@
         out.append(", mActionIndices=").append(Arrays.toString(mActionIndices));
         out.append(", mLanguage=").append(mLanguage);
         out.append(", mScore=").append(mScore);
+        out.append(", mModelName=").append(mModelName);
         out.append("}");
         return out.toString();
     }
diff --git a/core/java/android/view/textclassifier/TextClassifierEventTronLogger.java b/core/java/android/view/textclassifier/TextClassifierEventTronLogger.java
index 5563dfc..6a12250 100644
--- a/core/java/android/view/textclassifier/TextClassifierEventTronLogger.java
+++ b/core/java/android/view/textclassifier/TextClassifierEventTronLogger.java
@@ -16,7 +16,6 @@
 package android.view.textclassifier;
 
 import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXTCLASSIFIER_MODEL;
-import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_EVENT_TIME;
 import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_FIRST_ENTITY_TYPE;
 import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_SCORE;
 import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_SECOND_ENTITY_TYPE;
@@ -46,7 +45,7 @@
     private final MetricsLogger mMetricsLogger;
 
     public TextClassifierEventTronLogger() {
-        mMetricsLogger = new MetricsLogger();
+        this(new MetricsLogger());
     }
 
     @VisibleForTesting
@@ -57,6 +56,7 @@
     /** Emits a text classifier event to the logs. */
     public void writeEvent(TextClassifierEvent event) {
         Preconditions.checkNotNull(event);
+
         int category = getCategory(event);
         if (category == -1) {
             Log.w(TAG, "Unknown category: " + event.getEventCategory());
@@ -65,14 +65,12 @@
         final LogMaker log = new LogMaker(category)
                 .setSubtype(getLogType(event))
                 .addTaggedData(FIELD_TEXT_CLASSIFIER_SESSION_ID, event.getResultId())
-                .addTaggedData(FIELD_TEXT_CLASSIFIER_EVENT_TIME, event.getEventTime())
-                .addTaggedData(FIELD_TEXTCLASSIFIER_MODEL,
-                        SelectionSessionLogger.SignatureParser.getModelName(event.getResultId()))
+                .addTaggedData(FIELD_TEXTCLASSIFIER_MODEL, getModelName(event))
                 .addTaggedData(FIELD_TEXT_CLASSIFIER_SCORE, event.getScore());
 
         String[] entityTypes = event.getEntityTypes();
-        // TRON does not support a field of list type, and thus workaround by store them
-        // in three separate fields. This is no longer an issue once we have moved to Westworld.
+        // The old logger does not support a field of list type, and thus workaround by store them
+        // in three separate fields. This is not an issue with the new logger.
         if (entityTypes.length >= 1) {
             log.addTaggedData(FIELD_TEXT_CLASSIFIER_FIRST_ENTITY_TYPE, entityTypes[0]);
         }
@@ -93,6 +91,13 @@
         debugLog(log);
     }
 
+    private static String getModelName(TextClassifierEvent event) {
+        if (event.getModelName() != null) {
+            return event.getModelName();
+        }
+        return SelectionSessionLogger.SignatureParser.getModelName(event.getResultId());
+    }
+
     private static int getCategory(TextClassifierEvent event) {
         switch (event.getEventCategory()) {
             case TextClassifierEvent.CATEGORY_CONVERSATION_ACTIONS:
diff --git a/core/java/android/view/textclassifier/TextClassifierImpl.java b/core/java/android/view/textclassifier/TextClassifierImpl.java
index 7782079..14afa33 100644
--- a/core/java/android/view/textclassifier/TextClassifierImpl.java
+++ b/core/java/android/view/textclassifier/TextClassifierImpl.java
@@ -16,30 +16,21 @@
 
 package android.view.textclassifier;
 
-import static java.time.temporal.ChronoUnit.MILLIS;
-
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.WorkerThread;
 import android.app.PendingIntent;
 import android.app.RemoteAction;
-import android.app.SearchManager;
 import android.content.ComponentName;
-import android.content.ContentUris;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.graphics.drawable.Icon;
 import android.icu.util.ULocale;
-import android.net.Uri;
 import android.os.Bundle;
 import android.os.LocaleList;
 import android.os.ParcelFileDescriptor;
-import android.os.UserManager;
-import android.provider.Browser;
-import android.provider.CalendarContract;
-import android.provider.ContactsContract;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
@@ -53,19 +44,15 @@
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
 import java.time.Instant;
 import java.time.ZonedDateTime;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Objects;
-import java.util.concurrent.TimeUnit;
 
 /**
  * Default implementation of the {@link TextClassifier} interface.
@@ -78,9 +65,6 @@
  */
 public final class TextClassifierImpl implements TextClassifier {
 
-    /** @hide */
-    public static final String ACTIONS_INTENTS = "actions-intents";
-
     private static final String LOG_TAG = DEFAULT_LOG_TAG;
 
     private static final boolean DEBUG = false;
@@ -128,6 +112,8 @@
     private final ModelFileManager mLangIdModelFileManager;
     private final ModelFileManager mActionsModelFileManager;
 
+    private final IntentFactory mIntentFactory;
+
     public TextClassifierImpl(
             Context context, TextClassificationConstants settings, TextClassifier fallback) {
         mContext = Preconditions.checkNotNull(context);
@@ -155,6 +141,10 @@
                         UPDATED_ACTIONS_MODEL,
                         ActionsSuggestionsModel::getVersion,
                         ActionsSuggestionsModel::getLocales));
+
+        mIntentFactory = mSettings.isTemplateIntentFactoryEnabled()
+                ? new TemplateIntentFactory(new LegacyIntentFactory())
+                : new LegacyIntentFactory();
     }
 
     public TextClassifierImpl(Context context, TextClassificationConstants settings) {
@@ -198,7 +188,8 @@
                                     new AnnotatorModel.ClassificationOptions(
                                             refTime.toInstant().toEpochMilli(),
                                             refTime.getZone().getId(),
-                                            localesString));
+                                            localesString),
+                                    mContext);
                     final int size = results.length;
                     for (int i = 0; i < size; i++) {
                         tsBuilder.setEntityType(results[i].getCollection(), results[i].getScore());
@@ -241,7 +232,8 @@
                                         new AnnotatorModel.ClassificationOptions(
                                                 refTime.toInstant().toEpochMilli(),
                                                 refTime.getZone().getId(),
-                                                localesString));
+                                                localesString),
+                                        mContext);
                 if (results.length > 0) {
                     return createClassificationResult(
                             results, string,
@@ -348,7 +340,11 @@
         if (DEBUG) {
             Log.d(DEFAULT_LOG_TAG, "onTextClassifierEvent() called with: event = [" + event + "]");
         }
-        mTextClassifierEventTronLogger.writeEvent(event);
+        try {
+            mTextClassifierEventTronLogger.writeEvent(event);
+        } catch (Exception e) {
+            Log.e(LOG_TAG, "Error writing event", e);
+        }
     }
 
     /** @inheritDoc */
@@ -560,8 +556,9 @@
         AnnotatorModel.ClassificationResult highestScoringResult =
                 typeCount > 0 ? classifications[0] : null;
         for (int i = 0; i < typeCount; i++) {
-            builder.setEntityType(classifications[i].getCollection(),
-                                  classifications[i].getScore());
+            builder.setEntityType(
+                    classifications[i].getCollection(),
+                    classifications[i].getScore());
             if (classifications[i].getScore() > highestScoringResult.getScore()) {
                 highestScoringResult = classifications[i];
             }
@@ -570,11 +567,19 @@
         final float foreignTextThreshold = mSettings.getLangIdThresholdOverride() >= 0
                 ? mSettings.getLangIdThresholdOverride()
                 : 0.5f /* TODO: Load this from the langId model. */;
+        final Bundle foreignLanguageBundle =
+                detectForeignLanguage(classifiedText, foreignTextThreshold);
+        builder.setForeignLanguageExtra(foreignLanguageBundle);
+
         boolean isPrimaryAction = true;
         final ArrayList<Intent> sourceIntents = new ArrayList<>();
-        for (LabeledIntent labeledIntent : IntentFactory.create(
-                mContext, classifiedText, isForeignText(classifiedText, foreignTextThreshold),
-                referenceTime, highestScoringResult)) {
+        List<LabeledIntent> labeledIntents = mIntentFactory.create(
+                mContext,
+                classifiedText,
+                foreignLanguageBundle != null,
+                referenceTime,
+                highestScoringResult);
+        for (LabeledIntent labeledIntent : labeledIntents) {
             final RemoteAction action = labeledIntent.asRemoteAction(mContext);
             if (action == null) {
                 continue;
@@ -590,28 +595,28 @@
                                 labeledIntent.getIntent(), labeledIntent.getRequestCode())));
                 isPrimaryAction = false;
             }
-            builder.addAction(action);
-            sourceIntents.add(labeledIntent.getIntent());
+            builder.addAction(action, labeledIntent.getIntent());
         }
 
-        final Bundle extras = new Bundle();
-        extras.putParcelableArrayList(ACTIONS_INTENTS, sourceIntents);
-
-        return builder.setId(createId(text, start, end))
-                .setExtras(extras)
-                .build();
+        return builder.setId(createId(text, start, end)).build();
     }
 
-    private boolean isForeignText(String text, float threshold) {
+    /**
+     * Returns a bundle with the language and confidence score if it finds the text to be
+     * in a foreign language. Otherwise returns null.
+     */
+    @Nullable
+    private Bundle detectForeignLanguage(String text, float threshold) {
         if (threshold > 1) {
-            return false;
+            return null;
         }
 
         // TODO: Revisit this algorithm.
         try {
-            final LangIdModel.LanguageResult[] langResults = getLangIdImpl().detectLanguages(text);
+            final LangIdModel langId = getLangIdImpl();
+            final LangIdModel.LanguageResult[] langResults = langId.detectLanguages(text);
             if (langResults.length <= 0) {
-                return false;
+                return null;
             }
 
             LangIdModel.LanguageResult highestScoringResult = langResults[0];
@@ -621,7 +626,7 @@
                 }
             }
             if (highestScoringResult.getScore() < threshold) {
-                return false;
+                return null;
             }
             // TODO: Remove
             Log.d(LOG_TAG, String.format("Language detected: <%s:%s>",
@@ -632,14 +637,15 @@
             final int size = deviceLocales.size();
             for (int i = 0; i < size; i++) {
                 if (deviceLocales.get(i).getLanguage().equals(detected.getLanguage())) {
-                    return false;
+                    return null;
                 }
             }
-            return true;
+            return ExtrasUtils.createForeignLanguageExtra(
+                    detected.getLanguage(), highestScoringResult.getScore(), langId.getVersion());
         } catch (Throwable t) {
             Log.e(LOG_TAG, "Error detecting foreign text. Ignored.", t);
         }
-        return false;
+        return null;
     }
 
     @Override
@@ -720,11 +726,13 @@
             mRequestCode = requestCode;
         }
 
-        String getTitle() {
+        @VisibleForTesting
+        public String getTitle() {
             return mTitle;
         }
 
-        String getDescription() {
+        @VisibleForTesting
+        public String getDescription() {
             return mDescription;
         }
 
@@ -733,7 +741,8 @@
             return mIntent;
         }
 
-        int getRequestCode() {
+        @VisibleForTesting
+        public int getRequestCode() {
             return mRequestCode;
         }
 
@@ -769,233 +778,5 @@
             return action;
         }
     }
-
-    /**
-     * Creates intents based on the classification type.
-     */
-    @VisibleForTesting
-    public static final class IntentFactory {
-
-        private static final long MIN_EVENT_FUTURE_MILLIS = TimeUnit.MINUTES.toMillis(5);
-        private static final long DEFAULT_EVENT_DURATION = TimeUnit.HOURS.toMillis(1);
-
-        private IntentFactory() {}
-
-        @NonNull
-        public static List<LabeledIntent> create(
-                Context context,
-                String text,
-                boolean foreignText,
-                @Nullable Instant referenceTime,
-                @Nullable AnnotatorModel.ClassificationResult classification) {
-            final String type = classification != null
-                    ? classification.getCollection().trim().toLowerCase(Locale.ENGLISH)
-                    : "";
-            text = text.trim();
-            final List<LabeledIntent> actions;
-            switch (type) {
-                case TextClassifier.TYPE_EMAIL:
-                    actions = createForEmail(context, text);
-                    break;
-                case TextClassifier.TYPE_PHONE:
-                    actions = createForPhone(context, text);
-                    break;
-                case TextClassifier.TYPE_ADDRESS:
-                    actions = createForAddress(context, text);
-                    break;
-                case TextClassifier.TYPE_URL:
-                    actions = createForUrl(context, text);
-                    break;
-                case TextClassifier.TYPE_DATE:  // fall through
-                case TextClassifier.TYPE_DATE_TIME:
-                    if (classification.getDatetimeResult() != null) {
-                        final Instant parsedTime = Instant.ofEpochMilli(
-                                classification.getDatetimeResult().getTimeMsUtc());
-                        actions = createForDatetime(context, type, referenceTime, parsedTime);
-                    } else {
-                        actions = new ArrayList<>();
-                    }
-                    break;
-                case TextClassifier.TYPE_FLIGHT_NUMBER:
-                    actions = createForFlight(context, text);
-                    break;
-                case TextClassifier.TYPE_DICTIONARY:
-                    actions = createForDictionary(context, text);
-                    break;
-                default:
-                    actions = new ArrayList<>();
-                    break;
-            }
-            if (foreignText) {
-                insertTranslateAction(actions, context, text);
-            }
-            actions.forEach(
-                    action -> action.getIntent()
-                            .putExtra(TextClassifier.EXTRA_FROM_TEXT_CLASSIFIER, true));
-            return actions;
-        }
-
-        @NonNull
-        private static List<LabeledIntent> createForEmail(Context context, String text) {
-            final List<LabeledIntent> actions = new ArrayList<>();
-            actions.add(new LabeledIntent(
-                    context.getString(com.android.internal.R.string.email),
-                    context.getString(com.android.internal.R.string.email_desc),
-                    new Intent(Intent.ACTION_SENDTO)
-                            .setData(Uri.parse(String.format("mailto:%s", text))),
-                    LabeledIntent.DEFAULT_REQUEST_CODE));
-            actions.add(new LabeledIntent(
-                    context.getString(com.android.internal.R.string.add_contact),
-                    context.getString(com.android.internal.R.string.add_contact_desc),
-                    new Intent(Intent.ACTION_INSERT_OR_EDIT)
-                            .setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE)
-                            .putExtra(ContactsContract.Intents.Insert.EMAIL, text),
-                    text.hashCode()));
-            return actions;
-        }
-
-        @NonNull
-        private static List<LabeledIntent> createForPhone(Context context, String text) {
-            final List<LabeledIntent> actions = new ArrayList<>();
-            final UserManager userManager = context.getSystemService(UserManager.class);
-            final Bundle userRestrictions = userManager != null
-                    ? userManager.getUserRestrictions() : new Bundle();
-            if (!userRestrictions.getBoolean(UserManager.DISALLOW_OUTGOING_CALLS, false)) {
-                actions.add(new LabeledIntent(
-                        context.getString(com.android.internal.R.string.dial),
-                        context.getString(com.android.internal.R.string.dial_desc),
-                        new Intent(Intent.ACTION_DIAL).setData(
-                                Uri.parse(String.format("tel:%s", text))),
-                        LabeledIntent.DEFAULT_REQUEST_CODE));
-            }
-            actions.add(new LabeledIntent(
-                    context.getString(com.android.internal.R.string.add_contact),
-                    context.getString(com.android.internal.R.string.add_contact_desc),
-                    new Intent(Intent.ACTION_INSERT_OR_EDIT)
-                            .setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE)
-                            .putExtra(ContactsContract.Intents.Insert.PHONE, text),
-                    text.hashCode()));
-            if (!userRestrictions.getBoolean(UserManager.DISALLOW_SMS, false)) {
-                actions.add(new LabeledIntent(
-                        context.getString(com.android.internal.R.string.sms),
-                        context.getString(com.android.internal.R.string.sms_desc),
-                        new Intent(Intent.ACTION_SENDTO)
-                                .setData(Uri.parse(String.format("smsto:%s", text))),
-                        LabeledIntent.DEFAULT_REQUEST_CODE));
-            }
-            return actions;
-        }
-
-        @NonNull
-        private static List<LabeledIntent> createForAddress(Context context, String text) {
-            final List<LabeledIntent> actions = new ArrayList<>();
-            try {
-                final String encText = URLEncoder.encode(text, "UTF-8");
-                actions.add(new LabeledIntent(
-                        context.getString(com.android.internal.R.string.map),
-                        context.getString(com.android.internal.R.string.map_desc),
-                        new Intent(Intent.ACTION_VIEW)
-                                .setData(Uri.parse(String.format("geo:0,0?q=%s", encText))),
-                        LabeledIntent.DEFAULT_REQUEST_CODE));
-            } catch (UnsupportedEncodingException e) {
-                Log.e(LOG_TAG, "Could not encode address", e);
-            }
-            return actions;
-        }
-
-        @NonNull
-        private static List<LabeledIntent> createForUrl(Context context, String text) {
-            if (Uri.parse(text).getScheme() == null) {
-                text = "http://" + text;
-            }
-            final List<LabeledIntent> actions = new ArrayList<>();
-            actions.add(new LabeledIntent(
-                    context.getString(com.android.internal.R.string.browse),
-                    context.getString(com.android.internal.R.string.browse_desc),
-                    new Intent(Intent.ACTION_VIEW, Uri.parse(text))
-                            .putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName()),
-                    LabeledIntent.DEFAULT_REQUEST_CODE));
-            return actions;
-        }
-
-        @NonNull
-        private static List<LabeledIntent> createForDatetime(
-                Context context, String type, @Nullable Instant referenceTime,
-                Instant parsedTime) {
-            if (referenceTime == null) {
-                // If no reference time was given, use now.
-                referenceTime = Instant.now();
-            }
-            List<LabeledIntent> actions = new ArrayList<>();
-            actions.add(createCalendarViewIntent(context, parsedTime));
-            final long millisUntilEvent = referenceTime.until(parsedTime, MILLIS);
-            if (millisUntilEvent > MIN_EVENT_FUTURE_MILLIS) {
-                actions.add(createCalendarCreateEventIntent(context, parsedTime, type));
-            }
-            return actions;
-        }
-
-        @NonNull
-        private static List<LabeledIntent> createForFlight(Context context, String text) {
-            final List<LabeledIntent> actions = new ArrayList<>();
-            actions.add(new LabeledIntent(
-                    context.getString(com.android.internal.R.string.view_flight),
-                    context.getString(com.android.internal.R.string.view_flight_desc),
-                    new Intent(Intent.ACTION_WEB_SEARCH)
-                            .putExtra(SearchManager.QUERY, text),
-                    text.hashCode()));
-            return actions;
-        }
-
-        @NonNull
-        private static LabeledIntent createCalendarViewIntent(Context context, Instant parsedTime) {
-            Uri.Builder builder = CalendarContract.CONTENT_URI.buildUpon();
-            builder.appendPath("time");
-            ContentUris.appendId(builder, parsedTime.toEpochMilli());
-            return new LabeledIntent(
-                    context.getString(com.android.internal.R.string.view_calendar),
-                    context.getString(com.android.internal.R.string.view_calendar_desc),
-                    new Intent(Intent.ACTION_VIEW).setData(builder.build()),
-                    LabeledIntent.DEFAULT_REQUEST_CODE);
-        }
-
-        @NonNull
-        private static LabeledIntent createCalendarCreateEventIntent(
-                Context context, Instant parsedTime, @EntityType String type) {
-            final boolean isAllDay = TextClassifier.TYPE_DATE.equals(type);
-            return new LabeledIntent(
-                    context.getString(com.android.internal.R.string.add_calendar_event),
-                    context.getString(com.android.internal.R.string.add_calendar_event_desc),
-                    new Intent(Intent.ACTION_INSERT)
-                            .setData(CalendarContract.Events.CONTENT_URI)
-                            .putExtra(CalendarContract.EXTRA_EVENT_ALL_DAY, isAllDay)
-                            .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME,
-                                    parsedTime.toEpochMilli())
-                            .putExtra(CalendarContract.EXTRA_EVENT_END_TIME,
-                                    parsedTime.toEpochMilli() + DEFAULT_EVENT_DURATION),
-                    parsedTime.hashCode());
-        }
-
-        private static void insertTranslateAction(
-                List<LabeledIntent> actions, Context context, String text) {
-            actions.add(new LabeledIntent(
-                    context.getString(com.android.internal.R.string.translate),
-                    context.getString(com.android.internal.R.string.translate_desc),
-                    new Intent(Intent.ACTION_TRANSLATE)
-                            // TODO: Probably better to introduce a "translate" scheme instead of
-                            // using EXTRA_TEXT.
-                            .putExtra(Intent.EXTRA_TEXT, text),
-                    text.hashCode()));
-        }
-
-        @NonNull
-        private static List<LabeledIntent> createForDictionary(Context context, String text) {
-            return Arrays.asList(new LabeledIntent(
-                    context.getString(com.android.internal.R.string.define),
-                    context.getString(com.android.internal.R.string.define_desc),
-                    new Intent(Intent.ACTION_DEFINE)
-                            .putExtra(Intent.EXTRA_TEXT, text),
-                    text.hashCode()));
-        }
-    }
 }
+
diff --git a/core/java/android/webkit/WebViewZygote.java b/core/java/android/webkit/WebViewZygote.java
index de1f3df..09aa066 100644
--- a/core/java/android/webkit/WebViewZygote.java
+++ b/core/java/android/webkit/WebViewZygote.java
@@ -163,7 +163,7 @@
                     TextUtils.join(",", Build.SUPPORTED_ABIS),
                     null, // instructionSet
                     Process.FIRST_ISOLATED_UID,
-                    Process.LAST_ISOLATED_UID);
+                    Integer.MAX_VALUE); // TODO(b/123615476) deal with user-id ranges properly
             ZygoteProcess.waitForConnectionToZygote(sZygote.getPrimarySocketAddress());
 
             if (sPackageOriginalAppInfo.sourceDir.equals(sPackage.applicationInfo.sourceDir)) {
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 4a60b6a..e9d72a2 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -4112,9 +4112,9 @@
             }
         }
 
-        private MenuItem addAssistMenuItem(Menu menu, RemoteAction action, int intemId, int order,
+        private MenuItem addAssistMenuItem(Menu menu, RemoteAction action, int itemId, int order,
                 int showAsAction) {
-            final MenuItem item = menu.add(TextView.ID_ASSIST, intemId, order, action.getTitle())
+            final MenuItem item = menu.add(TextView.ID_ASSIST, itemId, order, action.getTitle())
                     .setContentDescription(action.getContentDescription());
             if (action.shouldShowIcon()) {
                 item.setIcon(action.getIcon().loadDrawable(mTextView.getContext()));
@@ -4188,7 +4188,8 @@
 
         @Override
         public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
-            getSelectionActionModeHelper().onSelectionAction(item.getItemId());
+            getSelectionActionModeHelper()
+                    .onSelectionAction(item.getItemId(), item.getTitle().toString());
 
             if (mProcessTextIntentActionsHandler.performMenuItemAction(item)) {
                 return true;
@@ -4488,6 +4489,13 @@
         // when selecting text when the handles jump to the end / start of words which may be on
         // a different line.
         protected int mPreviousLineTouched = UNSET_LINE;
+        // The raw x coordinate of the motion down event which started the current dragging session.
+        // Only used and stored when magnifier is used.
+        private float mCurrentDragInitialTouchRawX = UNSET_X_VALUE;
+        // The scale transform applied by containers to the TextView. Only used and computed
+        // when magnifier is used.
+        private float mTextViewScaleX;
+        private float mTextViewScaleY;
 
         private HandleView(Drawable drawableLtr, Drawable drawableRtl, final int id) {
             super(mTextView.getContext());
@@ -4807,25 +4815,44 @@
                             / mMagnifierAnimator.mMagnifier.getZoom());
             final Paint.FontMetrics fontMetrics = mTextView.getPaint().getFontMetrics();
             final float glyphHeight = fontMetrics.descent - fontMetrics.ascent;
-            return glyphHeight > magnifierContentHeight;
+            return glyphHeight * mTextViewScaleY > magnifierContentHeight;
         }
 
-        private boolean viewIsMatrixTransformed() {
+        /**
+         * Traverses the hierarchy above the text view, and computes the total scale applied
+         * to it. If a rotation is encountered, the method returns {@code false}, indicating
+         * that the magnifier should not be shown anyways. It would be nice to keep these two
+         * pieces of logic separate (the rotation check and the total scale calculation),
+         * but for efficiency we can do them in a single go.
+         * @return whether the text view is rotated
+         */
+        private boolean checkForTransforms() {
             if (mMagnifierAnimator.mMagnifierIsShowing) {
                 // Do not check again when the magnifier is currently showing.
-                return false;
-            }
-            if (!mTextView.hasIdentityMatrix()) {
                 return true;
             }
+
+            if (mTextView.getRotation() != 0f || mTextView.getRotationX() != 0f
+                    || mTextView.getRotationY() != 0f) {
+                return false;
+            }
+            mTextViewScaleX = mTextView.getScaleX();
+            mTextViewScaleY = mTextView.getScaleY();
+
             ViewParent viewParent = mTextView.getParent();
             while (viewParent != null) {
-                if (viewParent instanceof View && !((View) viewParent).hasIdentityMatrix()) {
-                    return true;
+                if (viewParent instanceof View) {
+                    final View view = (View) viewParent;
+                    if (view.getRotation() != 0f || view.getRotationX() != 0f
+                            || view.getRotationY() != 0f) {
+                        return false;
+                    }
+                    mTextViewScaleX *= view.getScaleX();
+                    mTextViewScaleY *= view.getScaleY();
                 }
                 viewParent = viewParent.getParent();
             }
-            return false;
+            return true;
         }
 
         /**
@@ -4863,6 +4890,12 @@
                 return false;
             }
 
+            if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
+                mCurrentDragInitialTouchRawX = event.getRawX();
+            } else if (event.getActionMasked() == MotionEvent.ACTION_UP) {
+                mCurrentDragInitialTouchRawX = UNSET_X_VALUE;
+            }
+
             final Layout layout = mTextView.getLayout();
             final int lineNumber = layout.getLineForOffset(offset);
             // Compute whether the selection handles are currently on the same line, and,
@@ -4890,6 +4923,8 @@
             } else {
                 rightBound += mTextView.getLayout().getLineRight(lineNumber);
             }
+            leftBound *= mTextViewScaleX;
+            rightBound *= mTextViewScaleX;
             final float contentWidth = Math.round(mMagnifierAnimator.mMagnifier.getWidth()
                     / mMagnifierAnimator.mMagnifier.getZoom());
             if (touchXInView < leftBound - contentWidth / 2
@@ -4897,13 +4932,27 @@
                 // The touch is too far from the current line / selection, so hide the magnifier.
                 return false;
             }
-            showPosInView.x = Math.max(leftBound, Math.min(rightBound, touchXInView));
+
+            final float scaledTouchXInView;
+            if (mTextViewScaleX == 1f) {
+                // In the common case, do not use mCurrentDragInitialTouchRawX to compute this
+                // coordinate, although the formula on the else branch should be equivalent.
+                // Since the formula relies on mCurrentDragInitialTouchRawX being set on
+                // MotionEvent.ACTION_DOWN, this makes us more defensive against cases when
+                // the sequence of events might not look as expected: for example, a sequence of
+                // ACTION_MOVE not preceded by ACTION_DOWN.
+                scaledTouchXInView = touchXInView;
+            } else {
+                scaledTouchXInView = (event.getRawX() - mCurrentDragInitialTouchRawX)
+                        * mTextViewScaleX + mCurrentDragInitialTouchRawX
+                        - textViewLocationOnScreen[0];
+            }
+            showPosInView.x = Math.max(leftBound, Math.min(rightBound, scaledTouchXInView));
 
             // Vertically snap to middle of current line.
-            showPosInView.y = (mTextView.getLayout().getLineTop(lineNumber)
+            showPosInView.y = ((mTextView.getLayout().getLineTop(lineNumber)
                     + mTextView.getLayout().getLineBottom(lineNumber)) / 2.0f
-                    + mTextView.getTotalPaddingTop() - mTextView.getScrollY();
-
+                    + mTextView.getTotalPaddingTop() - mTextView.getScrollY()) * mTextViewScaleY;
             return true;
         }
 
@@ -4955,8 +5004,8 @@
             }
 
             final PointF showPosInView = new PointF();
-            final boolean shouldShow = !tooLargeTextForMagnifier()
-                    && !viewIsMatrixTransformed()
+            final boolean shouldShow = checkForTransforms() /*check not rotated and compute scale*/
+                    && !tooLargeTextForMagnifier()
                     && obtainMagnifierShowCoordinates(event, showPosInView);
             if (shouldShow) {
                 // Make the cursor visible and stop blinking.
diff --git a/core/java/android/widget/Magnifier.java b/core/java/android/widget/Magnifier.java
index 5147306..d5b1a3d 100644
--- a/core/java/android/widget/Magnifier.java
+++ b/core/java/android/widget/Magnifier.java
@@ -579,24 +579,11 @@
             zoomCenterY = Math.round(yPosInView + mViewCoordinatesInSurface[1]);
         }
 
-        final Rect[] bounds = new Rect[3]; // [MAX_IN_SURFACE, MAX_IN_VIEW, MAX_VISIBLE]
+        final Rect[] bounds = new Rect[2]; // [MAX_IN_SURFACE, MAX_VISIBLE]
         // Obtain the surface bounds rectangle.
         final Rect surfaceBounds = new Rect(0, 0,
                 mContentCopySurface.mWidth, mContentCopySurface.mHeight);
         bounds[0] = surfaceBounds;
-        // Obtain the view bounds rectangle.
-        final Rect viewBounds;
-        if (mView instanceof SurfaceView) {
-            viewBounds = new Rect(0, 0, mContentCopySurface.mWidth, mContentCopySurface.mHeight);
-        } else {
-            viewBounds = new Rect(
-                    mViewCoordinatesInSurface[0],
-                    mViewCoordinatesInSurface[1],
-                    mViewCoordinatesInSurface[0] + mView.getWidth(),
-                    mViewCoordinatesInSurface[1] + mView.getHeight()
-            );
-        }
-        bounds[1] = viewBounds;
         // Obtain the visible view region rectangle.
         final Rect viewVisibleRegion = new Rect();
         mView.getGlobalVisibleRect(viewVisibleRegion);
@@ -609,7 +596,7 @@
             // If we copy content from a SurfaceView, clamp coordinates relative to it.
             viewVisibleRegion.offset(-mViewCoordinatesInSurface[0], -mViewCoordinatesInSurface[1]);
         }
-        bounds[2] = viewVisibleRegion;
+        bounds[1] = viewVisibleRegion;
 
         // Aggregate the above to obtain the bounds where the content copy will be restricted.
         int resolvedLeft = Integer.MIN_VALUE;
@@ -1301,11 +1288,6 @@
          *   {@link android.view.View#getGlobalVisibleRect(Rect)}. For example, this will take into
          *   account the case when the view is contained in a scrollable container, and the
          *   magnifier will refuse to copy content outside of the visible view region</li>
-         *   <li>{@link #SOURCE_BOUND_MAX_IN_VIEW}, which extends the bound as much as possible
-         *   while remaining in the bounds of the view. Note that, although this option is
-         *   used, the magnifier will always only display content visible on the screen: if the
-         *   view lays outside the screen or is covered by a different view either partially or
-         *   totally, the magnifier will not show any view region not visible on the screen.</li>
          *   <li>{@link #SOURCE_BOUND_MAX_IN_SURFACE}, which extends the bound as much
          *   as possible while remaining inside the surface the content is copied from.</li>
          * </ul>
@@ -1349,21 +1331,14 @@
      * A source bound that will extend as much as possible, while remaining within the surface
      * the content is copied from.
      */
-
     public static final int SOURCE_BOUND_MAX_IN_SURFACE = 0;
-    /**
-     * A source bound that will extend as much as possible, while remaining within the
-     * magnified view.
-     */
-
-    public static final int SOURCE_BOUND_MAX_IN_VIEW = 1;
 
     /**
      * A source bound that will extend as much as possible, while remaining within the
      * visible region of the magnified view, as determined by
      * {@link View#getGlobalVisibleRect(Rect)}.
      */
-    public static final int SOURCE_BOUND_MAX_VISIBLE = 2;
+    public static final int SOURCE_BOUND_MAX_VISIBLE = 1;
 
 
     /**
@@ -1373,7 +1348,7 @@
      *
      * @hide
      */
-    @IntDef({SOURCE_BOUND_MAX_IN_SURFACE, SOURCE_BOUND_MAX_IN_VIEW, SOURCE_BOUND_MAX_VISIBLE})
+    @IntDef({SOURCE_BOUND_MAX_IN_SURFACE, SOURCE_BOUND_MAX_VISIBLE})
     @Retention(RetentionPolicy.SOURCE)
     public @interface SourceBound {}
 
diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java
index 4caf288..564cfdd 100644
--- a/core/java/android/widget/SelectionActionModeHelper.java
+++ b/core/java/android/widget/SelectionActionModeHelper.java
@@ -20,12 +20,14 @@
 import android.annotation.Nullable;
 import android.annotation.UiThread;
 import android.annotation.WorkerThread;
+import android.app.RemoteAction;
 import android.content.Context;
 import android.graphics.Canvas;
 import android.graphics.PointF;
 import android.graphics.RectF;
 import android.os.AsyncTask;
 import android.os.Build;
+import android.os.Bundle;
 import android.os.LocaleList;
 import android.text.Layout;
 import android.text.Selection;
@@ -34,13 +36,16 @@
 import android.text.util.Linkify;
 import android.util.Log;
 import android.view.ActionMode;
+import android.view.textclassifier.ExtrasUtils;
 import android.view.textclassifier.SelectionEvent;
 import android.view.textclassifier.SelectionEvent.InvocationMethod;
 import android.view.textclassifier.SelectionSessionLogger;
 import android.view.textclassifier.TextClassification;
 import android.view.textclassifier.TextClassificationConstants;
+import android.view.textclassifier.TextClassificationContext;
 import android.view.textclassifier.TextClassificationManager;
 import android.view.textclassifier.TextClassifier;
+import android.view.textclassifier.TextClassifierEvent;
 import android.view.textclassifier.TextSelection;
 import android.widget.Editor.SelectionModifierCursorController;
 
@@ -166,16 +171,17 @@
         }
     }
 
-    public void onSelectionAction(int menuItemId) {
+    /** Reports a selection action event. */
+    public void onSelectionAction(int menuItemId, @Nullable String actionLabel) {
         mSelectionTracker.onSelectionAction(
                 mTextView.getSelectionStart(), mTextView.getSelectionEnd(),
-                getActionType(menuItemId), mTextClassification);
+                getActionType(menuItemId), actionLabel, mTextClassification);
     }
 
     public void onSelectionDrag() {
         mSelectionTracker.onSelectionAction(
                 mTextView.getSelectionStart(), mTextView.getSelectionEnd(),
-                SelectionEvent.ACTION_DRAG, mTextClassification);
+                SelectionEvent.ACTION_DRAG, /* actionLabel= */ null, mTextClassification);
     }
 
     public void onTextChanged(int start, int end) {
@@ -511,8 +517,11 @@
             mOriginalEnd = mSelectionEnd = selectionEnd;
             mAllowReset = false;
             maybeInvalidateLogger();
-            mLogger.logSelectionStarted(mTextView.getTextClassificationSession(),
-                    text, selectionStart,
+            mLogger.logSelectionStarted(
+                    mTextView.getTextClassificationSession(),
+                    mTextView.getTextClassificationContext(),
+                    text,
+                    selectionStart,
                     isLink ? SelectionEvent.INVOCATION_LINK : SelectionEvent.INVOCATION_MANUAL);
         }
 
@@ -570,10 +579,12 @@
         public void onSelectionAction(
                 int selectionStart, int selectionEnd,
                 @SelectionEvent.ActionType int action,
+                @Nullable String actionLabel,
                 @Nullable TextClassification classification) {
             if (isSelectionStarted()) {
                 mAllowReset = false;
-                mLogger.logSelectionAction(selectionStart, selectionEnd, action, classification);
+                mLogger.logSelectionAction(
+                        selectionStart, selectionEnd, action, actionLabel, classification);
             }
         }
 
@@ -596,7 +607,8 @@
                     mSelectionEnd = editor.getTextView().getSelectionEnd();
                     mLogger.logSelectionAction(
                             textView.getSelectionStart(), textView.getSelectionEnd(),
-                            SelectionEvent.ACTION_RESET, null /* classification */);
+                            SelectionEvent.ACTION_RESET,
+                            /* actionLabel= */ null, /* classification= */ null);
                 }
                 return selected;
             }
@@ -605,7 +617,9 @@
 
         public void onTextChanged(int start, int end, TextClassification classification) {
             if (isSelectionStarted() && start == mSelectionStart && end == mSelectionEnd) {
-                onSelectionAction(start, end, SelectionEvent.ACTION_OVERTYPE, classification);
+                onSelectionAction(
+                        start, end, SelectionEvent.ACTION_OVERTYPE,
+                        /* actionLabel= */ null, classification);
             }
         }
 
@@ -644,7 +658,8 @@
                 if (mIsPending) {
                     mLogger.logSelectionAction(
                             mSelectionStart, mSelectionEnd,
-                            SelectionEvent.ACTION_ABANDON, null /* classification */);
+                            SelectionEvent.ACTION_ABANDON,
+                            /* actionLabel= */ null, /* classification= */ null);
                     mSelectionStart = mSelectionEnd = -1;
                     mLogger.endTextClassificationSession();
                     mIsPending = false;
@@ -679,6 +694,11 @@
         private final BreakIterator mTokenIterator;
 
         @Nullable private TextClassifier mClassificationSession;
+        @Nullable private TextClassificationContext mClassificationContext;
+
+        @Nullable private TextClassifierEvent mTranslateViewEvent;
+        @Nullable private TextClassifierEvent mTranslateClickEvent;
+
         private int mStartIndex;
         private String mText;
 
@@ -690,6 +710,7 @@
 
         public void logSelectionStarted(
                 TextClassifier classificationSession,
+                TextClassificationContext classificationContext,
                 CharSequence text, int index,
                 @InvocationMethod int invocationMethod) {
             try {
@@ -701,6 +722,7 @@
                 mTokenIterator.setText(mText);
                 mStartIndex = index;
                 mClassificationSession = classificationSession;
+                mClassificationContext = classificationContext;
                 if (hasActiveClassificationSession()) {
                     mClassificationSession.onSelectionEvent(
                             SelectionEvent.createSelectionStartedEvent(invocationMethod, 0));
@@ -731,6 +753,7 @@
                                 SelectionEvent.createSelectionModifiedEvent(
                                         wordIndices[0], wordIndices[1]));
                     }
+                    maybeGenerateTranslateViewEvent(classification);
                 }
             } catch (Exception e) {
                 // Avoid crashes due to logging.
@@ -741,6 +764,7 @@
         public void logSelectionAction(
                 int start, int end,
                 @SelectionEvent.ActionType int action,
+                @Nullable String actionLabel,
                 @Nullable TextClassification classification) {
             try {
                 if (hasActiveClassificationSession()) {
@@ -757,6 +781,9 @@
                                 SelectionEvent.createSelectionActionEvent(
                                         wordIndices[0], wordIndices[1], action));
                     }
+
+                    maybeGenerateTranslateClickEvent(classification, actionLabel);
+
                     if (SelectionEvent.isTerminal(action)) {
                         endTextClassificationSession();
                     }
@@ -773,6 +800,7 @@
 
         public void endTextClassificationSession() {
             if (hasActiveClassificationSession()) {
+                maybeReportTranslateEvents();
                 mClassificationSession.destroy();
             }
         }
@@ -843,6 +871,78 @@
         private boolean isWhitespace(int start, int end) {
             return PATTERN_WHITESPACE.matcher(mText.substring(start, end)).matches();
         }
+
+        private void maybeGenerateTranslateViewEvent(@Nullable TextClassification classification) {
+            if (classification != null) {
+                final TextClassifierEvent event = generateTranslateEvent(
+                        TextClassifierEvent.TYPE_ACTIONS_SHOWN,
+                        classification, mClassificationContext, /* actionLabel= */null);
+                mTranslateViewEvent = (event != null) ? event : mTranslateViewEvent;
+            }
+        }
+
+        private void maybeGenerateTranslateClickEvent(
+                @Nullable TextClassification classification, String actionLabel) {
+            if (classification != null) {
+                mTranslateClickEvent = generateTranslateEvent(
+                        TextClassifierEvent.TYPE_SMART_ACTION,
+                        classification, mClassificationContext, actionLabel);
+            }
+        }
+
+        private void maybeReportTranslateEvents() {
+            // Translate view and click events should only be logged once per selection session.
+            if (mTranslateViewEvent != null) {
+                mClassificationSession.onTextClassifierEvent(mTranslateViewEvent);
+                mTranslateViewEvent = null;
+            }
+            if (mTranslateClickEvent != null) {
+                mClassificationSession.onTextClassifierEvent(mTranslateClickEvent);
+                mTranslateClickEvent = null;
+            }
+        }
+
+        @Nullable
+        private static TextClassifierEvent generateTranslateEvent(
+                int eventType, TextClassification classification,
+                TextClassificationContext classificationContext, @Nullable String actionLabel) {
+
+            // The platform attempts to log "views" and "clicks" of the "Translate" action.
+            // Views are logged if a user is presented with the translate action during a selection
+            // session.
+            // Clicks are logged if the user clicks on the translate action.
+            // The index of the translate action is also logged to indicate whether it might have
+            // been in the main panel or overflow panel of the selection toolbar.
+            // NOTE that the "views" metric may be flawed if a TextView removes the translate menu
+            // item via a custom action mode callback or does not show a selection menu item.
+
+            final RemoteAction translateAction = ExtrasUtils.findTranslateAction(classification);
+            if (translateAction == null) {
+                // No translate action present. Nothing to log. Exit.
+                return null;
+            }
+
+            if (eventType == TextClassifierEvent.TYPE_SMART_ACTION
+                    && !translateAction.getTitle().toString().equals(actionLabel)) {
+                // Clicked action is not a translate action. Nothing to log. Exit.
+                // Note that we don't expect an actionLabel for "view" events.
+                return null;
+            }
+
+            final Bundle foreignLanguageExtra = ExtrasUtils.getForeignLanguageExtra(classification);
+            final String language = ExtrasUtils.getEntityType(foreignLanguageExtra);
+            final float score = ExtrasUtils.getScore(foreignLanguageExtra);
+            final String model = ExtrasUtils.getModelName(foreignLanguageExtra);
+            return new TextClassifierEvent.Builder(
+                    TextClassifierEvent.CATEGORY_LANGUAGE_DETECTION, eventType)
+                    .setEventContext(classificationContext)
+                    .setResultId(classification.getId())
+                    .setEntityTypes(language)
+                    .setScore(score)
+                    .setActionIndices(classification.getActions().indexOf(translateAction))
+                    .setModelName(model)
+                    .build();
+        }
     }
 
     /**
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 780fe8d..8029cf0 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -456,6 +456,7 @@
 
     private TextClassifier mTextClassifier;
     private TextClassifier mTextClassificationSession;
+    private TextClassificationContext mTextClassificationContext;
 
     // A flag to prevent repeated movements from escaping the enclosing text view. The idea here is
     // that if a user is holding down a movement key to traverse text, we shouldn't also traverse
@@ -10275,7 +10276,7 @@
                 final ContentCaptureSession session = getContentCaptureSession();
                 if (session != null) {
                     // TODO(b/111276913): pass flags when edited by user / add CTS test
-                    session.notifyViewTextChanged(getAutofillId(), getText(), /* flags= */ 0);
+                    session.notifyViewTextChanged(getAutofillId(), getText());
                 }
             }
         }
@@ -12068,16 +12069,15 @@
                 } else {
                     widgetType = TextClassifier.WIDGET_TYPE_UNSELECTABLE_TEXTVIEW;
                 }
-                final TextClassificationContext textClassificationContext =
-                        new TextClassificationContext.Builder(
-                                mContext.getPackageName(), widgetType)
-                                .build();
+                mTextClassificationContext = new TextClassificationContext.Builder(
+                        mContext.getPackageName(), widgetType)
+                        .build();
                 if (mTextClassifier != null) {
                     mTextClassificationSession = tcm.createTextClassificationSession(
-                            textClassificationContext, mTextClassifier);
+                            mTextClassificationContext, mTextClassifier);
                 } else {
                     mTextClassificationSession = tcm.createTextClassificationSession(
-                            textClassificationContext);
+                            mTextClassificationContext);
                 }
             } else {
                 mTextClassificationSession = TextClassifier.NO_OP;
@@ -12087,6 +12087,15 @@
     }
 
     /**
+     * Returns the {@link TextClassificationContext} for the current TextClassifier session.
+     * @see #getTextClassificationSession()
+     */
+    @Nullable
+    TextClassificationContext getTextClassificationContext() {
+        return mTextClassificationContext;
+    }
+
+    /**
      * Returns true if this TextView uses a no-op TextClassifier.
      */
     boolean usesNoOpTextClassifier() {
diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java
index 299801a..cfe2939 100644
--- a/core/java/com/android/internal/app/ChooserActivity.java
+++ b/core/java/com/android/internal/app/ChooserActivity.java
@@ -24,6 +24,8 @@
 import android.app.prediction.AppTarget;
 import android.app.prediction.AppTargetEvent;
 import android.app.prediction.AppTargetId;
+import android.content.ClipData;
+import android.content.ClipboardManager;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -41,9 +43,13 @@
 import android.content.pm.ShortcutInfo;
 import android.content.pm.ShortcutManager;
 import android.database.DataSetObserver;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
 import android.graphics.Color;
+import android.graphics.Path;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.Icon;
+import android.net.Uri;
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.os.Environment;
@@ -62,7 +68,9 @@
 import android.service.chooser.IChooserTargetResult;
 import android.service.chooser.IChooserTargetService;
 import android.text.TextUtils;
+import android.util.AttributeSet;
 import android.util.Log;
+import android.util.Size;
 import android.util.Slog;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -73,9 +81,13 @@
 import android.view.ViewGroup.LayoutParams;
 import android.widget.AbsListView;
 import android.widget.BaseAdapter;
+import android.widget.Button;
+import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.ListView;
 import android.widget.Space;
+import android.widget.TextView;
+import android.widget.Toast;
 
 import com.android.internal.R;
 import com.android.internal.annotations.VisibleForTesting;
@@ -85,6 +97,7 @@
 import com.google.android.collect.Lists;
 
 import java.io.File;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -262,16 +275,31 @@
         }
 
         mReplacementExtras = intent.getBundleExtra(Intent.EXTRA_REPLACEMENT_EXTRAS);
-        CharSequence title = intent.getCharSequenceExtra(Intent.EXTRA_TITLE);
+
+        // Do not allow the title to be changed when sharing content
+        CharSequence title = null;
+        if (target != null) {
+            String targetAction = target.getAction();
+            if (!(Intent.ACTION_SEND.equals(targetAction) || Intent.ACTION_SEND_MULTIPLE.equals(
+                    targetAction))) {
+                title = intent.getCharSequenceExtra(Intent.EXTRA_TITLE);
+            } else {
+                Log.w(TAG, "Ignoring intent's EXTRA_TITLE, deprecated in P. You may wish to set a"
+                        + " preview title by using EXTRA_TITLE property of the wrapped"
+                        + " EXTRA_INTENT.");
+            }
+        }
+
         int defaultTitleRes = 0;
         if (title == null) {
             defaultTitleRes = com.android.internal.R.string.chooseActivity;
         }
+
         Parcelable[] pa = intent.getParcelableArrayExtra(Intent.EXTRA_INITIAL_INTENTS);
         Intent[] initialIntents = null;
         if (pa != null) {
             initialIntents = new Intent[pa.length];
-            for (int i=0; i<pa.length; i++) {
+            for (int i = 0; i < pa.length; i++) {
                 if (!(pa[i] instanceof Intent)) {
                     Log.w(TAG, "Initial intent #" + i + " not an Intent: " + pa[i]);
                     finish();
@@ -325,6 +353,50 @@
         super.onCreate(savedInstanceState, target, title, defaultTitleRes, initialIntents,
                 null, false);
 
+        Button copyButton = findViewById(R.id.copy_button);
+        copyButton.setOnClickListener(view -> {
+            Intent targetIntent = getTargetIntent();
+            if (targetIntent == null) {
+                finish();
+            } else {
+                final String action = targetIntent.getAction();
+
+                ClipData clipData = null;
+                if (Intent.ACTION_SEND.equals(action)) {
+                    String extraText = targetIntent.getStringExtra(Intent.EXTRA_TEXT);
+                    Uri extraStream = targetIntent.getParcelableExtra(Intent.EXTRA_STREAM);
+
+                    if (extraText != null) {
+                        clipData = ClipData.newPlainText(null, extraText);
+                    } else if (extraStream != null) {
+                        clipData = ClipData.newUri(getContentResolver(), null, extraStream);
+                    } else {
+                        Log.w(TAG, "No data available to copy to clipboard");
+                        return;
+                    }
+                } else if (Intent.ACTION_SEND_MULTIPLE.equals(action)) {
+                    final ArrayList<Uri> streams = targetIntent.getParcelableArrayListExtra(
+                            Intent.EXTRA_STREAM);
+                    clipData = ClipData.newUri(getContentResolver(), null, streams.get(0));
+                    for (int i = 1; i < streams.size(); i++) {
+                        clipData.addItem(getContentResolver(), new ClipData.Item(streams.get(i)));
+                    }
+                } else {
+                    // expected to only be visible with ACTION_SEND or ACTION_SEND_MULTIPLE
+                    // so warn about unexpected action
+                    Log.w(TAG, "Action (" + action + ") not supported for copying to clipboard");
+                    return;
+                }
+
+                ClipboardManager clipboardManager = (ClipboardManager) getSystemService(
+                        Context.CLIPBOARD_SERVICE);
+                clipboardManager.setPrimaryClip(clipData);
+                Toast.makeText(getApplicationContext(), R.string.copied, Toast.LENGTH_SHORT).show();
+
+                finish();
+            }
+        });
+
         MetricsLogger.action(this, MetricsEvent.ACTION_ACTIVITY_CHOOSER_SHOWN);
 
         mChooserShownTime = System.currentTimeMillis();
@@ -364,6 +436,68 @@
         }
     }
 
+    /**
+     * Override method to add content preview area, specific to the chooser activity.
+     */
+    @Override
+    public void setHeader() {
+        super.setHeader();
+
+        Intent targetIntent = getTargetIntent();
+        if (targetIntent == null) {
+            return;
+        }
+
+        ViewGroup contentPreviewLayout = findViewById(R.id.content_preview);
+        String action = targetIntent.getAction();
+        if (!(Intent.ACTION_SEND.equals(action) || Intent.ACTION_SEND_MULTIPLE.equals(action))) {
+            contentPreviewLayout.setVisibility(View.GONE);
+            return;
+        }
+
+        showDefaultContentPreview(contentPreviewLayout, targetIntent);
+    }
+
+    private void showDefaultContentPreview(final ViewGroup parentLayout,
+            final Intent targetIntent) {
+        CharSequence sharingText = targetIntent.getCharSequenceExtra(Intent.EXTRA_TEXT);
+        if (sharingText == null) {
+            findViewById(R.id.content_preview_text_layout).setVisibility(View.GONE);
+        } else {
+            TextView textView = findViewById(R.id.content_preview_text);
+            textView.setText(sharingText);
+        }
+
+        String previewTitle = targetIntent.getStringExtra(Intent.EXTRA_TITLE);
+        if (previewTitle == null || previewTitle.trim().isEmpty()) {
+            findViewById(R.id.content_preview_title_layout).setVisibility(View.GONE);
+        } else {
+            TextView previewTitleView = findViewById(R.id.content_preview_title);
+            previewTitleView.setText(previewTitle);
+
+            ClipData previewData = targetIntent.getClipData();
+            Uri previewThumbnail = null;
+            if (previewData != null) {
+                if (previewData.getItemCount() > 0) {
+                    ClipData.Item previewDataItem = previewData.getItemAt(0);
+                    previewThumbnail = previewDataItem.getUri();
+                }
+            }
+
+            ImageView previewThumbnailView = findViewById(R.id.content_preview_thumbnail);
+            if (previewThumbnail == null) {
+                previewThumbnailView.setVisibility(View.GONE);
+            } else {
+                Bitmap bmp = loadThumbnail(previewThumbnail, new Size(100, 100));
+                if (bmp == null) {
+                    previewThumbnailView.setVisibility(View.GONE);
+                } else {
+                    previewThumbnailView.setImageBitmap(bmp);
+                }
+            }
+        }
+    }
+
     static SharedPreferences getPinnedSharedPrefs(Context context) {
         // The code below is because in the android:ui process, no one can hear you scream.
         // The package info in the context isn't initialized in the way it is for normal apps,
@@ -630,15 +764,19 @@
                 }
             }
             if (targetsToQuery >= QUERY_TARGET_SERVICE_LIMIT) {
-                if (DEBUG) Log.d(TAG, "queryTargets hit query target limit "
-                        + QUERY_TARGET_SERVICE_LIMIT);
+                if (DEBUG) {
+                    Log.d(TAG, "queryTargets hit query target limit "
+                            + QUERY_TARGET_SERVICE_LIMIT);
+                }
                 break;
             }
         }
 
         if (!mServiceConnections.isEmpty()) {
-            if (DEBUG) Log.d(TAG, "queryTargets setting watchdog timer for "
-                    + WATCHDOG_TIMEOUT_MILLIS + "ms");
+            if (DEBUG) {
+                Log.d(TAG, "queryTargets setting watchdog timer for "
+                        + WATCHDOG_TIMEOUT_MILLIS + "ms");
+            }
             mChooserHandler.sendEmptyMessageDelayed(CHOOSER_TARGET_SERVICE_WATCHDOG_TIMEOUT,
                     WATCHDOG_TIMEOUT_MILLIS);
         } else {
@@ -969,6 +1107,20 @@
                 mLaunchedFromUid);
     }
 
+    @VisibleForTesting
+    protected Bitmap loadThumbnail(Uri uri, Size size) {
+        if (uri == null || size == null) {
+            return null;
+        }
+
+        try {
+            return getContentResolver().loadThumbnail(uri, size, null);
+        } catch (IOException | NullPointerException ex) {
+            Log.w(TAG, "Error loading preview thumbnail for uri: " + uri.toString(), ex);
+        }
+        return null;
+    }
+
     final class ChooserTargetInfo implements TargetInfo {
         private final DisplayResolveInfo mSourceInfo;
         private final ResolveInfo mBackupResolveInfo;
@@ -1247,7 +1399,7 @@
                     UserManager userManager =
                             (UserManager) getSystemService(Context.USER_SERVICE);
                     if (ii instanceof LabeledIntent) {
-                        LabeledIntent li = (LabeledIntent)ii;
+                        LabeledIntent li = (LabeledIntent) ii;
                         ri.resolvePackageName = li.getSourcePackage();
                         ri.labelRes = li.getLabelResource();
                         ri.nonLocalizedLabel = li.getNonLocalizedLabel();
@@ -1391,8 +1543,10 @@
         }
 
         public void addServiceResults(DisplayResolveInfo origTarget, List<ChooserTarget> targets) {
-            if (DEBUG) Log.d(TAG, "addServiceResults " + origTarget + ", " + targets.size()
-                    + " targets");
+            if (DEBUG) {
+                Log.d(TAG, "addServiceResults " + origTarget + ", " + targets.size()
+                        + " targets");
+            }
 
             if (mTargetsNeedPruning && targets.size() > 0) {
                 // First proper update since we got an onListRebuilt() with (transient) 0 items.
@@ -1492,8 +1646,9 @@
         public int getCount() {
             return (int) (
                     getCallerTargetRowCount()
-                    + getServiceTargetRowCount()
-                    + Math.ceil((float) mChooserListAdapter.getStandardTargetCount() / mColumnCount)
+                            + getServiceTargetRowCount()
+                            + Math.ceil(
+                            (float) mChooserListAdapter.getStandardTargetCount() / mColumnCount)
             );
         }
 
@@ -1860,7 +2015,7 @@
 
             final int chooserTargetRows = mChooserRowAdapter.getServiceTargetRowCount();
             int offset = 0;
-            for (int i = 0; i < chooserTargetRows; i++)  {
+            for (int i = 0; i < chooserTargetRows; i++) {
                 final int pos = mChooserRowAdapter.getCallerTargetRowCount() + i;
                 final int vt = mChooserRowAdapter.getItemViewType(pos);
                 if (vt != mCachedViewType) {
@@ -1882,4 +2037,65 @@
             mResolverDrawerLayout.setCollapsibleHeightReserved(offset);
         }
     }
+
+
+    /**
+     * Used internally to round image corners while obeying view padding.
+     */
+    public static class RoundedRectImageView extends ImageView {
+        private int mRadius = 0;
+        private Path mPath = new Path();
+
+        public RoundedRectImageView(Context context) {
+            super(context);
+        }
+
+        public RoundedRectImageView(Context context, AttributeSet attrs) {
+            this(context, attrs, 0);
+        }
+
+        public RoundedRectImageView(Context context, AttributeSet attrs, int defStyleAttr) {
+            this(context, attrs, defStyleAttr, 0);
+        }
+
+        public RoundedRectImageView(Context context, AttributeSet attrs, int defStyleAttr,
+                int defStyleRes) {
+            super(context, attrs, defStyleAttr, defStyleRes);
+            mRadius = context.getResources().getDimensionPixelSize(R.dimen.chooser_corner_radius);
+        }
+
+        private void updatePath(int width, int height) {
+            mPath.reset();
+
+            int imageWidth = width - getPaddingRight();
+            int imageHeight = height - getPaddingBottom();
+            mPath.addRoundRect(getPaddingLeft(), getPaddingTop(), imageWidth, imageHeight, mRadius,
+                    mRadius, Path.Direction.CW);
+        }
+
+        /**
+          * Sets the corner radius on all corners
+          *
+          * param radius 0 for no radius, &gt; 0 for a visible corner radius
+          */
+        public void setRadius(int radius) {
+            mRadius = radius;
+            updatePath(getWidth(), getHeight());
+        }
+
+        @Override
+        protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
+            super.onSizeChanged(width, height, oldWidth, oldHeight);
+            updatePath(width, height);
+        }
+
+        @Override
+        protected void onDraw(Canvas canvas) {
+            if (mRadius != 0) {
+                canvas.clipPath(mPath);
+            }
+
+            super.onDraw(canvas);
+        }
+    }
 }
diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java
index a50c736..0919911 100644
--- a/core/java/com/android/internal/app/ResolverActivity.java
+++ b/core/java/com/android/internal/app/ResolverActivity.java
@@ -1044,7 +1044,10 @@
         }
     }
 
-    public void setTitleAndIcon() {
+    /**
+     * Configure the area above the app selection list (title, content preview, etc).
+     */
+    public void setHeader() {
         if (mAdapter.getCount() == 0 && mAdapter.mPlaceholderCount == 0) {
             final TextView titleView = findViewById(R.id.title);
             if (titleView != null) {
@@ -1062,23 +1065,6 @@
                 titleView.setText(title);
             }
             setTitle(title);
-
-            // Try to initialize the title icon if we have a view for it and a title to match
-            final ImageView titleIcon = findViewById(R.id.title_icon);
-            if (titleIcon != null) {
-                ApplicationInfo ai = null;
-                try {
-                    if (!TextUtils.isEmpty(mReferrerPackage)) {
-                        ai = mPm.getApplicationInfo(mReferrerPackage, 0);
-                    }
-                } catch (NameNotFoundException e) {
-                    Log.e(TAG, "Could not find referrer package " + mReferrerPackage);
-                }
-
-                if (ai != null) {
-                    titleIcon.setImageDrawable(ai.loadIcon(mPm));
-                }
-            }
         }
 
         final ImageView iconView = findViewById(R.id.icon);
@@ -1692,7 +1678,7 @@
                 mPostListReadyRunnable = new Runnable() {
                     @Override
                     public void run() {
-                        setTitleAndIcon();
+                        setHeader();
                         resetButtonBar();
                         onListRebuilt();
                         mPostListReadyRunnable = null;
diff --git a/core/java/com/android/internal/app/procstats/ProcessState.java b/core/java/com/android/internal/app/procstats/ProcessState.java
index 4071c82..0e4897f 100644
--- a/core/java/com/android/internal/app/procstats/ProcessState.java
+++ b/core/java/com/android/internal/app/procstats/ProcessState.java
@@ -77,6 +77,7 @@
         STATE_PERSISTENT,               // ActivityManager.PROCESS_STATE_PERSISTENT
         STATE_PERSISTENT,               // ActivityManager.PROCESS_STATE_PERSISTENT_UI
         STATE_TOP,                      // ActivityManager.PROCESS_STATE_TOP
+        STATE_IMPORTANT_FOREGROUND,     // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE_LOCATION
         STATE_IMPORTANT_FOREGROUND,     // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE
         STATE_IMPORTANT_FOREGROUND,     // ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE
         STATE_IMPORTANT_FOREGROUND,     // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
diff --git a/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java b/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java
index 7a00a51..e19a32e 100644
--- a/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java
+++ b/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java
@@ -38,7 +38,7 @@
         return pulseOnNotificationEnabled(user)
                 || pulseOnLongPressEnabled(user)
                 || alwaysOnEnabled(user)
-                || wakeLockScreenGestureEnabled(user);
+                || wakeScreenGestureEnabled(user);
     }
 
     public boolean pulseOnNotificationEnabled(int user) {
@@ -76,11 +76,6 @@
         return !TextUtils.isEmpty(doubleTapSensorType());
     }
 
-    public boolean wakeLockScreenGestureEnabled(int user) {
-        return boolSettingDefaultOn(Settings.Secure.DOZE_WAKE_LOCK_SCREEN_GESTURE, user)
-                && wakeScreenGestureAvailable();
-    }
-
     public boolean wakeScreenGestureAvailable() {
         return mContext.getResources()
                 .getBoolean(R.bool.config_dozeWakeLockScreenSensorAvailable);
diff --git a/core/java/com/android/internal/net/VpnConfig.java b/core/java/com/android/internal/net/VpnConfig.java
index da8605e..65b974b 100644
--- a/core/java/com/android/internal/net/VpnConfig.java
+++ b/core/java/com/android/internal/net/VpnConfig.java
@@ -104,6 +104,7 @@
     public boolean allowBypass;
     public boolean allowIPv4;
     public boolean allowIPv6;
+    public boolean isMetered = true;
     public Network[] underlyingNetworks;
     public ProxyInfo proxyInfo;
 
@@ -165,6 +166,7 @@
         out.writeInt(allowBypass ? 1 : 0);
         out.writeInt(allowIPv4 ? 1 : 0);
         out.writeInt(allowIPv6 ? 1 : 0);
+        out.writeInt(isMetered ? 1 : 0);
         out.writeTypedArray(underlyingNetworks, flags);
         out.writeParcelable(proxyInfo, flags);
     }
@@ -191,6 +193,7 @@
             config.allowBypass = in.readInt() != 0;
             config.allowIPv4 = in.readInt() != 0;
             config.allowIPv6 = in.readInt() != 0;
+            config.isMetered = in.readInt() != 0;
             config.underlyingNetworks = in.createTypedArray(Network.CREATOR);
             config.proxyInfo = in.readParcelable(null);
             return config;
diff --git a/core/java/com/android/internal/os/AppZygoteInit.java b/core/java/com/android/internal/os/AppZygoteInit.java
index afe6dad..0e83e41 100644
--- a/core/java/com/android/internal/os/AppZygoteInit.java
+++ b/core/java/com/android/internal/os/AppZygoteInit.java
@@ -17,13 +17,15 @@
 package com.android.internal.os;
 
 import android.app.LoadedApk;
+import android.app.ZygotePreload;
+import android.content.ComponentName;
 import android.content.pm.ApplicationInfo;
 import android.net.LocalSocket;
 import android.util.Log;
 
 import java.io.DataOutputStream;
 import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
 
 /**
@@ -73,20 +75,32 @@
             Log.i(TAG, "Beginning application preload for " + appInfo.packageName);
             LoadedApk loadedApk = new LoadedApk(null, appInfo, null, null, false, true, false);
             ClassLoader loader = loadedApk.getClassLoader();
-            Class<?> cl;
-            Method m;
-            try {
-                cl = Class.forName(appInfo.packageName + ".ZygotePreload", true, loader);
-                m = cl.getMethod("doPreload");
-                m.setAccessible(true);
-                m.invoke(null);
-            } catch (ClassNotFoundException e) {
-                // Don't treat this as an error since an app may not want to do any preloads
-                Log.w(TAG, "No ZygotePreload class found for " + appInfo.packageName);
-            } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
-                Log.e(TAG, "AppZygote application preload failed for "
-                        + appInfo.packageName, e);
+
+            Zygote.allowAppFilesAcrossFork(appInfo);
+
+            if (appInfo.zygotePreloadName != null) {
+                Class<?> cl;
+                Method m;
+                try {
+                    ComponentName preloadName = ComponentName.createRelative(appInfo.packageName,
+                            appInfo.zygotePreloadName);
+                    cl = Class.forName(preloadName.getClassName(), true, loader);
+                    if (!ZygotePreload.class.isAssignableFrom(cl)) {
+                        Log.e(TAG, preloadName.getClassName() + " does not implement "
+                                + ZygotePreload.class.getName());
+                    } else {
+                        Constructor<?> ctor = cl.getConstructor();
+                        ZygotePreload preloadObject = (ZygotePreload) ctor.newInstance();
+                        preloadObject.doPreload(appInfo);
+                    }
+                } catch (ReflectiveOperationException e) {
+                    Log.e(TAG, "AppZygote application preload failed for "
+                            + appInfo.zygotePreloadName, e);
+                }
+            } else {
+                Log.i(TAG, "No zygotePreloadName attribute specified.");
             }
+
             try {
                 DataOutputStream socketOut = getSocketOutputStream();
                 socketOut.writeInt(loader != null ? 1 : 0);
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index c6afee2..650a194 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -9795,7 +9795,7 @@
             int uidRunningState;
             // Make special note of Foreground Services
             final boolean userAwareService =
-                    (procState == ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
+                    (ActivityManager.isForegroundService(procState));
             uidRunningState = BatteryStats.mapToInternalProcessState(procState);
 
             if (mProcessState == uidRunningState && userAwareService == mInForegroundService) {
diff --git a/core/java/com/android/internal/os/ChildZygoteInit.java b/core/java/com/android/internal/os/ChildZygoteInit.java
index a052a3b..cc74863 100644
--- a/core/java/com/android/internal/os/ChildZygoteInit.java
+++ b/core/java/com/android/internal/os/ChildZygoteInit.java
@@ -98,9 +98,11 @@
             throw new RuntimeException("Passed in UID range is invalid, min > max.");
         }
 
-        // Verify the UIDs are in the isolated UID range, as that's the only thing that we should
-        // be forking right now
-        if (!Process.isIsolated(uidGidMin) || !Process.isIsolated(uidGidMax)) {
+        // Verify the UIDs at least do not include system UIDs; we can't easily verify there
+        // are just isolated UIDs in the range, because for the webview zygote, there is no
+        // single range that captures all possible isolated UIDs.
+        // TODO(b/123615476) narrow this down
+        if (uidGidMin < Process.FIRST_ISOLATED_UID) {
             throw new RuntimeException("Passed in UID range does not map to isolated processes.");
         }
 
diff --git a/core/java/com/android/internal/os/KernelCpuThreadReader.java b/core/java/com/android/internal/os/KernelCpuThreadReader.java
index 2742b7c..b1328e8 100644
--- a/core/java/com/android/internal/os/KernelCpuThreadReader.java
+++ b/core/java/com/android/internal/os/KernelCpuThreadReader.java
@@ -37,9 +37,10 @@
  * frequency band.
  *
  * <p>Frequencies are bucketed together to reduce the amount of data created. This means that we
- * return {@link #NUM_BUCKETS} frequencies instead of the full number. Frequencies are reported as
- * the lowest frequency in that range. Frequencies are spread as evenly as possible across the
- * buckets. The buckets do not cross over the little/big frequencies reported.
+ * return less frequencies than provided by {@link ProcTimeInStateReader}. The number of
+ * frequencies is configurable by {@link #setNumBuckets}. Frequencies are reported as the lowest
+ * frequency in that range. Frequencies are spread as evenly as possible across the buckets. The
+ * buckets do not cross over the little/big frequencies reported.
  *
  * <p>N.B.: In order to bucket across little/big frequencies correctly, we assume that the {@code
  * time_in_state} file contains every little core frequency in ascending order, followed by every
@@ -97,22 +98,17 @@
             DEFAULT_PROC_PATH.resolve("self/time_in_state");
 
     /**
-     * Number of frequency buckets
-     */
-    private static final int NUM_BUCKETS = 8;
-
-    /**
-     * Default predicate for what UIDs to check for when getting processes. This filters to only
-     * select UID 1000 (the {@code system} user)
-     */
-    private static final Predicate<Integer> DEFAULT_UID_PREDICATE = uid -> uid == 1000;
-
-    /**
      * Value returned when there was an error getting an integer ID value (e.g. PID, UID)
      */
     private static final int ID_ERROR = -1;
 
     /**
+     * When checking whether to report data for a thread, we check the UID of the thread's owner
+     * against this predicate
+     */
+    private Predicate<Integer> mUidPredicate;
+
+    /**
      * Where the proc filesystem is mounted
      */
     private final Path mProcPath;
@@ -121,7 +117,7 @@
      * Frequencies read from the {@code time_in_state} file. Read from {@link
      * #mProcTimeInStateReader#getCpuFrequenciesKhz()} and cast to {@code int[]}
      */
-    private final int[] mFrequenciesKhz;
+    private int[] mFrequenciesKhz;
 
     /**
      * Used to read and parse {@code time_in_state} files
@@ -131,17 +127,10 @@
     /**
      * Used to sort frequencies and usage times into buckets
      */
-    private final FrequencyBucketCreator mFrequencyBucketCreator;
+    private FrequencyBucketCreator mFrequencyBucketCreator;
 
     private final Injector mInjector;
 
-    private KernelCpuThreadReader() throws IOException {
-        this(
-                DEFAULT_PROC_PATH,
-                DEFAULT_INITIAL_TIME_IN_STATE_PATH,
-                new Injector());
-    }
-
     /**
      * Create with a path where `proc` is mounted. Used primarily for testing
      *
@@ -151,17 +140,16 @@
      */
     @VisibleForTesting
     public KernelCpuThreadReader(
+            int numBuckets,
+            Predicate<Integer> uidPredicate,
             Path procPath,
             Path initialTimeInStatePath,
             Injector injector) throws IOException {
+        mUidPredicate = uidPredicate;
         mProcPath = procPath;
         mProcTimeInStateReader = new ProcTimeInStateReader(initialTimeInStatePath);
         mInjector = injector;
-
-        // Copy mProcTimeInState's frequencies and initialize bucketing
-        final long[] frequenciesKhz = mProcTimeInStateReader.getFrequenciesKhz();
-        mFrequencyBucketCreator = new FrequencyBucketCreator(frequenciesKhz, NUM_BUCKETS);
-        mFrequenciesKhz = mFrequencyBucketCreator.getBucketMinFrequencies(frequenciesKhz);
+        setNumBuckets(numBuckets);
     }
 
     /**
@@ -170,9 +158,14 @@
      * @return the reader, null if an exception was thrown during creation
      */
     @Nullable
-    public static KernelCpuThreadReader create() {
+    public static KernelCpuThreadReader create(int numBuckets, Predicate<Integer> uidPredicate) {
         try {
-            return new KernelCpuThreadReader();
+            return new KernelCpuThreadReader(
+                    numBuckets,
+                    uidPredicate,
+                    DEFAULT_PROC_PATH,
+                    DEFAULT_INITIAL_TIME_IN_STATE_PATH,
+                    new Injector());
         } catch (IOException e) {
             Slog.e(TAG, "Failed to initialize KernelCpuThreadReader", e);
             return null;
@@ -180,14 +173,6 @@
     }
 
     /**
-     * Get the per-thread CPU usage of all processes belonging to UIDs between {@code [1000, 2000)}
-     */
-    @Nullable
-    public ArrayList<ProcessCpuUsage> getProcessCpuUsageByUids() {
-        return getProcessCpuUsageByUids(DEFAULT_UID_PREDICATE);
-    }
-
-    /**
      * Get the per-thread CPU usage of all processes belonging to a set of UIDs
      *
      * <p>This function will crawl through all process {@code proc} directories found by the pattern
@@ -195,10 +180,11 @@
      * approximately 500ms on a Pixel 2. Therefore, this method can be computationally expensive,
      * and should not be called more than once an hour.
      *
-     * @param uidPredicate only get usage from processes owned by UIDs that match this predicate
+     * <p>Data is only collected for UIDs passing the predicate supplied in {@link
+     * #setUidPredicate}.
      */
     @Nullable
-    public ArrayList<ProcessCpuUsage> getProcessCpuUsageByUids(Predicate<Integer> uidPredicate) {
+    public ArrayList<ProcessCpuUsage> getProcessCpuUsageByUids() {
         if (DEBUG) {
             Slog.d(TAG, "Reading CPU thread usages for processes owned by UIDs");
         }
@@ -213,7 +199,7 @@
                 if (uid == ID_ERROR || processId == ID_ERROR) {
                     continue;
                 }
-                if (!uidPredicate.test(uid)) {
+                if (!mUidPredicate.test(uid)) {
                     continue;
                 }
 
@@ -247,10 +233,7 @@
      */
     @Nullable
     public ProcessCpuUsage getCurrentProcessCpuUsage() {
-        return getProcessCpuUsage(
-                mProcPath.resolve("self"),
-                mInjector.myPid(),
-                mInjector.myUid());
+        return getProcessCpuUsage(mProcPath.resolve("self"), mInjector.myPid(), mInjector.myUid());
     }
 
     /**
@@ -300,6 +283,31 @@
     }
 
     /**
+     * Set the number of frequency buckets to use
+     */
+    void setNumBuckets(int numBuckets) {
+        if (numBuckets < 1) {
+            Slog.w(TAG, "Number of buckets must be at least 1, but was " + numBuckets);
+            return;
+        }
+        // If `numBuckets` hasn't changed since the last set, do nothing
+        if (mFrequenciesKhz != null && mFrequenciesKhz.length == numBuckets) {
+            return;
+        }
+        mFrequencyBucketCreator = new FrequencyBucketCreator(
+                mProcTimeInStateReader.getFrequenciesKhz(), numBuckets);
+        mFrequenciesKhz = mFrequencyBucketCreator.getBucketMinFrequencies(
+                mProcTimeInStateReader.getFrequenciesKhz());
+    }
+
+    /**
+     * Set the UID predicate for {@link #getProcessCpuUsageByUids}
+     */
+    void setUidPredicate(Predicate<Integer> uidPredicate) {
+        mUidPredicate = uidPredicate;
+    }
+
+    /**
      * Get the CPU frequencies that correspond to the times reported in
      * {@link ThreadCpuUsage#usageTimesMillis}
      */
diff --git a/core/java/com/android/internal/os/KernelCpuThreadReaderSettingsObserver.java b/core/java/com/android/internal/os/KernelCpuThreadReaderSettingsObserver.java
new file mode 100644
index 0000000..77f6a17
--- /dev/null
+++ b/core/java/com/android/internal/os/KernelCpuThreadReaderSettingsObserver.java
@@ -0,0 +1,182 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.os;
+
+import android.annotation.Nullable;
+import android.content.Context;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.util.KeyValueListParser;
+import android.util.Range;
+import android.util.Slog;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Predicate;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Service that handles settings for {@link KernelCpuThreadReader}
+ *
+ * <p>N.B.: The `collected_uids` setting takes a string representation of what UIDs to collect data
+ * for. A string representation is used as we will want to express UID ranges, therefore an integer
+ * array could not be used. The format of the string representation is detailed here: {@link
+ * UidPredicate#fromString}.
+ *
+ * @hide Only for use within the system server
+ */
+public class KernelCpuThreadReaderSettingsObserver extends ContentObserver {
+    private static final String TAG = "KernelCpuThreadReaderSettingsObserver";
+
+    /**
+     * The number of frequency buckets to report
+     */
+    private static final String NUM_BUCKETS_SETTINGS_KEY = "num_buckets";
+    private static final int NUM_BUCKETS_DEFAULT = 8;
+
+    /**
+     * List of UIDs to report data for
+     */
+    private static final String COLLECTED_UIDS_SETTINGS_KEY = "collected_uids";
+    private static final String COLLECTED_UIDS_DEFAULT = "1000-1000";
+
+    private final Context mContext;
+
+    @Nullable
+    private final KernelCpuThreadReader mKernelCpuThreadReader;
+
+    /**
+     * @return returns a created {@link KernelCpuThreadReader} that will be modified by any
+     * change in settings, returns null if creation failed
+     */
+    @Nullable
+    public static KernelCpuThreadReader getSettingsModifiedReader(Context context) {
+        // Create the observer
+        KernelCpuThreadReaderSettingsObserver settingsObserver =
+                new KernelCpuThreadReaderSettingsObserver(context);
+        // Register the observer to listen for setting changes
+        Uri settingsUri =
+                Settings.Global.getUriFor(Settings.Global.KERNEL_CPU_THREAD_READER);
+        context.getContentResolver().registerContentObserver(
+                settingsUri, false, settingsObserver, UserHandle.USER_SYSTEM);
+        // Return the observer's reader
+        return settingsObserver.mKernelCpuThreadReader;
+    }
+
+    private KernelCpuThreadReaderSettingsObserver(Context context) {
+        super(BackgroundThread.getHandler());
+        mContext = context;
+        mKernelCpuThreadReader = KernelCpuThreadReader.create(
+                NUM_BUCKETS_DEFAULT,
+                UidPredicate.fromString(COLLECTED_UIDS_DEFAULT));
+    }
+
+    @Override
+    public void onChange(boolean selfChange, Uri uri, int userId) {
+        updateReader();
+    }
+
+    /**
+     * Update the reader with new settings
+     */
+    private void updateReader() {
+        if (mKernelCpuThreadReader == null) {
+            return;
+        }
+
+        final KeyValueListParser parser = new KeyValueListParser(',');
+        try {
+            parser.setString(Settings.Global.getString(
+                    mContext.getContentResolver(), Settings.Global.KERNEL_CPU_THREAD_READER));
+        } catch (IllegalArgumentException e) {
+            Slog.e(TAG, "Bad settings", e);
+            return;
+        }
+
+        final UidPredicate uidPredicate;
+        try {
+            uidPredicate = UidPredicate.fromString(
+                    parser.getString(COLLECTED_UIDS_SETTINGS_KEY, COLLECTED_UIDS_DEFAULT));
+        } catch (NumberFormatException e) {
+            Slog.w(TAG, "Failed to get UID predicate", e);
+            return;
+        }
+
+        mKernelCpuThreadReader.setNumBuckets(
+                parser.getInt(NUM_BUCKETS_SETTINGS_KEY, NUM_BUCKETS_DEFAULT));
+        mKernelCpuThreadReader.setUidPredicate(uidPredicate);
+    }
+
+    /**
+     * Check whether a UID belongs to a set of UIDs
+     */
+    @VisibleForTesting
+    public static class UidPredicate implements Predicate<Integer> {
+        private static final Pattern UID_RANGE_PATTERN = Pattern.compile("([0-9]+)-([0-9]+)");
+        private static final String UID_SPECIFIER_DELIMITER = ";";
+        private final List<Range<Integer>> mAcceptedUidRanges;
+
+        /**
+         * Create a UID predicate from a string representing a list of UID ranges
+         *
+         * <p>UID ranges are a pair of integers separated by a '-'. If you want to specify a single
+         * UID (e.g. UID 1000), you can use {@code 1000-1000}. Lists of ranges are separated by
+         * a single ';'. For example, this would be a valid string representation: {@code
+         * "1000-1999;2003-2003;2004-2004;2050-2060"}.
+         *
+         * <p>We do not use ',' to delimit as it is already used in separating different setting
+         * arguments.
+         *
+         * @throws NumberFormatException    if the input string is incorrectly formatted
+         * @throws IllegalArgumentException if an UID range has a lower end than start
+         */
+        @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+        public static UidPredicate fromString(String predicateString) throws NumberFormatException {
+            final List<Range<Integer>> acceptedUidRanges = new ArrayList<>();
+            for (String uidSpecifier : predicateString.split(UID_SPECIFIER_DELIMITER)) {
+                final Matcher uidRangeMatcher = UID_RANGE_PATTERN.matcher(uidSpecifier);
+                if (!uidRangeMatcher.matches()) {
+                    throw new NumberFormatException(
+                            "Failed to recognize as number range: " + uidSpecifier);
+                }
+                acceptedUidRanges.add(Range.create(
+                        Integer.parseInt(uidRangeMatcher.group(1)),
+                        Integer.parseInt(uidRangeMatcher.group(2))));
+            }
+            return new UidPredicate(acceptedUidRanges);
+        }
+
+        private UidPredicate(List<Range<Integer>> acceptedUidRanges) {
+            mAcceptedUidRanges = acceptedUidRanges;
+        }
+
+        @Override
+        public boolean test(Integer uid) {
+            for (int i = 0; i < mAcceptedUidRanges.size(); i++) {
+                if (mAcceptedUidRanges.get(i).contains(uid)) {
+                    return true;
+                }
+            }
+            return false;
+        }
+    }
+}
diff --git a/core/java/com/android/internal/os/OWNERS b/core/java/com/android/internal/os/OWNERS
new file mode 100644
index 0000000..9283105
--- /dev/null
+++ b/core/java/com/android/internal/os/OWNERS
@@ -0,0 +1 @@
+per-file ZygoteArguments.java,ZygoteConnection.java,ZygoteInit.java,Zygote.java,ZygoteServer.java = chriswailes@google.com, ngeoffray@google.com, sehr@google.com, narayan@google.com, maco@google.com
diff --git a/core/java/com/android/internal/os/RoSystemProperties.java b/core/java/com/android/internal/os/RoSystemProperties.java
index b529bbe..f4902d4 100644
--- a/core/java/com/android/internal/os/RoSystemProperties.java
+++ b/core/java/com/android/internal/os/RoSystemProperties.java
@@ -17,6 +17,7 @@
 package com.android.internal.os;
 
 import android.os.SystemProperties;
+import android.sysprop.CryptoProperties;
 
 /**
  * This is a cache of various ro.* properties so that they can be read just once
@@ -61,7 +62,7 @@
 
     // ------ ro.crypto.* -------- //
     public static final String CRYPTO_STATE = SystemProperties.get("ro.crypto.state");
-    public static final String CRYPTO_TYPE = SystemProperties.get("ro.crypto.type");
+    public static final String CRYPTO_TYPE = CryptoProperties.type().orElse("");
     // These are pseudo-properties
     public static final boolean CRYPTO_ENCRYPTABLE =
             !CRYPTO_STATE.isEmpty() && !"unsupported".equals(CRYPTO_STATE);
diff --git a/core/java/com/android/internal/os/WebViewZygoteInit.java b/core/java/com/android/internal/os/WebViewZygoteInit.java
index c8d30b2..9ed7384 100644
--- a/core/java/com/android/internal/os/WebViewZygoteInit.java
+++ b/core/java/com/android/internal/os/WebViewZygoteInit.java
@@ -78,18 +78,7 @@
             ClassLoader loader = loadedApk.getClassLoader();
             doPreload(loader, WebViewFactory.getWebViewLibrary(appInfo));
 
-            // Add the APK to the Zygote's list of allowed files for children.
-            Zygote.nativeAllowFileAcrossFork(appInfo.sourceDir);
-            if (appInfo.splitSourceDirs != null) {
-                for (String path : appInfo.splitSourceDirs) {
-                    Zygote.nativeAllowFileAcrossFork(path);
-                }
-            }
-            if (appInfo.sharedLibraryFiles != null) {
-                for (String path : appInfo.sharedLibraryFiles) {
-                    Zygote.nativeAllowFileAcrossFork(path);
-                }
-            }
+            Zygote.allowAppFilesAcrossFork(appInfo);
 
             Log.i(TAG, "Application preload done");
         }
diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java
index 069413f..b881aef 100644
--- a/core/java/com/android/internal/os/Zygote.java
+++ b/core/java/com/android/internal/os/Zygote.java
@@ -20,6 +20,7 @@
 
 import static com.android.internal.os.ZygoteConnectionConstants.MAX_ZYGOTE_ARGC;
 
+import android.content.pm.ApplicationInfo;
 import android.net.Credentials;
 import android.net.LocalServerSocket;
 import android.net.LocalSocket;
@@ -93,6 +94,11 @@
      */
     public static final int PROFILE_SYSTEM_SERVER = 1 << 14;
 
+    /**
+     * Enable profiling from shell.
+     */
+    public static final int PROFILE_FROM_SHELL = 1 << 15;
+
     /** No external storage should be mounted. */
     public static final int MOUNT_EXTERNAL_NONE = IVold.REMOUNT_MODE_NONE;
     /** Default external storage should be mounted. */
@@ -132,8 +138,6 @@
      * */
     protected static FileDescriptor sBlastulaPoolEventFD;
 
-    private static final ZygoteHooks VM_HOOKS = new ZygoteHooks();
-
     /**
      * An extraArg passed when a zygote process is forking a child-zygote, specifying a name
      * in the abstract socket namespace. This socket name is what the new child zygote
@@ -246,7 +250,7 @@
             int[][] rlimits, int mountExternal, String seInfo, String niceName, int[] fdsToClose,
             int[] fdsToIgnore, boolean startChildZygote, String instructionSet, String appDataDir,
             String packageName, String[] packagesForUID, String[] visibleVolIDs) {
-        VM_HOOKS.preFork();
+        ZygoteHooks.preFork();
         // Resets nice priority for zygote process.
         resetNicePriority();
         int pid = nativeForkAndSpecialize(
@@ -260,7 +264,7 @@
             // Note that this event ends at the end of handleChildProc,
             Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "PostFork");
         }
-        VM_HOOKS.postForkCommon();
+        ZygoteHooks.postForkCommon();
         return pid;
     }
 
@@ -311,7 +315,7 @@
          *
          * TODO (chriswailes): Look into moving this to immediately after the fork.
          */
-        VM_HOOKS.postForkCommon();
+        ZygoteHooks.postForkCommon();
     }
 
     private static native void nativeSpecializeBlastula(int uid, int gid, int[] gids,
@@ -349,7 +353,7 @@
      */
     public static int forkSystemServer(int uid, int gid, int[] gids, int runtimeFlags,
             int[][] rlimits, long permittedCapabilities, long effectiveCapabilities) {
-        VM_HOOKS.preFork();
+        ZygoteHooks.preFork();
         // Resets nice priority for zygote process.
         resetNicePriority();
         int pid = nativeForkSystemServer(
@@ -359,7 +363,7 @@
         if (pid == 0) {
             Trace.setTracingEnabled(true, runtimeFlags);
         }
-        VM_HOOKS.postForkCommon();
+        ZygoteHooks.postForkCommon();
         return pid;
     }
 
@@ -372,6 +376,27 @@
     protected static native void nativeAllowFileAcrossFork(String path);
 
     /**
+     * Lets children of the zygote inherit open file descriptors that belong to the
+     * ApplicationInfo that is passed in.
+     *
+     * @param appInfo ApplicationInfo of the application
+     */
+    protected static void allowAppFilesAcrossFork(ApplicationInfo appInfo) {
+        Zygote.nativeAllowFileAcrossFork(appInfo.sourceDir);
+        if (appInfo.splitSourceDirs != null) {
+            for (String path : appInfo.splitSourceDirs) {
+                Zygote.nativeAllowFileAcrossFork(path);
+            }
+        }
+        // As well as its shared libs
+        if (appInfo.sharedLibraryFiles != null) {
+            for (String path : appInfo.sharedLibraryFiles) {
+                Zygote.nativeAllowFileAcrossFork(path);
+            }
+        }
+    }
+
+    /**
      * Installs a seccomp filter that limits setresuid()/setresgid() to the passed-in range
      * @param uidGidMin The smallest allowed uid/gid
      * @param uidGidMax The largest allowed uid/gid
@@ -434,7 +459,7 @@
 
             // Disable some VM functionality and reset some system values
             // before forking.
-            VM_HOOKS.preFork();
+            ZygoteHooks.preFork();
             resetNicePriority();
 
             while (blastulaPoolCount++ < sBlastulaPoolMax) {
@@ -447,7 +472,7 @@
 
             // Re-enable runtime services for the Zygote.  Blastula services
             // are re-enabled in specializeBlastula.
-            VM_HOOKS.postForkCommon();
+            ZygoteHooks.postForkCommon();
 
             Log.i("zygote", "Filled the blastula pool. New blastulas: " + numBlastulasToSpawn);
         }
@@ -864,12 +889,12 @@
 
     private static void callPostForkSystemServerHooks() {
         // SystemServer specific post fork hooks run before child post fork hooks.
-        VM_HOOKS.postForkSystemServer();
+        ZygoteHooks.postForkSystemServer();
     }
 
     private static void callPostForkChildHooks(int runtimeFlags, boolean isSystemServer,
             boolean isZygote, String instructionSet) {
-        VM_HOOKS.postForkChild(runtimeFlags, isSystemServer, isZygote, instructionSet);
+        ZygoteHooks.postForkChild(runtimeFlags, isSystemServer, isZygote, instructionSet);
     }
 
     /**
diff --git a/core/java/com/android/internal/os/ZygoteConnection.java b/core/java/com/android/internal/os/ZygoteConnection.java
index ffbe8eb..9ba56b8 100644
--- a/core/java/com/android/internal/os/ZygoteConnection.java
+++ b/core/java/com/android/internal/os/ZygoteConnection.java
@@ -27,6 +27,7 @@
 import static com.android.internal.os.ZygoteConnectionConstants.WRAPPED_PID_TIMEOUT_MILLIS;
 
 import android.content.pm.ApplicationInfo;
+import android.metrics.LogMaker;
 import android.net.Credentials;
 import android.net.LocalSocket;
 import android.os.Parcel;
@@ -37,6 +38,9 @@
 import android.system.StructPollfd;
 import android.util.Log;
 
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+
 import dalvik.system.VMRuntime;
 
 import libcore.io.IoUtils;
@@ -330,9 +334,43 @@
         }
     }
 
-    private void handleHiddenApiAccessLogSampleRate(int percent) {
+    private class HiddenApiUsageLogger implements VMRuntime.HiddenApiUsageLogger {
+
+        private final MetricsLogger mMetricsLogger = new MetricsLogger();
+
+        public void hiddenApiUsed(String packageName, String signature,
+                int accessMethod, boolean accessDenied) {
+            int accessMethodMetric = HiddenApiUsageLogger.ACCESS_METHOD_NONE;
+            switch(accessMethod) {
+                case HiddenApiUsageLogger.ACCESS_METHOD_NONE:
+                    accessMethodMetric = MetricsEvent.ACCESS_METHOD_NONE;
+                    break;
+                case HiddenApiUsageLogger.ACCESS_METHOD_REFLECTION:
+                    accessMethodMetric = MetricsEvent.ACCESS_METHOD_REFLECTION;
+                    break;
+                case HiddenApiUsageLogger.ACCESS_METHOD_JNI:
+                    accessMethodMetric = MetricsEvent.ACCESS_METHOD_JNI;
+                    break;
+                case HiddenApiUsageLogger.ACCESS_METHOD_LINKING:
+                    accessMethodMetric = MetricsEvent.ACCESS_METHOD_LINKING;
+                    break;
+            }
+            LogMaker logMaker = new LogMaker(MetricsEvent.ACTION_HIDDEN_API_ACCESSED)
+                    .setPackageName(packageName)
+                    .addTaggedData(MetricsEvent.FIELD_HIDDEN_API_SIGNATURE, signature)
+                    .addTaggedData(MetricsEvent.FIELD_HIDDEN_API_ACCESS_METHOD,
+                        accessMethodMetric);
+            if (accessDenied) {
+                logMaker.addTaggedData(MetricsEvent.FIELD_HIDDEN_API_ACCESS_DENIED, 1);
+            }
+            mMetricsLogger.write(logMaker);
+        }
+    }
+
+    private void handleHiddenApiAccessLogSampleRate(int samplingRate) {
         try {
-            ZygoteInit.setHiddenApiAccessLogSampleRate(percent);
+            ZygoteInit.setHiddenApiAccessLogSampleRate(samplingRate);
+            ZygoteInit.setHiddenApiUsageLogger(new HiddenApiUsageLogger());
             mSocketOutStream.writeInt(0);
         } catch (IOException ioe) {
             throw new IllegalStateException("Error writing to command socket", ioe);
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index e3e55ed..9f23797 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -533,6 +533,14 @@
     }
 
     /**
+     * Sets the implementation to be used for logging hidden API accesses
+     * @param logger the implementation of the VMRuntime.HiddenApiUsageLogger interface
+     */
+    public static void setHiddenApiUsageLogger(VMRuntime.HiddenApiUsageLogger logger) {
+        VMRuntime.getRuntime().setHiddenApiUsageLogger(logger);
+    }
+
+    /**
      * Creates a PathClassLoader for the given class path that is associated with a shared
      * namespace, i.e., this classloader can access platform-private native libraries. The
      * classloader will use java.library.path as the native library path.
diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java
index d8ee643..69efb2b 100644
--- a/core/java/com/android/internal/policy/PhoneWindow.java
+++ b/core/java/com/android/internal/policy/PhoneWindow.java
@@ -41,7 +41,6 @@
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.res.Configuration;
-import android.content.res.Resources;
 import android.content.res.Resources.Theme;
 import android.content.res.TypedArray;
 import android.graphics.Color;
@@ -1885,7 +1884,8 @@
                 // If we have a session send it the volume command, otherwise
                 // use the suggested stream.
                 if (mMediaController != null) {
-                    mMediaController.dispatchVolumeButtonEventAsSystemService(event);
+                    getMediaSessionManager().dispatchVolumeKeyEventAsSystemService(
+                            mMediaController.getSessionToken(), event);
                 } else {
                     getMediaSessionManager().dispatchVolumeKeyEventAsSystemService(event,
                             mVolumeControlStreamType);
@@ -1906,7 +1906,8 @@
             case KeyEvent.KEYCODE_MEDIA_RECORD:
             case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: {
                 if (mMediaController != null) {
-                    if (mMediaController.dispatchMediaButtonEventAsSystemService(event)) {
+                    if (getMediaSessionManager().dispatchMediaKeyEventAsSystemService(
+                            mMediaController.getSessionToken(), event)) {
                         return true;
                     }
                 }
@@ -1977,7 +1978,8 @@
                 // If we have a session send it the volume command, otherwise
                 // use the suggested stream.
                 if (mMediaController != null) {
-                    mMediaController.dispatchVolumeButtonEventAsSystemService(event);
+                    getMediaSessionManager().dispatchVolumeKeyEventAsSystemService(
+                            mMediaController.getSessionToken(), event);
                 } else {
                     getMediaSessionManager().dispatchVolumeKeyEventAsSystemService(
                             event, mVolumeControlStreamType);
@@ -2007,7 +2009,8 @@
             case KeyEvent.KEYCODE_MEDIA_RECORD:
             case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: {
                 if (mMediaController != null) {
-                    if (mMediaController.dispatchMediaButtonEventAsSystemService(event)) {
+                    if (getMediaSessionManager().dispatchMediaKeyEventAsSystemService(
+                            mMediaController.getSessionToken(), event)) {
                         return true;
                     }
                 }
diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
index d61f10e..9df37ad 100644
--- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
@@ -38,6 +38,7 @@
     void disableForUser(int what, IBinder token, String pkg, int userId);
     void disable2(int what, IBinder token, String pkg);
     void disable2ForUser(int what, IBinder token, String pkg, int userId);
+    int[] getDisableFlags(IBinder token, int userId);
     void setIcon(String slot, String iconPackage, int iconId, int iconLevel, String contentDescription);
     void setIconVisibility(String slot, boolean visible);
     void removeIcon(String slot);
@@ -69,7 +70,7 @@
     void onNotificationDirectReplied(String key);
     void onNotificationSmartSuggestionsAdded(String key, int smartReplyCount, int smartActionCount,
             boolean generatedByAsssistant);
-    void onNotificationSmartReplySent(in String key, in int replyIndex, in CharSequence reply, boolean generatedByAssistant);
+    void onNotificationSmartReplySent(in String key, in int replyIndex, in CharSequence reply, boolean generatedByAssistant, in int notificationLocation);
     void onNotificationSettingsViewed(String key);
     void setSystemUiVisibility(int displayId, int vis, int mask, String cause);
 
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index 9afd5d0..e7a1c49 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -27,10 +27,6 @@
         "-Wno-error=deprecated-declarations",
         "-Wunused",
         "-Wunreachable-code",
-
-        // TODO: Linear blending should be enabled by default, but we are
-        // TODO: making it an opt-in while it's a work in progress
-        //"-DANDROID_ENABLE_LINEAR_BLENDING",
     ],
 
     cppflags: ["-Wno-conversion-null"],
@@ -301,6 +297,7 @@
         "libhwui",
         "libdl",
         "libstatslog",
+        "server_configurable_flags",
     ],
 
     generated_sources: ["android_util_StatsLog.cpp"],
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index c90071a..49598bb 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -31,6 +31,7 @@
 #include <binder/Parcel.h>
 #include <utils/threads.h>
 #include <cutils/properties.h>
+#include <server_configurable_flags/get_flags.h>
 
 #include <SkGraphics.h>
 
@@ -774,7 +775,17 @@
       addOption("-XX:LowMemoryMode");
     }
 
-    parseRuntimeOption("dalvik.vm.gctype", gctypeOptsBuf, "-Xgc:");
+    std::string gc_type_override =
+            server_configurable_flags::GetServerConfigurableFlag("runtime_native", "gctype", "");
+    std::string gc_type_override_temp;
+    if (gc_type_override.empty()) {
+        parseRuntimeOption("dalvik.vm.gctype", gctypeOptsBuf, "-Xgc:");
+    } else {
+        // Copy the string so it doesn't go out of scope since addOption does not make a copy.
+        gc_type_override_temp = "-Xgc:" + gc_type_override;
+        addOption(gc_type_override_temp.c_str());
+    }
+
     parseRuntimeOption("dalvik.vm.backgroundgctype", backgroundgcOptsBuf, "-XX:BackgroundGC=");
 
     /*
diff --git a/core/jni/OWNERS b/core/jni/OWNERS
index a365a56..86342c4 100644
--- a/core/jni/OWNERS
+++ b/core/jni/OWNERS
@@ -4,3 +4,6 @@
 
 # Connectivity
 per-file android_net_* = ek@google.com, lorenzo@google.com, satk@google.com
+
+# Zygote
+per-file com_android_inernal_os_Zygote.*,fd_utils.* = chriswailes@google.com, ngeoffray@google.com, sehr@google.com, narayan@google.com, maco@google.com
diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp
index 5de0883..e817217 100755
--- a/core/jni/android/graphics/Bitmap.cpp
+++ b/core/jni/android/graphics/Bitmap.cpp
@@ -93,6 +93,11 @@
         mBitmap->setAlphaType(alphaType);
     }
 
+    void setColorSpace(sk_sp<SkColorSpace> colorSpace) {
+        assertValid();
+        mBitmap->setColorSpace(colorSpace);
+    }
+
     const SkImageInfo& info() {
         if (mBitmap) {
             return mBitmap->info();
@@ -959,6 +964,12 @@
     return JNI_TRUE;
 }
 
+static void Bitmap_setColorSpace(JNIEnv* env, jobject, jlong bitmapHandle, jlong colorSpacePtr) {
+    LocalScopedBitmap bitmapHolder(bitmapHandle);
+    sk_sp<SkColorSpace> cs = GraphicsJNI::getNativeColorSpace(colorSpacePtr);
+    bitmapHolder->setColorSpace(cs);
+}
+
 ///////////////////////////////////////////////////////////////////////////////
 
 static jint Bitmap_getPixel(JNIEnv* env, jobject, jlong bitmapHandle,
@@ -975,6 +986,19 @@
     return static_cast<jint>(dst);
 }
 
+static jlong Bitmap_getColor(JNIEnv* env, jobject, jlong bitmapHandle,
+        jint x, jint y) {
+    SkBitmap bitmap;
+    reinterpret_cast<BitmapWrapper*>(bitmapHandle)->getSkBitmap(&bitmap);
+
+    SkImageInfo dstInfo = SkImageInfo::Make(
+            1, 1, kRGBA_F16_SkColorType, kUnpremul_SkAlphaType, bitmap.refColorSpace());
+
+    uint64_t dst;
+    bitmap.readPixels(dstInfo, &dst, dstInfo.minRowBytes(), x, y);
+    return static_cast<jlong>(dst);
+}
+
 static void Bitmap_getPixels(JNIEnv* env, jobject, jlong bitmapHandle,
         jintArray pixelArray, jint offset, jint stride,
         jint x, jint y, jint width, jint height) {
@@ -1125,19 +1149,6 @@
     return createBitmap(env, bitmap.release(), getPremulBitmapCreateFlags(false));
 }
 
-static jobject Bitmap_createHardwareBitmap(JNIEnv* env, jobject, jobject graphicBuffer) {
-    sp<GraphicBuffer> buffer(graphicBufferForJavaObject(env, graphicBuffer));
-    // To support any color space, we need to pass an additional ColorSpace argument to
-    // java Bitmap.createHardwareBitmap.
-    SkColorType ct = uirenderer::PixelFormatToColorType(buffer->getPixelFormat());
-    sk_sp<Bitmap> bitmap = Bitmap::createFrom(buffer, ct, SkColorSpace::MakeSRGB());
-    if (!bitmap.get()) {
-        ALOGW("failed to create hardware bitmap from graphic buffer");
-        return NULL;
-    }
-    return bitmap::createBitmap(env, bitmap.release(), getPremulBitmapCreateFlags(false));
-}
-
 static jobject Bitmap_wrapHardwareBufferBitmap(JNIEnv* env, jobject, jobject hardwareBuffer,
                                                jlong colorSpacePtr) {
     AHardwareBuffer* hwBuf = android_hardware_HardwareBuffer_getNativeHardwareBuffer(env,
@@ -1220,6 +1231,7 @@
         (void*)Bitmap_extractAlpha },
     {   "nativeGenerationId",       "(J)I", (void*)Bitmap_getGenerationId },
     {   "nativeGetPixel",           "(JII)I", (void*)Bitmap_getPixel },
+    {   "nativeGetColor",           "(JII)J", (void*)Bitmap_getColor },
     {   "nativeGetPixels",          "(J[IIIIIII)V", (void*)Bitmap_getPixels },
     {   "nativeSetPixel",           "(JIII)V", (void*)Bitmap_setPixel },
     {   "nativeSetPixels",          "(J[IIIIIII)V", (void*)Bitmap_setPixels },
@@ -1232,13 +1244,12 @@
     {   "nativeGetAllocationByteCount", "(J)I", (void*)Bitmap_getAllocationByteCount },
     {   "nativeCopyPreserveInternalConfig", "(J)Landroid/graphics/Bitmap;",
         (void*)Bitmap_copyPreserveInternalConfig },
-    {   "nativeCreateHardwareBitmap", "(Landroid/graphics/GraphicBuffer;)Landroid/graphics/Bitmap;",
-        (void*) Bitmap_createHardwareBitmap },
     {   "nativeWrapHardwareBufferBitmap", "(Landroid/hardware/HardwareBuffer;J)Landroid/graphics/Bitmap;",
         (void*) Bitmap_wrapHardwareBufferBitmap },
     {   "nativeCreateGraphicBufferHandle", "(J)Landroid/graphics/GraphicBuffer;",
         (void*) Bitmap_createGraphicBufferHandle },
     {   "nativeGetColorSpace",      "(J[F[F)Z", (void*)Bitmap_getColorSpace },
+    {   "nativeSetColorSpace",      "(JJ)V", (void*)Bitmap_setColorSpace },
     {   "nativeIsSRGB",             "(J)Z", (void*)Bitmap_isSRGB },
     {   "nativeIsSRGBLinear",       "(J)Z", (void*)Bitmap_isSRGBLinear},
     {   "nativeCopyColorSpace",     "(JJ)V",
diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp
index 7d0d3d8..79bfa17 100644
--- a/core/jni/android/graphics/BitmapFactory.cpp
+++ b/core/jni/android/graphics/BitmapFactory.cpp
@@ -15,6 +15,7 @@
 #include "Utils.h"
 #include "core_jni_helpers.h"
 
+#include <HardwareBitmapUploader.h>
 #include <nativehelper/JNIHelp.h>
 #include <androidfw/Asset.h>
 #include <androidfw/ResourceTypes.h>
@@ -278,6 +279,11 @@
 
     // Set the decode colorType
     SkColorType decodeColorType = codec->computeOutputColorType(prefColorType);
+    if (decodeColorType == kRGBA_F16_SkColorType && isHardware &&
+            !uirenderer::HardwareBitmapUploader::hasFP16Support()) {
+        decodeColorType = kN32_SkColorType;
+    }
+
     sk_sp<SkColorSpace> decodeColorSpace = codec->computeOutputColorSpace(
             decodeColorType, prefColorSpace);
 
@@ -354,13 +360,7 @@
     const SkImageInfo decodeInfo = SkImageInfo::Make(size.width(), size.height(),
             decodeColorType, alphaType, decodeColorSpace);
 
-    // For wide gamut images, we will leave the color space on the SkBitmap.  Otherwise,
-    // use the default.
     SkImageInfo bitmapInfo = decodeInfo;
-    if (decodeInfo.colorSpace() && decodeInfo.colorSpace()->isSRGB()) {
-        bitmapInfo = bitmapInfo.makeColorSpace(decodeInfo.refColorSpace());
-    }
-
     if (decodeColorType == kGray_8_SkColorType) {
         // The legacy implementation of BitmapFactory used kAlpha8 for
         // grayscale images (before kGray8 existed).  While the codec
@@ -549,7 +549,7 @@
     // if we only close the file descriptor and not the file object it is used to
     // create.  If we don't explicitly clean up the file (which in turn closes the
     // descriptor) the buffers allocated internally by fseek will be leaked.
-    int dupDescriptor = dup(descriptor);
+    int dupDescriptor = fcntl(descriptor, F_DUPFD_CLOEXEC, 0);
 
     FILE* file = fdopen(dupDescriptor, "r");
     if (file == NULL) {
diff --git a/core/jni/android/graphics/BitmapRegionDecoder.cpp b/core/jni/android/graphics/BitmapRegionDecoder.cpp
index b4ba749..d65f324 100644
--- a/core/jni/android/graphics/BitmapRegionDecoder.cpp
+++ b/core/jni/android/graphics/BitmapRegionDecoder.cpp
@@ -33,6 +33,7 @@
 #include "android_util_Binder.h"
 #include "core_jni_helpers.h"
 
+#include <HardwareBitmapUploader.h>
 #include <nativehelper/JNIHelp.h>
 #include <androidfw/Asset.h>
 #include <binder/Parcel.h>
@@ -166,6 +167,10 @@
 
     SkBitmapRegionDecoder* brd = reinterpret_cast<SkBitmapRegionDecoder*>(brdHandle);
     SkColorType decodeColorType = brd->computeOutputColorType(colorType);
+    if (decodeColorType == kRGBA_F16_SkColorType && isHardware &&
+            !uirenderer::HardwareBitmapUploader::hasFP16Support()) {
+        decodeColorType = kN32_SkColorType;
+    }
 
     // Set up the pixel allocator
     SkBRDAllocator* allocator = nullptr;
diff --git a/core/jni/android/graphics/ImageDecoder.cpp b/core/jni/android/graphics/ImageDecoder.cpp
index 5f12665..2d83ac3 100644
--- a/core/jni/android/graphics/ImageDecoder.cpp
+++ b/core/jni/android/graphics/ImageDecoder.cpp
@@ -24,6 +24,7 @@
 #include "core_jni_helpers.h"
 
 #include <hwui/Bitmap.h>
+#include <HardwareBitmapUploader.h>
 
 #include <SkAndroidCodec.h>
 #include <SkEncodedImageFormat.h>
@@ -132,7 +133,7 @@
                                "broken file descriptor; fstat returned -1", nullptr, source);
     }
 
-    int dupDescriptor = dup(descriptor);
+    int dupDescriptor = fcntl(descriptor, F_DUPFD_CLOEXEC, 0);
     FILE* file = fdopen(dupDescriptor, "r");
     if (file == NULL) {
         close(dupDescriptor);
@@ -256,6 +257,17 @@
         // This is currently the only way to know that we should decode to F16.
         colorType = codec->computeOutputColorType(colorType);
     }
+
+    const bool isHardware = !requireMutable
+        && (allocator == ImageDecoder::kDefault_Allocator ||
+            allocator == ImageDecoder::kHardware_Allocator)
+        && colorType != kGray_8_SkColorType;
+
+    if (colorType == kRGBA_F16_SkColorType && isHardware &&
+            !uirenderer::HardwareBitmapUploader::hasFP16Support()) {
+        colorType = kN32_SkColorType;
+    }
+
     sk_sp<SkColorSpace> colorSpace = GraphicsJNI::getNativeColorSpace(colorSpaceHandle);
     colorSpace = codec->computeOutputColorSpace(colorType, colorSpace);
     decodeInfo = decodeInfo.makeColorType(colorType).makeColorSpace(colorSpace);
@@ -449,10 +461,7 @@
     if (requireMutable) {
         bitmapCreateFlags |= bitmap::kBitmapCreateFlag_Mutable;
     } else {
-        if ((allocator == ImageDecoder::kDefault_Allocator ||
-             allocator == ImageDecoder::kHardware_Allocator)
-            && bm.colorType() != kAlpha_8_SkColorType)
-        {
+        if (isHardware) {
             sk_sp<Bitmap> hwBitmap = Bitmap::allocateHardwareBitmap(bm);
             if (hwBitmap) {
                 hwBitmap->setImmutable();
diff --git a/core/jni/android/graphics/Paint.cpp b/core/jni/android/graphics/Paint.cpp
index cc22ff0..85f1159 100644
--- a/core/jni/android/graphics/Paint.cpp
+++ b/core/jni/android/graphics/Paint.cpp
@@ -73,6 +73,7 @@
 
 static void getPosTextPath(const SkFont& font, const uint16_t glyphs[], int count,
                            const SkPoint pos[], SkPath* dst) {
+    dst->reset();
     struct Rec {
         SkPath* fDst;
         const SkPoint* fPos;
diff --git a/core/jni/android/graphics/Shader.cpp b/core/jni/android/graphics/Shader.cpp
index ed6a84b..298f7f8 100644
--- a/core/jni/android/graphics/Shader.cpp
+++ b/core/jni/android/graphics/Shader.cpp
@@ -8,6 +8,8 @@
 
 #include <jni.h>
 
+#include <vector>
+
 using namespace android::uirenderer;
 
 /**
@@ -18,11 +20,11 @@
  */
 static const uint32_t sGradientShaderFlags = SkGradientShader::kInterpolateColorsInPremul_Flag;
 
-static void ThrowIAE_IfNull(JNIEnv* env, void* ptr) {
-    if (NULL == ptr) {
-        doThrowIAE(env);
+#define ThrowIAE_IfNull(env, ptr)   \
+    if (nullptr == ptr) {           \
+        doThrowIAE(env);            \
+        return 0;                   \
     }
-}
 
 static void Color_RGBToHSV(JNIEnv* env, jobject, jint red, jint green, jint blue, jfloatArray hsvArray)
 {
@@ -76,186 +78,115 @@
     }
     sk_sp<SkShader> shader = image->makeShader(
             (SkShader::TileMode)tileModeX, (SkShader::TileMode)tileModeY);
+    ThrowIAE_IfNull(env, shader.get());
 
     if (matrix) {
         shader = shader->makeWithLocalMatrix(*matrix);
     }
 
-    ThrowIAE_IfNull(env, shader.get());
     return reinterpret_cast<jlong>(shader.release());
 }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////
 
-static jlong LinearGradient_create1(JNIEnv* env, jobject o, jlong matrixPtr,
-        jfloat x0, jfloat y0, jfloat x1, jfloat y1,
-        jintArray colorArray, jfloatArray posArray, jint tileMode) {
-    const SkMatrix* matrix = reinterpret_cast<const SkMatrix*>(matrixPtr);
-    SkPoint pts[2];
-    pts[0].set(x0, y0);
-    pts[1].set(x1, y1);
+static std::vector<SkColor4f> convertColorLongs(JNIEnv* env, jlongArray colorArray) {
+    const size_t count = env->GetArrayLength(colorArray);
+    const jlong* colorValues = env->GetLongArrayElements(colorArray, nullptr);
 
-    size_t count = env->GetArrayLength(colorArray);
-    const jint* colorValues = env->GetIntArrayElements(colorArray, NULL);
-
-    AutoJavaFloatArray autoPos(env, posArray, count);
-#ifdef SK_SCALAR_IS_FLOAT
-    SkScalar* pos = autoPos.ptr();
-#else
-    #error Need to convert float array to SkScalar array before calling the following function.
-#endif
-
-    sk_sp<SkShader> baseShader(SkGradientShader::MakeLinear(pts,
-            reinterpret_cast<const SkColor*>(colorValues), pos, count,
-            static_cast<SkShader::TileMode>(tileMode), sGradientShaderFlags, NULL));
-
-    SkShader* shader;
-    if (matrix) {
-        shader = baseShader->makeWithLocalMatrix(*matrix).release();
-    } else {
-        shader = baseShader.release();
+    std::vector<SkColor4f> colors(count);
+    for (size_t i = 0; i < count; ++i) {
+        colors[i] = GraphicsJNI::convertColorLong(colorValues[i]);
     }
 
-    env->ReleaseIntArrayElements(colorArray, const_cast<jint*>(colorValues), JNI_ABORT);
-    ThrowIAE_IfNull(env, shader);
-    return reinterpret_cast<jlong>(shader);
-}
-
-static jlong LinearGradient_create2(JNIEnv* env, jobject o, jlong matrixPtr,
-        jfloat x0, jfloat y0, jfloat x1, jfloat y1, jint color0, jint color1, jint tileMode) {
-    const SkMatrix* matrix = reinterpret_cast<const SkMatrix*>(matrixPtr);
-
-    SkPoint pts[2];
-    pts[0].set(x0, y0);
-    pts[1].set(x1, y1);
-
-    SkColor colors[2];
-    colors[0] = color0;
-    colors[1] = color1;
-
-    sk_sp<SkShader> baseShader(SkGradientShader::MakeLinear(pts, colors, NULL, 2,
-            static_cast<SkShader::TileMode>(tileMode), sGradientShaderFlags, NULL));
-
-    SkShader* s;
-    if (matrix) {
-        s = baseShader->makeWithLocalMatrix(*matrix).release();
-    } else {
-        s = baseShader.release();
-    }
-
-    ThrowIAE_IfNull(env, s);
-    return reinterpret_cast<jlong>(s);
+    env->ReleaseLongArrayElements(colorArray, const_cast<jlong*>(colorValues), JNI_ABORT);
+    return colors;
 }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////
 
-static jlong RadialGradient_create1(JNIEnv* env, jobject, jlong matrixPtr, jfloat x, jfloat y,
-        jfloat radius, jintArray colorArray, jfloatArray posArray, jint tileMode) {
-    const SkMatrix* matrix = reinterpret_cast<const SkMatrix*>(matrixPtr);
-    SkPoint center;
-    center.set(x, y);
+static jlong LinearGradient_create(JNIEnv* env, jobject, jlong matrixPtr,
+        jfloat x0, jfloat y0, jfloat x1, jfloat y1, jlongArray colorArray,
+        jfloatArray posArray, jint tileMode, jlong colorSpaceHandle) {
+    SkPoint pts[2];
+    pts[0].set(x0, y0);
+    pts[1].set(x1, y1);
 
-    size_t      count = env->GetArrayLength(colorArray);
-    const jint* colorValues = env->GetIntArrayElements(colorArray, NULL);
+    std::vector<SkColor4f> colors = convertColorLongs(env, colorArray);
 
-    AutoJavaFloatArray autoPos(env, posArray, count);
+    AutoJavaFloatArray autoPos(env, posArray, colors.size());
 #ifdef SK_SCALAR_IS_FLOAT
     SkScalar* pos = autoPos.ptr();
 #else
     #error Need to convert float array to SkScalar array before calling the following function.
 #endif
 
-    sk_sp<SkShader> baseShader = SkGradientShader::MakeRadial(center, radius,
-            reinterpret_cast<const SkColor*>(colorValues), pos, count,
-            static_cast<SkShader::TileMode>(tileMode), sGradientShaderFlags, NULL);
+    sk_sp<SkShader> shader(SkGradientShader::MakeLinear(pts, &colors[0],
+                GraphicsJNI::getNativeColorSpace(colorSpaceHandle), pos, colors.size(),
+                static_cast<SkShader::TileMode>(tileMode), sGradientShaderFlags, nullptr));
+    ThrowIAE_IfNull(env, shader);
 
-    SkShader* shader;
+    const SkMatrix* matrix = reinterpret_cast<const SkMatrix*>(matrixPtr);
     if (matrix) {
-        shader = baseShader->makeWithLocalMatrix(*matrix).release();
-    } else {
-        shader = baseShader.release();
+        shader = shader->makeWithLocalMatrix(*matrix);
     }
 
-    env->ReleaseIntArrayElements(colorArray, const_cast<jint*>(colorValues),
-                                 JNI_ABORT);
-
-    ThrowIAE_IfNull(env, shader);
-    return reinterpret_cast<jlong>(shader);
+    return reinterpret_cast<jlong>(shader.release());
 }
 
-static jlong RadialGradient_create2(JNIEnv* env, jobject, jlong matrixPtr, jfloat x, jfloat y, jfloat radius,
-        jint color0, jint color1, jint tileMode) {
-    const SkMatrix* matrix = reinterpret_cast<const SkMatrix*>(matrixPtr);
+///////////////////////////////////////////////////////////////////////////////////////////////
+
+static jlong RadialGradient_create(JNIEnv* env, jobject, jlong matrixPtr, jfloat x, jfloat y,
+        jfloat radius, jlongArray colorArray, jfloatArray posArray, jint tileMode,
+        jlong colorSpaceHandle) {
     SkPoint center;
     center.set(x, y);
 
-    SkColor colors[2];
-    colors[0] = color0;
-    colors[1] = color1;
+    std::vector<SkColor4f> colors = convertColorLongs(env, colorArray);
 
-    sk_sp<SkShader> baseShader = SkGradientShader::MakeRadial(center, radius, colors, NULL, 2,
-            static_cast<SkShader::TileMode>(tileMode), sGradientShaderFlags, NULL);
+    AutoJavaFloatArray autoPos(env, posArray, colors.size());
+#ifdef SK_SCALAR_IS_FLOAT
+    SkScalar* pos = autoPos.ptr();
+#else
+    #error Need to convert float array to SkScalar array before calling the following function.
+#endif
 
-    SkShader* shader;
-    if (matrix) {
-        shader = baseShader->makeWithLocalMatrix(*matrix).release();
-    } else {
-        shader = baseShader.release();
-    }
+    sk_sp<SkShader> shader = SkGradientShader::MakeRadial(center, radius, &colors[0],
+            GraphicsJNI::getNativeColorSpace(colorSpaceHandle), pos, colors.size(),
+            static_cast<SkShader::TileMode>(tileMode), sGradientShaderFlags, nullptr);
     ThrowIAE_IfNull(env, shader);
-    return reinterpret_cast<jlong>(shader);
+
+    const SkMatrix* matrix = reinterpret_cast<const SkMatrix*>(matrixPtr);
+    if (matrix) {
+        shader = shader->makeWithLocalMatrix(*matrix);
+    }
+
+    return reinterpret_cast<jlong>(shader.release());
 }
 
 ///////////////////////////////////////////////////////////////////////////////
 
-static jlong SweepGradient_create1(JNIEnv* env, jobject, jlong matrixPtr, jfloat x, jfloat y,
-        jintArray jcolors, jfloatArray jpositions) {
-    const SkMatrix* matrix = reinterpret_cast<const SkMatrix*>(matrixPtr);
-    size_t      count = env->GetArrayLength(jcolors);
-    const jint* colors = env->GetIntArrayElements(jcolors, NULL);
+static jlong SweepGradient_create(JNIEnv* env, jobject, jlong matrixPtr, jfloat x, jfloat y,
+        jlongArray colorArray, jfloatArray jpositions, jlong colorSpaceHandle) {
+    std::vector<SkColor4f> colors = convertColorLongs(env, colorArray);
 
-    AutoJavaFloatArray autoPos(env, jpositions, count);
+    AutoJavaFloatArray autoPos(env, jpositions, colors.size());
 #ifdef SK_SCALAR_IS_FLOAT
     SkScalar* pos = autoPos.ptr();
 #else
     #error Need to convert float array to SkScalar array before calling the following function.
 #endif
 
-    sk_sp<SkShader> baseShader = SkGradientShader::MakeSweep(x, y,
-            reinterpret_cast<const SkColor*>(colors), pos, count,
-            sGradientShaderFlags, NULL);
-
-    SkShader* shader;
-    if (matrix) {
-        shader = baseShader->makeWithLocalMatrix(*matrix).release();
-    } else {
-        shader = baseShader.release();
-    }
-
-    env->ReleaseIntArrayElements(jcolors, const_cast<jint*>(colors),
-                                 JNI_ABORT);
+    sk_sp<SkShader> shader = SkGradientShader::MakeSweep(x, y, &colors[0],
+            GraphicsJNI::getNativeColorSpace(colorSpaceHandle), pos, colors.size(),
+            sGradientShaderFlags, nullptr);
     ThrowIAE_IfNull(env, shader);
-    return reinterpret_cast<jlong>(shader);
-}
 
-static jlong SweepGradient_create2(JNIEnv* env, jobject, jlong matrixPtr, jfloat x, jfloat y,
-        int color0, int color1) {
     const SkMatrix* matrix = reinterpret_cast<const SkMatrix*>(matrixPtr);
-    SkColor colors[2];
-    colors[0] = color0;
-    colors[1] = color1;
-
-    sk_sp<SkShader> baseShader = SkGradientShader::MakeSweep(x, y, colors,
-            NULL, 2, sGradientShaderFlags, NULL);
-
-    SkShader* shader;
     if (matrix) {
-        shader = baseShader->makeWithLocalMatrix(*matrix).release();
-    } else {
-        shader = baseShader.release();
+        shader = shader->makeWithLocalMatrix(*matrix);
     }
-    ThrowIAE_IfNull(env, shader);
-    return reinterpret_cast<jlong>(shader);
+
+    return reinterpret_cast<jlong>(shader.release());
 }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////
@@ -295,18 +226,15 @@
 };
 
 static const JNINativeMethod gLinearGradientMethods[] = {
-    { "nativeCreate1",     "(JFFFF[I[FI)J",  (void*)LinearGradient_create1     },
-    { "nativeCreate2",     "(JFFFFIII)J",    (void*)LinearGradient_create2     },
+    { "nativeCreate",     "(JFFFF[J[FIJ)J",  (void*)LinearGradient_create     },
 };
 
 static const JNINativeMethod gRadialGradientMethods[] = {
-    { "nativeCreate1",     "(JFFF[I[FI)J",  (void*)RadialGradient_create1     },
-    { "nativeCreate2",     "(JFFFIII)J",    (void*)RadialGradient_create2     },
+    { "nativeCreate",     "(JFFF[J[FIJ)J",  (void*)RadialGradient_create     },
 };
 
 static const JNINativeMethod gSweepGradientMethods[] = {
-    { "nativeCreate1",     "(JFF[I[F)J",  (void*)SweepGradient_create1     },
-    { "nativeCreate2",     "(JFFII)J",    (void*)SweepGradient_create2     },
+    { "nativeCreate",     "(JFF[J[FJ)J",  (void*)SweepGradient_create     },
 };
 
 static const JNINativeMethod gComposeShaderMethods[] = {
diff --git a/core/jni/android_content_res_ApkAssets.cpp b/core/jni/android_content_res_ApkAssets.cpp
index 7738d84..f40b461 100644
--- a/core/jni/android_content_res_ApkAssets.cpp
+++ b/core/jni/android_content_res_ApkAssets.cpp
@@ -72,7 +72,7 @@
     return 0;
   }
 
-  unique_fd dup_fd(::dup(fd));
+  unique_fd dup_fd(::fcntl(fd, F_DUPFD_CLOEXEC, 0));
   if (dup_fd < 0) {
     jniThrowIOException(env, errno);
     return 0;
diff --git a/core/jni/android_ddm_DdmHandleNativeHeap.cpp b/core/jni/android_ddm_DdmHandleNativeHeap.cpp
index 2f25d8f..e22f581 100644
--- a/core/jni/android_ddm_DdmHandleNativeHeap.cpp
+++ b/core/jni/android_ddm_DdmHandleNativeHeap.cpp
@@ -54,7 +54,7 @@
 namespace android {
 
 static void ReadFile(const char* path, String8& s) {
-    int fd = open(path, O_RDONLY);
+    int fd = open(path, O_RDONLY | O_CLOEXEC);
     if (fd != -1) {
         char bytes[1024];
         ssize_t byteCount;
diff --git a/core/jni/android_graphics_Canvas.cpp b/core/jni/android_graphics_Canvas.cpp
index fc9ea76..9c48c33 100644
--- a/core/jni/android_graphics_Canvas.cpp
+++ b/core/jni/android_graphics_Canvas.cpp
@@ -222,6 +222,18 @@
     get_canvas(canvasHandle)->drawColor(color, mode);
 }
 
+static void drawColorLong(JNIEnv* env, jobject, jlong canvasHandle, jlong colorSpaceHandle,
+        jlong colorLong, jint modeHandle) {
+    SkColor4f color = GraphicsJNI::convertColorLong(colorLong);
+    sk_sp<SkColorSpace> cs = GraphicsJNI::getNativeColorSpace(colorSpaceHandle);
+    SkPaint p;
+    p.setColor4f(color, cs.get());
+
+    SkBlendMode mode = static_cast<SkBlendMode>(modeHandle);
+    p.setBlendMode(mode);
+    get_canvas(canvasHandle)->drawPaint(p);
+}
+
 static void drawPaint(JNIEnv* env, jobject, jlong canvasHandle, jlong paintHandle) {
     Paint* paint = reinterpret_cast<Paint*>(paintHandle);
     get_canvas(canvasHandle)->drawPaint(*paint);
@@ -677,6 +689,7 @@
 // If called from DisplayListCanvas they are @FastNative
 static const JNINativeMethod gDrawMethods[] = {
     {"nDrawColor","(JII)V", (void*) CanvasJNI::drawColor},
+    {"nDrawColor","(JJJI)V", (void*) CanvasJNI::drawColorLong},
     {"nDrawPaint","(JJ)V", (void*) CanvasJNI::drawPaint},
     {"nDrawPoint", "(JFFJ)V", (void*) CanvasJNI::drawPoint},
     {"nDrawPoints", "(J[FIIJ)V", (void*) CanvasJNI::drawPoints},
diff --git a/core/jni/android_hardware_HardwareBuffer.cpp b/core/jni/android_hardware_HardwareBuffer.cpp
index 2d1fec8..00e5ba3 100644
--- a/core/jni/android_hardware_HardwareBuffer.cpp
+++ b/core/jni/android_hardware_HardwareBuffer.cpp
@@ -21,6 +21,7 @@
 
 #include "android_os_Parcel.h"
 #include "android/graphics/GraphicsJNI.h"
+#include "android/graphics/GraphicBuffer.h"
 
 #include <android/hardware_buffer.h>
 #include <android_runtime/android_hardware_HardwareBuffer.h>
@@ -96,6 +97,12 @@
     return reinterpret_cast<jlong>(wrapper);
 }
 
+static jlong android_hardware_HardwareBuffer_createFromGraphicBuffer(JNIEnv* env, jobject clazz, jobject graphicBuffer) {
+    sp<GraphicBuffer> buffer(graphicBufferForJavaObject(env, graphicBuffer));
+    GraphicBufferWrapper* wrapper = new GraphicBufferWrapper(buffer);
+    return reinterpret_cast<jlong>(wrapper);
+}
+
 static void destroyWrapper(GraphicBufferWrapper* wrapper) {
     delete wrapper;
 }
@@ -243,6 +250,8 @@
 static const JNINativeMethod gMethods[] = {
     { "nCreateHardwareBuffer",  "(IIIIJ)J",
             (void*) android_hardware_HardwareBuffer_create },
+    { "nCreateFromGraphicBuffer", "(Landroid/graphics/GraphicBuffer;)J",
+            (void*) android_hardware_HardwareBuffer_createFromGraphicBuffer },
     { "nGetNativeFinalizer", "()J",
             (void*) android_hardware_HardwareBuffer_getNativeFinalizer },
     { "nWriteHardwareBufferToParcel",  "(JLandroid/os/Parcel;)V",
diff --git a/core/jni/android_hardware_SerialPort.cpp b/core/jni/android_hardware_SerialPort.cpp
index 190ddce..3ff2446 100644
--- a/core/jni/android_hardware_SerialPort.cpp
+++ b/core/jni/android_hardware_SerialPort.cpp
@@ -134,7 +134,7 @@
 
     int fd = jniGetFDFromFileDescriptor(env, fileDescriptor);
     // duplicate the file descriptor, since ParcelFileDescriptor will eventually close its copy
-    fd = dup(fd);
+    fd = fcntl(fd, F_DUPFD_CLOEXEC, 0);
     if (fd < 0) {
         jniThrowException(env, "java/io/IOException", "Could not open serial port");
         return;
diff --git a/core/jni/android_hardware_UsbDeviceConnection.cpp b/core/jni/android_hardware_UsbDeviceConnection.cpp
index d953aee..b885c28 100644
--- a/core/jni/android_hardware_UsbDeviceConnection.cpp
+++ b/core/jni/android_hardware_UsbDeviceConnection.cpp
@@ -49,7 +49,7 @@
 {
     int fd = jniGetFDFromFileDescriptor(env, fileDescriptor);
     // duplicate the file descriptor, since ParcelFileDescriptor will eventually close its copy
-    fd = dup(fd);
+    fd = fcntl(fd, F_DUPFD_CLOEXEC, 0);
     if (fd < 0)
         return JNI_FALSE;
 
diff --git a/core/jni/android_hardware_input_InputApplicationHandle.cpp b/core/jni/android_hardware_input_InputApplicationHandle.cpp
index 1ab5843..b9301d4 100644
--- a/core/jni/android_hardware_input_InputApplicationHandle.cpp
+++ b/core/jni/android_hardware_input_InputApplicationHandle.cpp
@@ -17,6 +17,7 @@
 #define LOG_TAG "InputApplicationHandle"
 
 #include <nativehelper/JNIHelp.h>
+#include "core_jni_helpers.h"
 #include "jni.h"
 #include <android_runtime/AndroidRuntime.h>
 #include <utils/threads.h>
@@ -63,16 +64,7 @@
         mInfo = new InputApplicationInfo();
     }
 
-    jstring nameObj = jstring(env->GetObjectField(obj,
-            gInputApplicationHandleClassInfo.name));
-    if (nameObj) {
-        const char* nameStr = env->GetStringUTFChars(nameObj, NULL);
-        mInfo->name = nameStr;
-        env->ReleaseStringUTFChars(nameObj, nameStr);
-        env->DeleteLocalRef(nameObj);
-    } else {
-        mInfo->name = "<null>";
-    }
+    mInfo->name = getStringField(env, obj, gInputApplicationHandleClassInfo.name, "<null>");
 
     mInfo->dispatchingTimeout = env->GetLongField(obj,
             gInputApplicationHandleClassInfo.dispatchingTimeoutNanos);
diff --git a/core/jni/android_hardware_input_InputWindowHandle.cpp b/core/jni/android_hardware_input_InputWindowHandle.cpp
index c0e45b1..eb71052 100644
--- a/core/jni/android_hardware_input_InputWindowHandle.cpp
+++ b/core/jni/android_hardware_input_InputWindowHandle.cpp
@@ -17,6 +17,7 @@
 #define LOG_TAG "InputWindowHandle"
 
 #include <nativehelper/JNIHelp.h>
+#include "core_jni_helpers.h"
 #include "jni.h"
 #include <android_runtime/AndroidRuntime.h>
 #include <utils/threads.h>
@@ -55,6 +56,7 @@
     jfieldID ownerUid;
     jfieldID inputFeatures;
     jfieldID displayId;
+    jfieldID portalToDisplayId;
 } gInputWindowHandleClassInfo;
 
 static Mutex gHandleMutex;
@@ -85,24 +87,14 @@
 
     mInfo.touchableRegion.clear();
 
-    jobject tokenObj = env->GetObjectField(obj,
-            gInputWindowHandleClassInfo.token);
+    jobject tokenObj = env->GetObjectField(obj, gInputWindowHandleClassInfo.token);
     if (tokenObj) {
         mInfo.token = ibinderForJavaObject(env, tokenObj);
     } else {
         mInfo.token.clear();
     }
 
-    jstring nameObj = jstring(env->GetObjectField(obj,
-            gInputWindowHandleClassInfo.name));
-    if (nameObj) {
-        const char* nameStr = env->GetStringUTFChars(nameObj, NULL);
-        mInfo.name = nameStr;
-        env->ReleaseStringUTFChars(nameObj, nameStr);
-        env->DeleteLocalRef(nameObj);
-    } else {
-        mInfo.name = "<null>";
-    }
+    mInfo.name = getStringField(env, obj, gInputWindowHandleClassInfo.name, "<null>");
 
     mInfo.layoutParamsFlags = env->GetIntField(obj,
             gInputWindowHandleClassInfo.layoutParamsFlags);
@@ -154,6 +146,8 @@
             gInputWindowHandleClassInfo.inputFeatures);
     mInfo.displayId = env->GetIntField(obj,
             gInputWindowHandleClassInfo.displayId);
+    mInfo.portalToDisplayId = env->GetIntField(obj,
+            gInputWindowHandleClassInfo.portalToDisplayId);
 
     jobject inputApplicationHandleObj = env->GetObjectField(obj,
             gInputWindowHandleClassInfo.inputApplicationHandle);
@@ -238,8 +232,7 @@
     GET_FIELD_ID(gInputWindowHandleClassInfo.ptr, clazz,
             "ptr", "J");
 
-    GET_FIELD_ID(gInputWindowHandleClassInfo.inputApplicationHandle,
-            clazz,
+    GET_FIELD_ID(gInputWindowHandleClassInfo.inputApplicationHandle, clazz,
             "inputApplicationHandle", "Landroid/view/InputApplicationHandle;");
 
     GET_FIELD_ID(gInputWindowHandleClassInfo.token, clazz,
@@ -307,6 +300,9 @@
 
     GET_FIELD_ID(gInputWindowHandleClassInfo.displayId, clazz,
             "displayId", "I");
+
+    GET_FIELD_ID(gInputWindowHandleClassInfo.portalToDisplayId, clazz,
+            "portalToDisplayId", "I");
     return 0;
 }
 
diff --git a/core/jni/android_media_AudioAttributes.cpp b/core/jni/android_media_AudioAttributes.cpp
index bfe6162..b87a34d 100644
--- a/core/jni/android_media_AudioAttributes.cpp
+++ b/core/jni/android_media_AudioAttributes.cpp
@@ -135,7 +135,7 @@
 {
     audio_attributes_t *aa = new (calloc(1, sizeof(audio_attributes_t)))
                 audio_attributes_t{AUDIO_ATTRIBUTES_INITIALIZER};
-    return UniqueAaPtr{aa, free};
+    return UniqueAaPtr{aa};
 }
 
 jint JNIAudioAttributeHelper::nativeFromJava(JNIEnv* env, jobject jAudioAttributes,
@@ -154,7 +154,7 @@
         JNIEnv* env, jobjectArray *jAudioAttributeArray, jint numAudioAttributes)
 {
     *jAudioAttributeArray = env->NewObjectArray(numAudioAttributes, gAudioAttributesClass, NULL);
-    return jAudioAttributeArray == NULL? (jint)AUDIO_JAVA_ERROR : (jint)AUDIO_JAVA_SUCCESS;
+    return *jAudioAttributeArray == NULL? (jint)AUDIO_JAVA_ERROR : (jint)AUDIO_JAVA_SUCCESS;
 }
 
 /*
diff --git a/core/jni/android_media_AudioAttributes.h b/core/jni/android_media_AudioAttributes.h
index c558352..628f7e3 100644
--- a/core/jni/android_media_AudioAttributes.h
+++ b/core/jni/android_media_AudioAttributes.h
@@ -27,7 +27,11 @@
 class JNIAudioAttributeHelper
 {
 public:
-    using UniqueAaPtr = std::unique_ptr<audio_attributes_t, decltype(free)*>;
+    struct FreeDeleter {
+        void operator()(void *p) const { ::free(p); }
+    };
+
+    using UniqueAaPtr = std::unique_ptr<audio_attributes_t, FreeDeleter>;
 
     /**
      * @brief makeUnique helper to prevent leak
diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp
index 34abcd8..a2ed7d3 100644
--- a/core/jni/android_media_AudioSystem.cpp
+++ b/core/jni/android_media_AudioSystem.cpp
@@ -621,6 +621,24 @@
 }
 
 static jint
+android_media_AudioSystem_setMasterBalance(JNIEnv *env, jobject thiz, jfloat balance)
+{
+    return (jint) check_AudioSystem_Command(AudioSystem::setMasterBalance(balance));
+}
+
+static jfloat
+android_media_AudioSystem_getMasterBalance(JNIEnv *env, jobject thiz)
+{
+    float balance;
+    const status_t status = AudioSystem::getMasterBalance(&balance);
+    if (status != NO_ERROR) {
+        ALOGW("%s getMasterBalance error %d, returning 0.f, audioserver down?", __func__, status);
+        balance = 0.f;
+    }
+    return balance;
+}
+
+static jint
 android_media_AudioSystem_getDevicesForStream(JNIEnv *env, jobject thiz, jint stream)
 {
     return (jint) AudioSystem::getDevicesForStream(static_cast <audio_stream_type_t>(stream));
@@ -2160,6 +2178,8 @@
     {"getMasterMute",       "()Z",      (void *)android_media_AudioSystem_getMasterMute},
     {"setMasterMono",       "(Z)I",     (void *)android_media_AudioSystem_setMasterMono},
     {"getMasterMono",       "()Z",      (void *)android_media_AudioSystem_getMasterMono},
+    {"setMasterBalance",    "(F)I",     (void *)android_media_AudioSystem_setMasterBalance},
+    {"getMasterBalance",    "()F",      (void *)android_media_AudioSystem_getMasterBalance},
     {"getDevicesForStream", "(I)I",     (void *)android_media_AudioSystem_getDevicesForStream},
     {"getPrimaryOutputSamplingRate", "()I", (void *)android_media_AudioSystem_getPrimaryOutputSamplingRate},
     {"getPrimaryOutputFrameCount",   "()I", (void *)android_media_AudioSystem_getPrimaryOutputFrameCount},
diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp
index 7837248..e9035ed 100644
--- a/core/jni/android_os_Debug.cpp
+++ b/core/jni/android_os_Debug.cpp
@@ -646,7 +646,7 @@
     }
 
     /* dup() the descriptor so we don't close the original with fclose() */
-    int fd = dup(origFd);
+    int fd = fcntl(origFd, F_DUPFD_CLOEXEC, 0);
     if (fd < 0) {
         ALOGW("dup(%d) failed: %s\n", origFd, strerror(errno));
         jniThrowRuntimeException(env, "dup() failed");
diff --git a/core/jni/android_os_VintfObject.cpp b/core/jni/android_os_VintfObject.cpp
index e64d2af..ee11b61 100644
--- a/core/jni/android_os_VintfObject.cpp
+++ b/core/jni/android_os_VintfObject.cpp
@@ -96,7 +96,7 @@
     return toJavaStringArray(env, cStrings);
 }
 
-static jint verify(JNIEnv* env, jobjectArray packageInfo, android::vintf::CheckFlags::Type checks) {
+static jint android_os_VintfObject_verify(JNIEnv* env, jclass, jobjectArray packageInfo) {
     std::vector<std::string> cPackageInfo;
     if (packageInfo) {
         size_t count = env->GetArrayLength(packageInfo);
@@ -109,18 +109,19 @@
         }
     }
     std::string error;
-    int32_t status = VintfObject::CheckCompatibility(cPackageInfo, &error, checks);
+    int32_t status = VintfObject::CheckCompatibility(cPackageInfo, &error);
     if (status)
         LOG(WARNING) << "VintfObject.verify() returns " << status << ": " << error;
     return status;
 }
 
-static jint android_os_VintfObject_verify(JNIEnv* env, jclass, jobjectArray packageInfo) {
-    return verify(env, packageInfo, ::android::vintf::CheckFlags::ENABLE_ALL_CHECKS);
-}
-
 static jint android_os_VintfObject_verifyWithoutAvb(JNIEnv* env, jclass) {
-    return verify(env, nullptr, ::android::vintf::CheckFlags::DISABLE_AVB_CHECK);
+    std::string error;
+    int32_t status = VintfObject::CheckCompatibility({}, &error,
+            ::android::vintf::CheckFlags::DISABLE_AVB_CHECK);
+    if (status)
+        LOG(WARNING) << "VintfObject.verifyWithoutAvb() returns " << status << ": " << error;
+    return status;
 }
 
 static jobjectArray android_os_VintfObject_getHalNamesAndVersions(JNIEnv* env, jclass) {
diff --git a/core/jni/android_text_Hyphenator.cpp b/core/jni/android_text_Hyphenator.cpp
index 6f9cc22..de30773 100644
--- a/core/jni/android_text_Hyphenator.cpp
+++ b/core/jni/android_text_Hyphenator.cpp
@@ -37,7 +37,7 @@
 
 static const uint8_t* mmapPatternFile(const std::string& locale) {
     const std::string hyFilePath = buildFileName(locale);
-    const int fd = open(hyFilePath.c_str(), O_RDONLY);
+    const int fd = open(hyFilePath.c_str(), O_RDONLY | O_CLOEXEC);
     if (fd == -1) {
         return nullptr;  // Open failed.
     }
diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp
index f201ceb..df98cdc 100644
--- a/core/jni/android_util_Binder.cpp
+++ b/core/jni/android_util_Binder.cpp
@@ -1184,7 +1184,7 @@
     FILE *f;
 
     snprintf(filename, sizeof(filename), "/proc/%d/cmdline", pid);
-    f = fopen(filename, "r");
+    f = fopen(filename, "re");
     if (!f) {
         *buf = '\0';
         return 1;
diff --git a/core/jni/android_util_FileObserver.cpp b/core/jni/android_util_FileObserver.cpp
index d25192a..c64c212 100644
--- a/core/jni/android_util_FileObserver.cpp
+++ b/core/jni/android_util_FileObserver.cpp
@@ -42,7 +42,7 @@
 static jint android_os_fileobserver_init(JNIEnv* env, jobject object)
 {
 #if defined(__linux__)
-    return (jint)inotify_init();
+    return (jint)inotify_init1(IN_CLOEXEC);
 #else
     return -1;
 #endif
diff --git a/core/jni/android_view_InputChannel.cpp b/core/jni/android_view_InputChannel.cpp
index fb6be6b..9819d9a 100644
--- a/core/jni/android_view_InputChannel.cpp
+++ b/core/jni/android_view_InputChannel.cpp
@@ -17,7 +17,7 @@
 #define LOG_TAG "InputChannel-JNI"
 
 #include <nativehelper/JNIHelp.h>
-
+#include "nativehelper/scoped_utf_chars.h"
 #include <android_runtime/AndroidRuntime.h>
 #include <binder/Parcel.h>
 #include <utils/Log.h>
@@ -123,9 +123,8 @@
 
 static jobjectArray android_view_InputChannel_nativeOpenInputChannelPair(JNIEnv* env,
         jclass clazz, jstring nameObj) {
-    const char* nameChars = env->GetStringUTFChars(nameObj, NULL);
-    std::string name = nameChars;
-    env->ReleaseStringUTFChars(nameObj, nameChars);
+    ScopedUtfChars nameChars(env, nameObj);
+    std::string name = nameChars.c_str();
 
     sp<InputChannel> serverChannel;
     sp<InputChannel> clientChannel;
diff --git a/core/jni/android_view_RenderNode.cpp b/core/jni/android_view_RenderNode.cpp
index 0d75de9..ce5512b 100644
--- a/core/jni/android_view_RenderNode.cpp
+++ b/core/jni/android_view_RenderNode.cpp
@@ -507,15 +507,15 @@
 jmethodID gPositionListener_PositionLostMethod;
 
 static void android_view_RenderNode_requestPositionUpdates(JNIEnv* env, jobject,
-        jlong renderNodePtr, jobject surfaceview) {
-    class SurfaceViewPositionUpdater : public RenderNode::PositionListener {
+        jlong renderNodePtr, jobject listener) {
+    class PositionListenerTrampoline : public RenderNode::PositionListener {
     public:
-        SurfaceViewPositionUpdater(JNIEnv* env, jobject surfaceview) {
+        PositionListenerTrampoline(JNIEnv* env, jobject listener) {
             env->GetJavaVM(&mVm);
-            mWeakRef = env->NewWeakGlobalRef(surfaceview);
+            mWeakRef = env->NewWeakGlobalRef(listener);
         }
 
-        virtual ~SurfaceViewPositionUpdater() {
+        virtual ~PositionListenerTrampoline() {
             jnienv()->DeleteWeakGlobalRef(mWeakRef);
             mWeakRef = nullptr;
         }
@@ -539,9 +539,14 @@
                 bounds.roundOut();
             }
 
+            if (mPreviousPosition == bounds) {
+                return;
+            }
+            mPreviousPosition = bounds;
+
             incStrong(0);
             auto functor = std::bind(
-                std::mem_fn(&SurfaceViewPositionUpdater::doUpdatePositionAsync), this,
+                std::mem_fn(&PositionListenerTrampoline::doUpdatePositionAsync), this,
                 (jlong) info.canvasContext.getFrameNumber(),
                 (jint) bounds.left, (jint) bounds.top,
                 (jint) bounds.right, (jint) bounds.bottom);
@@ -552,6 +557,11 @@
         virtual void onPositionLost(RenderNode& node, const TreeInfo* info) override {
             if (CC_UNLIKELY(!mWeakRef || (info && !info->updateWindowPositions))) return;
 
+            if (mPreviousPosition.isEmpty()) {
+                return;
+            }
+            mPreviousPosition.setEmpty();
+
             ATRACE_NAME("SurfaceView position lost");
             JNIEnv* env = jnienv();
             jobject localref = env->NewLocalRef(mWeakRef);
@@ -561,6 +571,7 @@
                 return;
             }
 
+            // TODO: Remember why this is synchronous and then make a comment
             env->CallVoidMethod(localref, gPositionListener_PositionLostMethod,
                     info ? info->canvasContext.getFrameNumber() : 0);
             env->DeleteLocalRef(localref);
@@ -596,10 +607,11 @@
 
         JavaVM* mVm;
         jobject mWeakRef;
+        uirenderer::Rect mPreviousPosition;
     };
 
     RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
-    renderNode->setPositionListener(new SurfaceViewPositionUpdater(env, surfaceview));
+    renderNode->setPositionListener(new PositionListenerTrampoline(env, listener));
 }
 
 // ----------------------------------------------------------------------------
diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp
index b8139a7..f9407f4 100644
--- a/core/jni/android_view_Surface.cpp
+++ b/core/jni/android_view_Surface.cpp
@@ -131,6 +131,7 @@
     switch(f) {
         case PublicFormat::JPEG:
         case PublicFormat::DEPTH_POINT_CLOUD:
+        case PublicFormat::DEPTH_JPEG:
             return HAL_PIXEL_FORMAT_BLOB;
         case PublicFormat::DEPTH16:
             return HAL_PIXEL_FORMAT_Y16;
@@ -161,6 +162,8 @@
         case PublicFormat::NV21:
         case PublicFormat::YV12:
             return HAL_DATASPACE_V0_JFIF;
+        case PublicFormat::DEPTH_JPEG:
+            return static_cast<android_dataspace> (HAL_DATASPACE_DYNAMIC_DEPTH);
         default:
             // Most formats map to UNKNOWN
             return HAL_DATASPACE_UNKNOWN;
@@ -223,8 +226,12 @@
                 case HAL_DATASPACE_V0_JFIF:
                     return PublicFormat::JPEG;
                 default:
-                    // Assume otherwise-marked blobs are also JPEG
-                    return PublicFormat::JPEG;
+                    if (dataSpace == static_cast<android_dataspace>(HAL_DATASPACE_DYNAMIC_DEPTH)) {
+                        return PublicFormat::DEPTH_JPEG;
+                    } else {
+                        // Assume otherwise-marked blobs are also JPEG
+                        return PublicFormat::JPEG;
+                    }
             }
             break;
         case HAL_PIXEL_FORMAT_BGRA_8888:
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index f1b259e..fad2fe0 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -36,6 +36,7 @@
 #include <memory>
 #include <stdio.h>
 #include <system/graphics.h>
+#include <ui/ConfigStoreTypes.h>
 #include <ui/DisplayInfo.h>
 #include <ui/DisplayedFrameStats.h>
 #include <ui/FrameStats.h>
@@ -108,6 +109,23 @@
     jmethodID ctor;
 } gDisplayedContentSamplingAttributesClassInfo;
 
+static struct {
+    jclass clazz;
+    jmethodID ctor;
+    jfieldID X;
+    jfieldID Y;
+    jfieldID Z;
+} gCieXyzClassInfo;
+
+static struct {
+    jclass clazz;
+    jmethodID ctor;
+    jfieldID red;
+    jfieldID green;
+    jfieldID blue;
+    jfieldID white;
+} gDisplayPrimariesClassInfo;
+
 // ----------------------------------------------------------------------------
 
 static jlong nativeCreateTransaction(JNIEnv* env, jclass clazz) {
@@ -688,6 +706,66 @@
     return colorModesArray;
 }
 
+static jobject nativeGetDisplayNativePrimaries(JNIEnv* env, jclass, jobject tokenObj) {
+    sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
+    if (token == NULL) return NULL;
+
+    ui::DisplayPrimaries primaries;
+    if (SurfaceComposerClient::getDisplayNativePrimaries(token, primaries) != NO_ERROR) {
+        return NULL;
+    }
+
+    jobject jred = env->NewObject(gCieXyzClassInfo.clazz, gCieXyzClassInfo.ctor);
+    if (jred == NULL) {
+        jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
+        return NULL;
+    }
+
+    jobject jgreen = env->NewObject(gCieXyzClassInfo.clazz, gCieXyzClassInfo.ctor);
+    if (jgreen == NULL) {
+        jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
+        return NULL;
+    }
+
+    jobject jblue = env->NewObject(gCieXyzClassInfo.clazz, gCieXyzClassInfo.ctor);
+    if (jblue == NULL) {
+        jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
+        return NULL;
+    }
+
+    jobject jwhite = env->NewObject(gCieXyzClassInfo.clazz, gCieXyzClassInfo.ctor);
+    if (jwhite == NULL) {
+        jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
+        return NULL;
+    }
+
+    jobject jprimaries = env->NewObject(gDisplayPrimariesClassInfo.clazz,
+            gDisplayPrimariesClassInfo.ctor);
+    if (jprimaries == NULL) {
+        jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
+        return NULL;
+    }
+
+    env->SetFloatField(jred, gCieXyzClassInfo.X, primaries.red.X);
+    env->SetFloatField(jred, gCieXyzClassInfo.Y, primaries.red.Y);
+    env->SetFloatField(jred, gCieXyzClassInfo.Z, primaries.red.Z);
+    env->SetFloatField(jgreen, gCieXyzClassInfo.X, primaries.green.X);
+    env->SetFloatField(jgreen, gCieXyzClassInfo.Y, primaries.green.Y);
+    env->SetFloatField(jgreen, gCieXyzClassInfo.Z, primaries.green.Z);
+    env->SetFloatField(jblue, gCieXyzClassInfo.X, primaries.blue.X);
+    env->SetFloatField(jblue, gCieXyzClassInfo.Y, primaries.blue.Y);
+    env->SetFloatField(jblue, gCieXyzClassInfo.Z, primaries.blue.Z);
+    env->SetFloatField(jwhite, gCieXyzClassInfo.X, primaries.white.X);
+    env->SetFloatField(jwhite, gCieXyzClassInfo.Y, primaries.white.Y);
+    env->SetFloatField(jwhite, gCieXyzClassInfo.Z, primaries.white.Z);
+    env->SetObjectField(jprimaries, gDisplayPrimariesClassInfo.red, jred);
+    env->SetObjectField(jprimaries, gDisplayPrimariesClassInfo.green, jgreen);
+    env->SetObjectField(jprimaries, gDisplayPrimariesClassInfo.blue, jblue);
+    env->SetObjectField(jprimaries, gDisplayPrimariesClassInfo.white, jwhite);
+
+    return jprimaries;
+}
+
 static jint nativeGetActiveColorMode(JNIEnv* env, jclass, jobject tokenObj) {
     sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
     if (token == NULL) return -1;
@@ -1089,6 +1167,8 @@
             (void*)nativeSetActiveConfig },
     {"nativeGetDisplayColorModes", "(Landroid/os/IBinder;)[I",
             (void*)nativeGetDisplayColorModes},
+    {"nativeGetDisplayNativePrimaries", "(Landroid/os/IBinder;)Landroid/view/SurfaceControl$DisplayPrimaries;",
+            (void*)nativeGetDisplayNativePrimaries },
     {"nativeGetActiveColorMode", "(Landroid/os/IBinder;)I",
             (void*)nativeGetActiveColorMode},
     {"nativeSetActiveColorMode", "(Landroid/os/IBinder;I)Z",
@@ -1209,6 +1289,28 @@
             displayedContentSamplingAttributesClazz);
     gDisplayedContentSamplingAttributesClassInfo.ctor = GetMethodIDOrDie(env,
             displayedContentSamplingAttributesClazz, "<init>", "(III)V");
+
+    jclass cieXyzClazz = FindClassOrDie(env, "android/view/SurfaceControl$CieXyz");
+    gCieXyzClassInfo.clazz = MakeGlobalRefOrDie(env, cieXyzClazz);
+    gCieXyzClassInfo.ctor = GetMethodIDOrDie(env, gCieXyzClassInfo.clazz, "<init>", "()V");
+    gCieXyzClassInfo.X = GetFieldIDOrDie(env, cieXyzClazz, "X", "F");
+    gCieXyzClassInfo.Y = GetFieldIDOrDie(env, cieXyzClazz, "Y", "F");
+    gCieXyzClassInfo.Z = GetFieldIDOrDie(env, cieXyzClazz, "Z", "F");
+
+    jclass displayPrimariesClazz = FindClassOrDie(env,
+            "android/view/SurfaceControl$DisplayPrimaries");
+    gDisplayPrimariesClassInfo.clazz = MakeGlobalRefOrDie(env, displayPrimariesClazz);
+    gDisplayPrimariesClassInfo.ctor = GetMethodIDOrDie(env, gDisplayPrimariesClassInfo.clazz,
+            "<init>", "()V");
+    gDisplayPrimariesClassInfo.red = GetFieldIDOrDie(env, displayPrimariesClazz, "red",
+            "Landroid/view/SurfaceControl$CieXyz;");
+    gDisplayPrimariesClassInfo.green = GetFieldIDOrDie(env, displayPrimariesClazz, "green",
+            "Landroid/view/SurfaceControl$CieXyz;");
+    gDisplayPrimariesClassInfo.blue = GetFieldIDOrDie(env, displayPrimariesClazz, "blue",
+            "Landroid/view/SurfaceControl$CieXyz;");
+    gDisplayPrimariesClassInfo.white = GetFieldIDOrDie(env, displayPrimariesClazz, "white",
+            "Landroid/view/SurfaceControl$CieXyz;");
+
     return err;
 }
 
diff --git a/core/jni/com_android_internal_content_NativeLibraryHelper.cpp b/core/jni/com_android_internal_content_NativeLibraryHelper.cpp
index 5eefc81..dc536b2 100644
--- a/core/jni/com_android_internal_content_NativeLibraryHelper.cpp
+++ b/core/jni/com_android_internal_content_NativeLibraryHelper.cpp
@@ -125,7 +125,7 @@
         return true;
     }
 
-    int fd = TEMP_FAILURE_RETRY(open(filePath, O_RDONLY));
+    int fd = TEMP_FAILURE_RETRY(open(filePath, O_RDONLY | O_CLOEXEC));
     if (fd < 0) {
         ALOGV("Couldn't open file %s: %s", filePath, strerror(errno));
         return true;
@@ -565,7 +565,7 @@
         return 0;
     }
 
-    int dupedFd = dup(fd);
+    int dupedFd = fcntl(fd, F_DUPFD_CLOEXEC, 0);
     if (dupedFd == -1) {
         jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException",
                              "Failed to dup FileDescriptor: %s", strerror(errno));
diff --git a/core/jni/com_android_internal_net_NetworkStatsFactory.cpp b/core/jni/com_android_internal_net_NetworkStatsFactory.cpp
index 24bafca..8259ffc 100644
--- a/core/jni/com_android_internal_net_NetworkStatsFactory.cpp
+++ b/core/jni/com_android_internal_net_NetworkStatsFactory.cpp
@@ -95,7 +95,7 @@
 static int legacyReadNetworkStatsDetail(std::vector<stats_line>* lines,
                                         const std::vector<std::string>& limitIfaces,
                                         int limitTag, int limitUid, const char* path) {
-    FILE* fp = fopen(path, "r");
+    FILE* fp = fopen(path, "re");
     if (fp == NULL) {
         return -1;
     }
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index 6ee9606..b7837ef 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -276,6 +276,7 @@
 // Must match values in com.android.internal.os.Zygote.
 enum RuntimeFlags : uint32_t {
   DEBUG_ENABLE_JDWP = 1,
+  PROFILE_FROM_SHELL = 1 << 15,
 };
 
 // Forward declaration so we don't have to move the signal handler.
@@ -1224,6 +1225,13 @@
   if ((runtime_flags & RuntimeFlags::DEBUG_ENABLE_JDWP) != 0) {
     EnableDebugger();
   }
+  if ((runtime_flags & RuntimeFlags::PROFILE_FROM_SHELL) != 0) {
+    // simpleperf needs the process to be dumpable to profile it.
+    if (prctl(PR_SET_DUMPABLE, 1, 0, 0, 0) == -1) {
+      ALOGE("prctl(PR_SET_DUMPABLE) failed: %s", strerror(errno));
+      RuntimeAbort(env, __LINE__, "prctl(PR_SET_DUMPABLE, 1) failed");
+    }
+  }
 
   if (NeedsNoRandomizeWorkaround()) {
     // Work around ARM kernel ASLR lossage (http://b/5817320).
diff --git a/core/jni/core_jni_helpers.h b/core/jni/core_jni_helpers.h
index 1325b0c..16ef753 100644
--- a/core/jni/core_jni_helpers.h
+++ b/core/jni/core_jni_helpers.h
@@ -18,6 +18,8 @@
 #define CORE_JNI_HELPERS
 
 #include <nativehelper/JNIHelp.h>
+#include <nativehelper/scoped_local_ref.h>
+#include <nativehelper/scoped_utf_chars.h>
 #include <android_runtime/AndroidRuntime.h>
 
 namespace android {
@@ -72,6 +74,20 @@
     return res;
 }
 
+/**
+ * Read the specified field from jobject, and convert to std::string.
+ * If the field cannot be obtained, return defaultValue.
+ */
+static inline std::string getStringField(JNIEnv* env, jobject obj, jfieldID fieldId,
+        const char* defaultValue) {
+    ScopedLocalRef<jstring> strObj(env, jstring(env->GetObjectField(obj, fieldId)));
+    if (strObj != nullptr) {
+        ScopedUtfChars chars(env, strObj.get());
+        return std::string(chars.c_str());
+    }
+    return std::string(defaultValue);
+}
+
 }  // namespace android
 
 #endif  // CORE_JNI_HELPERS
diff --git a/core/jni/include/android_runtime/android_view_Surface.h b/core/jni/include/android_runtime/android_view_Surface.h
index 36487b3..984e942 100644
--- a/core/jni/include/android_runtime/android_view_Surface.h
+++ b/core/jni/include/android_runtime/android_view_Surface.h
@@ -57,7 +57,8 @@
     YV12              = 0x32315659,
     Y8                = 0x20203859, // @hide
     Y16               = 0x20363159, // @hide
-    DEPTH16           = 0x44363159
+    DEPTH16           = 0x44363159,
+    DEPTH_JPEG        = 0x69656963,
 };
 
 /* Gets the underlying ANativeWindow for a Surface. */
diff --git a/core/proto/Android.bp b/core/proto/Android.bp
index 80cc2d4..3b891d6 100644
--- a/core/proto/Android.bp
+++ b/core/proto/Android.bp
@@ -21,7 +21,10 @@
         type: "lite",
     },
     srcs: [
+        "android/bluetooth/a2dp/enums.proto",
         "android/bluetooth/enums.proto",
         "android/bluetooth/hci/enums.proto",
+        "android/bluetooth/hfp/enums.proto",
+        "android/bluetooth/smp/enums.proto",
     ],
 }
diff --git a/core/proto/android/app/settings_enums.proto b/core/proto/android/app/settings_enums.proto
index eb716ac..30b9b78 100644
--- a/core/proto/android/app/settings_enums.proto
+++ b/core/proto/android/app/settings_enums.proto
@@ -595,6 +595,21 @@
 
     // ACTION: Tap & Pay -> Default Application Setting -> Use Default
     ACTION_NFC_PAYMENT_ALWAYS_SETTING = 1623;
+
+    // ACTION: Settings > Search Bar > Avatar
+    // CATEGORY: SETTINGS
+    // OS: Q
+    CLICK_ACCOUNT_AVATAR = 1643;
+
+    // ACTION: Set new password (action intent android.app.action.SET_NEW_PASSWORD)
+    // CATEGORY: SETTINGS
+    // OS: Q
+    ACTION_SET_NEW_PASSWORD = 1645;
+
+    // ACTION: Set new password (action intent android.app.action.SET_NEW_PARENT_PROFILE_PASSWORD)
+    // CATEGORY: SETTINGS
+    // OS: Q
+    ACTION_SET_NEW_PARENT_PROFILE_PASSWORD = 1646;
 }
 
 /**
@@ -2157,10 +2172,10 @@
     // OS: Q
     ZEN_CUSTOM_SETTINGS_DIALOG = 1612;
 
-    // OPEN: Settings > Developer Options > Game Update Packages
+    // OPEN: Settings > Developer Options > Game Driver Preferences
     // CATEGORY: SETTINGS
     // OS: Q
-    SETTINGS_GUP_DASHBOARD = 1613;
+    SETTINGS_GAME_DRIVER_DASHBOARD = 1613;
 
     // OPEN: Settings > Accessibility > Vibration > Ring vibration
     // CATEGORY: SETTINGS
@@ -2189,4 +2204,14 @@
 
     // OPEN: Settings > System > Aware > Disable > Dialog
     DIALOG_AWARE_DISABLE = 1633;
+
+    // OPEN: Settings > Settings > Network & internet > Click Mobile network to land on page with
+    // details for a SIM/eSIM mobile network > Click edit icon to bring up a rename dialog.
+    // OS: Q
+    MOBILE_NETWORK_RENAME_DIALOG = 1642;
+
+    // OPEN: Set new password (android.app.action.SET_NEW_PASSWORD action intent)
+    // CATEGORY: SETTINGS
+    // OS: Q
+    SET_NEW_PASSWORD_ACTIVITY = 1644;
 }
diff --git a/core/proto/android/bluetooth/a2dp/enums.proto b/core/proto/android/bluetooth/a2dp/enums.proto
new file mode 100644
index 0000000..5a025bd
--- /dev/null
+++ b/core/proto/android/bluetooth/a2dp/enums.proto
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+package android.bluetooth.a2dp;
+
+option java_outer_classname = "BluetoothA2dpProtoEnums";
+option java_multiple_files = true;
+
+// A2dp playback state enum, defined from:
+// frameworks/base/core/java/android/bluetooth/BluetoothA2dp.java
+enum PlaybackStateEnum {
+    PLAYBACK_STATE_UNKNOWN = 0;
+    PLAYBACK_STATE_PLAYING = 10;
+    PLAYBACK_STATE_NOT_PLAYING = 11;
+}
+
+enum AudioCodingModeEnum {
+    AUDIO_CODING_MODE_UNKNOWN = 0;
+    AUDIO_CODING_MODE_HARDWARE = 1;
+    AUDIO_CODING_MODE_SOFTWARE = 2;
+}
diff --git a/core/proto/android/bluetooth/enums.proto b/core/proto/android/bluetooth/enums.proto
index 76c240e..a88a06c 100644
--- a/core/proto/android/bluetooth/enums.proto
+++ b/core/proto/android/bluetooth/enums.proto
@@ -56,3 +56,57 @@
     LINK_TYPE_ACL = 0x01;
     LINK_TYPE_ESCO = 0x02;
 }
+
+enum DeviceInfoSrcEnum {
+    DEVICE_INFO_SRC_UNKNOWN = 0;
+    // Within Android Bluetooth stack
+    DEVICE_INFO_INTERNAL = 1;
+    // Outside Android Bluetooth stack
+    DEVICE_INFO_EXTERNAL = 2;
+}
+
+enum DeviceTypeEnum {
+    DEVICE_TYPE_UNKNOWN = 0;
+    DEVICE_TYPE_CLASSIC = 1;
+    DEVICE_TYPE_LE = 2;
+    DEVICE_TYPE_DUAL = 3;
+}
+
+// Defined in frameworks/base/core/java/android/bluetooth/BluetoothDevice.java
+enum TransportTypeEnum {
+    TRANSPORT_TYPE_AUTO = 0;
+    TRANSPORT_TYPE_BREDR = 1;
+    TRANSPORT_TYPE_LE = 2;
+}
+
+// Bond state enum
+// Defined in frameworks/base/core/java/android/bluetooth/BluetoothDevice.java
+enum BondStateEnum {
+    BOND_STATE_UNKNOWN = 0;
+    BOND_STATE_NONE = 10;
+    BOND_STATE_BONDING = 11;
+    BOND_STATE_BONDED = 12;
+}
+
+// Sub states within the bonding general state
+enum BondSubStateEnum {
+    BOND_SUB_STATE_UNKNOWN = 0;
+    BOND_SUB_STATE_LOCAL_OOB_DATA_PROVIDED = 1;
+    BOND_SUB_STATE_LOCAL_PIN_REQUESTED = 2;
+    BOND_SUB_STATE_LOCAL_PIN_REPLIED = 3;
+    BOND_SUB_STATE_LOCAL_SSP_REQUESTED = 4;
+    BOND_SUB_STATE_LOCAL_SSP_REPLIED = 5;
+}
+
+enum UnbondReasonEnum {
+    UNBOND_REASON_UNKNOWN = 0;
+    UNBOND_REASON_AUTH_FAILED = 1;
+    UNBOND_REASON_AUTH_REJECTED = 2;
+    UNBOND_REASON_AUTH_CANCELED = 3;
+    UNBOND_REASON_REMOTE_DEVICE_DOWN = 4;
+    UNBOND_REASON_DISCOVERY_IN_PROGRESS = 5;
+    UNBOND_REASON_AUTH_TIMEOUT = 6;
+    UNBOND_REASON_REPEATED_ATTEMPTS = 7;
+    UNBOND_REASON_REMOTE_AUTH_CANCELED = 8;
+    UNBOND_REASON_REMOVED = 9;
+}
diff --git a/core/proto/android/bluetooth/hci/enums.proto b/core/proto/android/bluetooth/hci/enums.proto
index e1d96bb..ef894e5 100644
--- a/core/proto/android/bluetooth/hci/enums.proto
+++ b/core/proto/android/bluetooth/hci/enums.proto
@@ -351,7 +351,7 @@
     EVT_COMMAND_COMPLETE = 0x0E;
     EVT_COMMAND_STATUS = 0x0F;
     EVT_HARDWARE_ERROR = 0x10;
-    EVT_FLUSH_OCCURED = 0x11;
+    EVT_FLUSH_OCCURRED = 0x11;
     EVT_ROLE_CHANGE = 0x12;
     EVT_NUM_COMPL_DATA_PKTS = 0x13;
     EVT_MODE_CHANGE = 0x14;
@@ -517,3 +517,43 @@
     STATUS_CLB_DATA_TOO_BIG = 0x43;
     STATUS_OPERATION_CANCELED_BY_HOST = 0x44; // Not currently used in system/bt
 }
+
+enum BqrIdEnum {
+    BQR_ID_UNKNOWN = 0x00;
+    BQR_ID_MONITOR_MODE = 0x01;
+    BQR_ID_APPROACH_LSTO = 0x02;
+    BQR_ID_A2DP_AUDIO_CHOPPY = 0x03;
+    BQR_ID_SCO_VOICE_CHOPPY = 0x04;
+}
+
+enum BqrPacketTypeEnum {
+    BQR_PACKET_TYPE_UNKNOWN = 0x00;
+    BQR_PACKET_TYPE_ID = 0x01;
+    BQR_PACKET_TYPE_NULL = 0x02;
+    BQR_PACKET_TYPE_POLL = 0x03;
+    BQR_PACKET_TYPE_FHS = 0x04;
+    BQR_PACKET_TYPE_HV1 = 0x05;
+    BQR_PACKET_TYPE_HV2 = 0x06;
+    BQR_PACKET_TYPE_HV3 = 0x07;
+    BQR_PACKET_TYPE_DV = 0x08;
+    BQR_PACKET_TYPE_EV3 = 0x09;
+    BQR_PACKET_TYPE_EV4 = 0x0A;
+    BQR_PACKET_TYPE_EV5 = 0x0B;
+    BQR_PACKET_TYPE_2EV3 = 0x0C;
+    BQR_PACKET_TYPE_2EV5 = 0x0D;
+    BQR_PACKET_TYPE_3EV3 = 0x0E;
+    BQR_PACKET_TYPE_3EV5 = 0x0F;
+    BQR_PACKET_TYPE_DM1 = 0x10;
+    BQR_PACKET_TYPE_DH1 = 0x11;
+    BQR_PACKET_TYPE_DM3 = 0x12;
+    BQR_PACKET_TYPE_DH3 = 0x13;
+    BQR_PACKET_TYPE_DM5 = 0x14;
+    BQR_PACKET_TYPE_DH5 = 0x15;
+    BQR_PACKET_TYPE_AUX1 = 0x16;
+    BQR_PACKET_TYPE_2DH1 = 0x17;
+    BQR_PACKET_TYPE_2DH3 = 0x18;
+    BQR_PACKET_TYPE_2DH5 = 0x19;
+    BQR_PACKET_TYPE_3DH1 = 0x1A;
+    BQR_PACKET_TYPE_3DH3 = 0x1B;
+    BQR_PACKET_TYPE_3DH5 = 0x1C;
+}
diff --git a/core/proto/android/bluetooth/smp/enums.proto b/core/proto/android/bluetooth/smp/enums.proto
new file mode 100644
index 0000000..c6747b7
--- /dev/null
+++ b/core/proto/android/bluetooth/smp/enums.proto
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+package android.bluetooth.smp;
+
+option java_outer_classname = "BluetoothSmpProtoEnums";
+option java_multiple_files = true;
+
+// SMP Pairing command codes
+enum CommandEnum {
+    CMD_UNKNOWN = 0x00;
+    CMD_PAIRING_REQUEST = 0x01;
+    CMD_PAIRING_RESPONSE = 0x02;
+    CMD_PAIRING_CONFIRM = 0x03;
+    CMD_PAIRING_RANDOM = 0x04;
+    CMD_PAIRING_FAILED = 0x05;
+    CMD_ENCRYPTION_INFON = 0x06;
+    CMD_MASTER_IDENTIFICATION = 0x07;
+    CMD_IDENTITY_INFO = 0x08;
+    CMD_IDENTITY_ADDR_INFO = 0x09;
+    CMD_SIGNING_INFO = 0x0A;
+    CMD_SECURITY_REQUEST = 0x0B;
+    CMD_PAIRING_PUBLIC_KEY = 0x0C;
+    CMD_PAIRING_DHKEY_CHECK = 0x0D;
+    CMD_PAIRING_KEYPRESS_INFO = 0x0E;
+}
+
+enum PairingFailReasonEnum {
+    PAIRING_FAIL_REASON_RESERVED = 0x00;
+    PAIRING_FAIL_REASON_PASSKEY_ENTRY = 0x01;
+    PAIRING_FAIL_REASON_OOB = 0x02;
+    PAIRING_FAIL_REASON_AUTH_REQ = 0x03;
+    PAIRING_FAIL_REASON_CONFIRM_VALUE = 0x04;
+    PAIRING_FAIL_REASON_PAIR_NOT_SUPPORT = 0x05;
+    PAIRING_FAIL_REASON_ENC_KEY_SIZE = 0x06;
+    PAIRING_FAIL_REASON_INVALID_CMD = 0x07;
+    PAIRING_FAIL_REASON_UNSPECIFIED = 0x08;
+    PAIRING_FAIL_REASON_REPEATED_ATTEMPTS = 0x09;
+    PAIRING_FAIL_REASON_INVALID_PARAMETERS = 0x0A;
+    PAIRING_FAIL_REASON_DHKEY_CHK = 0x0B;
+    PAIRING_FAIL_REASON_NUMERIC_COMPARISON = 0x0C;
+    PAIRING_FAIL_REASON_CLASSIC_PAIRING_IN_PROGR = 0x0D;
+    PAIRING_FAIL_REASON_XTRANS_DERIVE_NOT_ALLOW = 0x0E;
+}
\ No newline at end of file
diff --git a/core/proto/android/providers/settings/global.proto b/core/proto/android/providers/settings/global.proto
index 7e7942e..a160451 100644
--- a/core/proto/android/providers/settings/global.proto
+++ b/core/proto/android/providers/settings/global.proto
@@ -230,13 +230,6 @@
     }
     optional Connectivity connectivity = 32;
 
-    message ContentCapture {
-      option (android.msg_privacy).dest = DEST_EXPLICIT;
-
-      optional SettingProto service_explicitly_enabled = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
-    }
-    optional ContentCapture content_capture = 145;
-
     optional SettingProto contact_metadata_sync_enabled = 33 [ (android.privacy).dest = DEST_AUTOMATIC ];
     optional SettingProto contacts_database_wal_enabled = 34 [ (android.privacy).dest = DEST_AUTOMATIC ];
 
@@ -436,20 +429,20 @@
         // Ordered GPU debug layer list for GLES
         // i.e. <layer1>:<layer2>:...:<layerN>
         optional SettingProto debug_layers_gles = 7;
-        // GUP - Game Update Package global preference for all Apps
+        // Game Driver - global preference for all Apps
         // 0 = Default
-        // 1 = All Apps use Game Update Package
+        // 1 = All Apps use Game Driver
         // 2 = All Apps use system graphics driver
-        optional SettingProto gup_dev_all_apps = 8;
-        // GUP - List of Apps selected to use Game Update Package
+        optional SettingProto game_driver_all_apps = 8;
+        // Game Driver - List of Apps selected to use Game Driver
         // i.e. <pkg1>,<pkg2>,...,<pkgN>
-        optional SettingProto gup_dev_opt_in_apps = 9;
-        // GUP - List of Apps selected not to use Game Update Package
+        optional SettingProto game_driver_opt_in_apps = 9;
+        // Game Driver - List of Apps selected not to use Game Driver
         // i.e. <pkg1>,<pkg2>,...,<pkgN>
-        optional SettingProto gup_dev_opt_out_apps = 10;
-        // GUP - List of Apps that are forbidden to use Game Update Package
-        optional SettingProto gup_blacklist = 11;
-        // List of Apps that are allowed to use Game Driver package.
+        optional SettingProto game_driver_opt_out_apps = 10;
+        // Game Driver - List of Apps that are forbidden to use Game Driver
+        optional SettingProto game_driver_blacklist = 11;
+        // Game Driver - List of Apps that are allowed to use Game Driver
         optional SettingProto game_driver_whitelist = 12;
         // ANGLE - List of Apps that can check ANGLE rules
         optional SettingProto angle_whitelist = 13;
@@ -1004,7 +997,7 @@
         optional SettingProto watchdog_poor_network_test_enabled = 22 [ (android.privacy).dest = DEST_AUTOMATIC ];
         optional SettingProto suspend_optimizations_enabled = 23 [ (android.privacy).dest = DEST_AUTOMATIC ];
         optional SettingProto verbose_logging_enabled = 24 [ (android.privacy).dest = DEST_AUTOMATIC ];
-        optional SettingProto connected_mac_randomization_enabled = 25 [ (android.privacy).dest = DEST_AUTOMATIC ];
+        reserved 25; // connected_mac_randomization_enabled
         optional SettingProto max_dhcp_retry_count = 26 [ (android.privacy).dest = DEST_AUTOMATIC ];
         optional SettingProto mobile_data_transition_wakelock_timeout_ms = 27 [ (android.privacy).dest = DEST_AUTOMATIC ];
         // Controls whether WiFi configurations created by a Device Owner app should
@@ -1044,5 +1037,5 @@
 
     // Please insert fields in alphabetical order and group them into messages
     // if possible (to avoid reaching the method limit).
-    // Next tag = 149;
+    // Next tag = 145 then 149; // (145 was removed)
 }
diff --git a/core/proto/android/providers/settings/system.proto b/core/proto/android/providers/settings/system.proto
index dfc4081..41a7498 100644
--- a/core/proto/android/providers/settings/system.proto
+++ b/core/proto/android/providers/settings/system.proto
@@ -232,6 +232,8 @@
         // Which streams are affected by mute. The stream type's bit should be set
         // to 1 if it should be muted when a mute request is received.
         optional SettingProto mute_streams_affected = 12 [ (android.privacy).dest = DEST_AUTOMATIC ];
+        // Master balance (float -1.f = 100% left, 0.f = dead center, 1.f = 100% right).
+        optional SettingProto master_balance = 13 [ (android.privacy).dest = DEST_AUTOMATIC ];
     }
     optional Volume volume = 33;
 
diff --git a/core/proto/android/server/powermanagerservice.proto b/core/proto/android/server/powermanagerservice.proto
index af0a942..8fce94e 100644
--- a/core/proto/android/server/powermanagerservice.proto
+++ b/core/proto/android/server/powermanagerservice.proto
@@ -318,6 +318,16 @@
     // Whether battery saver is enabled.
     optional bool enabled = 1;
 
+    // Whether full battery saver is enabled.
+    optional bool is_full_enabled = 14;
+
+    // Whether adaptive battery saver is enabled.
+    optional bool is_adaptive_enabled = 15;
+
+    // Whether the battery saver policy indicates that is_enabled should be
+    // advertised.
+    optional bool should_advertise_is_enabled = 16;
+
     // Whether system has booted.
     optional bool boot_completed = 2;
 
@@ -358,4 +368,10 @@
     // The value of Global.LOW_POWER_MODE_STICKY_AUTO_DISABLE_LEVEL. This is a cached value, so it
     // could be slightly different from what's in GlobalSettingsProto.LowPowerMode.
     optional int32 setting_battery_saver_sticky_auto_disable_threshold = 13;
+
+    // The last time adaptive battery saver was changed by an external service,
+    // using elapsed realtime as the timebase.
+    optional int64 last_adaptive_battery_saver_changed_externally_elapsed = 17;
+
+    // Next tag: 18
 }
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 25baa92..840291d 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -115,6 +115,7 @@
     <protected-broadcast android:name="android.app.action.BUGREPORT_FAILED" />
     <protected-broadcast android:name="android.app.action.BUGREPORT_SHARE" />
     <protected-broadcast android:name="android.app.action.SHOW_DEVICE_MONITORING_DIALOG" />
+    <protected-broadcast android:name="android.intent.action.PENDING_INCIDENT_REPORTS_CHANGED" />
 
     <protected-broadcast android:name="android.appwidget.action.APPWIDGET_UPDATE_OPTIONS" />
     <protected-broadcast android:name="android.appwidget.action.APPWIDGET_DELETED" />
@@ -273,6 +274,7 @@
     <protected-broadcast android:name="android.media.MASTER_VOLUME_CHANGED_ACTION" />
     <protected-broadcast android:name="android.media.MASTER_MUTE_CHANGED_ACTION" />
     <protected-broadcast android:name="android.media.MASTER_MONO_CHANGED_ACTION" />
+    <protected-broadcast android:name="android.media.MASTER_BALANCE_CHANGED_ACTION" />
     <protected-broadcast android:name="android.media.SCO_AUDIO_STATE_CHANGED" />
     <protected-broadcast android:name="android.media.ACTION_SCO_AUDIO_STATE_UPDATED" />
 
@@ -1729,7 +1731,7 @@
     <permission android:name="android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS"
         android:protectionLevel="signature|privileged" />
 
-    <!-- Allows a system application to access hardware packet offload capabilities.
+    <!-- @SystemApi Allows a system application to access hardware packet offload capabilities.
          @hide -->
     <permission android:name="android.permission.PACKET_KEEPALIVE_OFFLOAD"
         android:protectionLevel="signature|privileged" />
@@ -1867,6 +1869,10 @@
     <permission android:name="android.permission.HARDWARE_TEST"
         android:protectionLevel="signature" />
 
+    <!-- @hide Allows an application to manage DynamicAndroid image -->
+    <permission android:name="android.permission.MANAGE_DYNAMIC_ANDROID"
+        android:protectionLevel="signature" />
+
     <!-- @SystemApi Allows access to Broadcast Radio
          @hide This is not a third-party API (intended for system apps).-->
     <permission android:name="android.permission.ACCESS_BROADCAST_RADIO"
@@ -2798,6 +2804,20 @@
     <permission android:name="android.permission.SIGNAL_PERSISTENT_PROCESSES"
         android:protectionLevel="signature|privileged|development" />
 
+    <!-- @hide @SystemApi @TestApi
+         Allow an application to approve incident and bug reports to be
+         shared off-device.  There can be only one application installed on the
+         device with this permission, and since this is a privileged permission, it
+         must be in priv-app.
+        <p>Not for use by third-party applications. -->
+    <permission android:name="android.permission.APPROVE_INCIDENT_REPORTS"
+        android:protectionLevel="signature|incidentReportApprover" />
+
+    <!-- @hide Allow an application to approve an incident or bug report approval from
+        the system. -->
+    <permission android:name="android.permission.REQUEST_INCIDENT_REPORT_APPROVAL"
+        android:protectionLevel="signature|privileged" />
+
     <!-- ==================================== -->
     <!-- Private permissions                  -->
     <!-- ==================================== -->
@@ -3528,6 +3548,12 @@
         android:protectionLevel="signature|privileged" />
     <uses-permission android:name="android.permission.CONTROL_VPN" />
 
+    <!-- Allows an application to access and modify always-on VPN configuration.
+         <p>Not for use by third-party or privileged applications.
+         @hide -->
+    <permission android:name="android.permission.CONTROL_ALWAYS_ON_VPN"
+        android:protectionLevel="signature" />
+
     <!-- Allows an application to capture audio output.
          <p>Not for use by third-party applications.</p> -->
     <permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT"
@@ -4307,7 +4333,7 @@
     <!-- @SystemApi Allows an application to manage the app predictions service.
          @hide  <p>Not for use by third-party applications.</p> -->
     <permission android:name="android.permission.MANAGE_APP_PREDICTIONS"
-         android:protectionLevel="signature" />
+         android:protectionLevel="signature|appPredictor" />
 
     <!-- Allows an app to set the theme overlay in /vendor/overlay
          being used.
@@ -4730,7 +4756,7 @@
         <receiver android:name="com.android.server.updates.ConversationActionsInstallReceiver"
                   android:permission="android.permission.UPDATE_CONFIG">
             <intent-filter>
-                <action android:name="android.intent.action.ACTION_UPDATE_CONVERSATION_ACTIONS" />
+                <action android:name="android.intent.action.UPDATE_CONVERSATION_ACTIONS" />
                 <data android:scheme="content" android:host="*" android:mimeType="*/*" />
             </intent-filter>
         </receiver>
diff --git a/core/res/res/anim/lock_in.xml b/core/res/res/anim/lock_in.xml
new file mode 100755
index 0000000..992bc92
--- /dev/null
+++ b/core/res/res/anim/lock_in.xml
@@ -0,0 +1,404 @@
+<!--
+     Copyright (C) 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:aapt="http://schemas.android.com/aapt">
+    <aapt:attr name="android:drawable">
+        <vector
+            android:width="24dp"
+            android:height="24dp"
+            android:viewportWidth="24"
+            android:viewportHeight="24">
+            <group android:name="_R_G">
+                <group android:name="_R_G_L_2_G_N_3_T_0_M">
+                    <group
+                        android:name="_R_G_L_2_G_N_3_T_0"
+                        android:pivotX="2.25"
+                        android:pivotY="2.25"
+                        android:scaleX="0"
+                        android:scaleY="0"
+                        android:translateX="9.75"
+                        android:translateY="12.75">
+                        <group
+                            android:name="_R_G_L_2_G_T_1"
+                            android:scaleX="0.12346"
+                            android:scaleY="0.12346"
+                            android:translateX="2.25"
+                            android:translateY="2.373">
+                            <group
+                                android:name="_R_G_L_2_G"
+                                android:translateY="32">
+                                <path
+                                    android:name="_R_G_L_2_G_D_0_P_0"
+                                    android:fillAlpha="0"
+                                    android:fillColor="#ff0000"
+                                    android:fillType="nonZero"
+                                    android:pathData=" M-28.21 -31.92 C-28.21,-31.92 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 "
+                                    android:trimPathStart="0.14"
+                                    android:trimPathEnd="0.89"
+                                    android:trimPathOffset="0" />
+                                <path
+                                    android:name="_R_G_L_2_G_D_1_P_0"
+                                    android:pathData=" M-28.21 -31.92 C-28.21,-31.92 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 "
+                                    android:strokeWidth="16"
+                                    android:strokeAlpha="1"
+                                    android:strokeColor="?attr/textColor"
+                                    android:trimPathStart="0.14"
+                                    android:trimPathEnd="0.89"
+                                    android:trimPathOffset="0" />
+                            </group>
+                        </group>
+                    </group>
+                </group>
+                <group
+                    android:name="_R_G_L_1_G"
+                    android:pivotX="8.25"
+                    android:pivotY="7.25"
+                    android:scaleX="0"
+                    android:scaleY="0"
+                    android:translateX="3.75"
+                    android:translateY="7.75">
+                    <path
+                        android:name="_R_G_L_1_G_D_0_P_0"
+                        android:fillAlpha="1"
+                        android:fillColor="?attr/textColor"
+                        android:fillType="nonZero"
+                        android:pathData=" M14.25 0.25 C14.25,0.25 12.75,0.25 12.75,0.25 C12.75,0.25 10.75,0.25 10.75,0.25 C10.75,0.25 5.75,0.25 5.75,0.25 C5.75,0.25 3.75,0.25 3.75,0.25 C3.75,0.25 2.25,0.25 2.25,0.25 C1.15,0.25 0.25,1.15 0.25,2.25 C0.25,2.25 0.25,12.25 0.25,12.25 C0.25,13.35 1.15,14.25 2.25,14.25 C2.25,14.25 14.25,14.25 14.25,14.25 C15.35,14.25 16.25,13.35 16.25,12.25 C16.25,12.25 16.25,2.25 16.25,2.25 C16.25,1.15 15.35,0.25 14.25,0.25c  M14.25 12.25 C14.25,12.25 2.25,12.25 2.25,12.25 C2.25,12.25 2.25,2.25 2.25,2.25 C2.25,2.25 3.75,2.25 3.75,2.25 C3.75,2.25 12.75,2.25 12.75,2.25 C12.75,2.25 14.25,2.25 14.25,2.25 C14.25,2.25 14.25,12.25 14.25,12.25c " />
+                </group>
+                <group
+                    android:name="_R_G_L_0_G"
+                    android:pivotX="2.25"
+                    android:pivotY="2.25"
+                    android:scaleX="0"
+                    android:scaleY="0"
+                    android:translateX="9.75"
+                    android:translateY="12.75">
+                    <path
+                        android:name="_R_G_L_0_G_D_0_P_0"
+                        android:fillAlpha="1"
+                        android:fillColor="?attr/textColor"
+                        android:fillType="nonZero"
+                        android:pathData=" M2.25 0.25 C3.35,0.25 4.25,1.15 4.25,2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25c " />
+                </group>
+            </group>
+            <group android:name="time_group" />
+        </vector>
+    </aapt:attr>
+    <target android:name="_R_G_L_2_G_D_0_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="50"
+                    android:propertyName="trimPathStart"
+                    android:startOffset="0"
+                    android:valueFrom="0.14"
+                    android:valueTo="0.14"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="67"
+                    android:propertyName="trimPathStart"
+                    android:startOffset="50"
+                    android:valueFrom="0.14"
+                    android:valueTo="0"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_2_G_D_0_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="50"
+                    android:propertyName="trimPathEnd"
+                    android:startOffset="0"
+                    android:valueFrom="0.89"
+                    android:valueTo="0.89"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="67"
+                    android:propertyName="trimPathEnd"
+                    android:startOffset="50"
+                    android:valueFrom="0.89"
+                    android:valueTo="1"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_2_G_D_1_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="50"
+                    android:propertyName="trimPathStart"
+                    android:startOffset="0"
+                    android:valueFrom="0.14"
+                    android:valueTo="0.14"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="67"
+                    android:propertyName="trimPathStart"
+                    android:startOffset="50"
+                    android:valueFrom="0.14"
+                    android:valueTo="0"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_2_G_D_1_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="50"
+                    android:propertyName="trimPathEnd"
+                    android:startOffset="0"
+                    android:valueFrom="0.89"
+                    android:valueTo="0.89"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="67"
+                    android:propertyName="trimPathEnd"
+                    android:startOffset="50"
+                    android:valueFrom="0.89"
+                    android:valueTo="1"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_2_G_T_1">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="150"
+                    android:pathData="M 2.25,2.373C 2.25,1.2001604776382402 2.25,-3.49116047763824 2.25,-4.664"
+                    android:propertyName="translateXY"
+                    android:propertyXName="translateX"
+                    android:propertyYName="translateY"
+                    android:startOffset="0">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_2_G_N_3_T_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="233"
+                    android:propertyName="scaleX"
+                    android:startOffset="0"
+                    android:valueFrom="0"
+                    android:valueTo="1.0125"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.556 0.667,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="233"
+                    android:propertyName="scaleY"
+                    android:startOffset="0"
+                    android:valueFrom="0"
+                    android:valueTo="1.0125"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.556 0.667,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="117"
+                    android:propertyName="scaleX"
+                    android:startOffset="233"
+                    android:valueFrom="1.0125"
+                    android:valueTo="1"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="117"
+                    android:propertyName="scaleY"
+                    android:startOffset="233"
+                    android:valueFrom="1.0125"
+                    android:valueTo="1"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_2_G_N_3_T_0_M">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="0"
+                    android:propertyName="scaleX"
+                    android:startOffset="50"
+                    android:valueFrom="0"
+                    android:valueTo="1"
+                    android:valueType="floatType" />
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_1_G">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="233"
+                    android:propertyName="scaleX"
+                    android:startOffset="0"
+                    android:valueFrom="0"
+                    android:valueTo="1.025"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="233"
+                    android:propertyName="scaleY"
+                    android:startOffset="0"
+                    android:valueFrom="0"
+                    android:valueTo="1.025"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="117"
+                    android:propertyName="scaleX"
+                    android:startOffset="233"
+                    android:valueFrom="1.025"
+                    android:valueTo="1"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="117"
+                    android:propertyName="scaleY"
+                    android:startOffset="233"
+                    android:valueFrom="1.025"
+                    android:valueTo="1"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_0_G">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="233"
+                    android:propertyName="scaleX"
+                    android:startOffset="0"
+                    android:valueFrom="0"
+                    android:valueTo="1.0125"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.556 0.667,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="233"
+                    android:propertyName="scaleY"
+                    android:startOffset="0"
+                    android:valueFrom="0"
+                    android:valueTo="1.0125"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.556 0.667,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="117"
+                    android:propertyName="scaleX"
+                    android:startOffset="233"
+                    android:valueFrom="1.0125"
+                    android:valueTo="1"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="117"
+                    android:propertyName="scaleY"
+                    android:startOffset="233"
+                    android:valueFrom="1.0125"
+                    android:valueTo="1"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="time_group">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="717"
+                    android:propertyName="translateX"
+                    android:startOffset="0"
+                    android:valueFrom="0"
+                    android:valueTo="1"
+                    android:valueType="floatType" />
+            </set>
+        </aapt:attr>
+    </target>
+</animated-vector>
\ No newline at end of file
diff --git a/core/res/res/anim/lock_lock.xml b/core/res/res/anim/lock_lock.xml
new file mode 100755
index 0000000..8b7887c
--- /dev/null
+++ b/core/res/res/anim/lock_lock.xml
@@ -0,0 +1,16 @@
+<!--
+     Copyright (C) 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt"><aapt:attr name="android:drawable"><vector android:height="24dp" android:width="24dp" android:viewportHeight="24" android:viewportWidth="24"><group android:name="_R_G"><group android:name="_R_G_L_2_G_T_1" android:translateX="12" android:translateY="15"><group android:name="_R_G_L_2_G" android:translateX="-8.25" android:translateY="-7.25"><path android:name="_R_G_L_2_G_D_0_P_0" android:fillColor="?attr/textColor" android:fillAlpha="1" android:fillType="nonZero" android:pathData=" M14.25 0.25 C14.25,0.25 12.75,0.25 12.75,0.25 C12.75,0.25 10.75,0.25 10.75,0.25 C10.75,0.25 5.75,0.25 5.75,0.25 C5.75,0.25 3.75,0.25 3.75,0.25 C3.75,0.25 2.25,0.25 2.25,0.25 C1.15,0.25 0.25,1.15 0.25,2.25 C0.25,2.25 0.25,12.25 0.25,12.25 C0.25,13.35 1.15,14.25 2.25,14.25 C2.25,14.25 14.25,14.25 14.25,14.25 C15.35,14.25 16.25,13.35 16.25,12.25 C16.25,12.25 16.25,2.25 16.25,2.25 C16.25,1.15 15.35,0.25 14.25,0.25c  M14.25 12.25 C14.25,12.25 2.25,12.25 2.25,12.25 C2.25,12.25 2.25,2.25 2.25,2.25 C2.25,2.25 3.75,2.25 3.75,2.25 C3.75,2.25 12.75,2.25 12.75,2.25 C12.75,2.25 14.25,2.25 14.25,2.25 C14.25,2.25 14.25,12.25 14.25,12.25c "/></group></group><group android:name="_R_G_L_1_G_N_5_T_1" android:translateX="12" android:translateY="15"><group android:name="_R_G_L_1_G_N_5_T_0" android:translateX="-8.25" android:translateY="-7.25"><group android:name="_R_G_L_1_G" android:translateX="6" android:translateY="5" android:pivotX="2.25" android:pivotY="2.25" android:scaleX="1" android:scaleY="1"><path android:name="_R_G_L_1_G_D_0_P_0" android:fillColor="?attr/textColor" android:fillAlpha="1" android:fillType="nonZero" android:pathData=" M2.25 0.25 C3.35,0.25 4.25,1.15 4.25,2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25c "/></group></group></group><group android:name="_R_G_L_0_G_N_5_T_1" android:translateX="12" android:translateY="15"><group android:name="_R_G_L_0_G_N_5_T_0" android:translateX="-8.25" android:translateY="-7.25"><group android:name="_R_G_L_0_G" android:translateX="-16.219" android:translateY="32.25" android:pivotX="27.965" android:pivotY="-32" android:scaleX="0.125" android:scaleY="0.125"><path android:name="_R_G_L_0_G_D_0_P_0" android:fillColor="#ff0000" android:fillAlpha="0" android:fillType="nonZero" android:pathData=" M79.79 -48.55 C79.79,-48.55 79.75,-53.75 79.78,-55.48 C79.83,-57.62 79.08,-78.36 53.07,-78.83 C29.5,-79.25 25.2,-59.38 25.22,-58.27 C25.25,-56.25 24.97,-31.17 24.97,-31.17 "/><path android:name="_R_G_L_0_G_D_1_P_0" android:strokeColor="?attr/textColor" android:strokeLineCap="round" android:strokeLineJoin="round" android:strokeWidth="16" android:strokeAlpha="1" android:pathData=" M79.79 -48.55 C79.79,-48.55 79.75,-53.75 79.78,-55.48 C79.83,-57.62 79.08,-78.36 53.07,-78.83 C29.5,-79.25 25.2,-59.38 25.22,-58.27 C25.25,-56.25 24.97,-31.17 24.97,-31.17 "/></group></group></group></group><group android:name="time_group"/></vector></aapt:attr><target android:name="_R_G_L_2_G_T_1"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="translateXY" android:duration="400" android:startOffset="0" android:propertyXName="translateX" android:propertyYName="translateY" android:pathData="M 12,15C 12,15.09895833581686 12,15 12,15"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="translateXY" android:duration="67" android:startOffset="400" android:propertyXName="translateX" android:propertyYName="translateY" android:pathData="M 12,15C 12,15.09895833581686 12,15.594 12,15.594"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="translateXY" android:duration="83" android:startOffset="467" android:propertyXName="translateX" android:propertyYName="translateY" android:pathData="M 12,15.594C 12,15.594 12,15.09895833581686 12,15"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="_R_G_L_1_G"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="scaleX" android:duration="450" android:startOffset="0" android:valueFrom="1" android:valueTo="1" android:valueType="floatType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="scaleY" android:duration="450" android:startOffset="0" android:valueFrom="1" android:valueTo="1" android:valueType="floatType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="scaleX" android:duration="67" android:startOffset="450" android:valueFrom="1" android:valueTo="1.1" android:valueType="floatType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="scaleY" android:duration="67" android:startOffset="450" android:valueFrom="1" android:valueTo="1.1" android:valueType="floatType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="scaleX" android:duration="183" android:startOffset="517" android:valueFrom="1.1" android:valueTo="1" android:valueType="floatType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="scaleY" android:duration="183" android:startOffset="517" android:valueFrom="1.1" android:valueTo="1" android:valueType="floatType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="_R_G_L_1_G_N_5_T_1"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="translateXY" android:duration="400" android:startOffset="0" android:propertyXName="translateX" android:propertyYName="translateY" android:pathData="M 12,15C 12,15.09895833581686 12,15 12,15"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="translateXY" android:duration="67" android:startOffset="400" android:propertyXName="translateX" android:propertyYName="translateY" android:pathData="M 12,15C 12,15.09895833581686 12,15.594 12,15.594"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="translateXY" android:duration="83" android:startOffset="467" android:propertyXName="translateX" android:propertyYName="translateY" android:pathData="M 12,15.594C 12,15.594 12,15.09895833581686 12,15"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="_R_G_L_0_G_D_0_P_0"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="pathData" android:duration="317" android:startOffset="0" android:valueFrom="M79.79 -48.55 C79.79,-48.55 79.75,-53.75 79.78,-55.48 C79.83,-57.62 79.08,-78.36 53.07,-78.83 C29.5,-79.25 25.2,-59.38 25.22,-58.27 C25.25,-56.25 24.97,-31.17 24.97,-31.17 " android:valueTo="M-27.97 -55.05 C-27.97,-55.05 -28,-60.25 -27.97,-61.98 C-27.92,-64.13 -23.5,-86.37 -0.75,-86.32 C22.77,-86.26 27.75,-65.87 27.72,-64.77 C27.55,-59.38 27.97,-31.67 27.97,-31.67 " android:valueType="pathType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.974,0 0.458,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="pathData" android:duration="133" android:startOffset="317" android:valueFrom="M-27.97 -55.05 C-27.97,-55.05 -28,-60.25 -27.97,-61.98 C-27.92,-64.13 -23.5,-86.37 -0.75,-86.32 C22.77,-86.26 27.75,-65.87 27.72,-64.77 C27.55,-59.38 27.97,-31.67 27.97,-31.67 " android:valueTo="M-28.21 -28.42 C-28.21,-28.42 -27.85,-44.88 -27.97,-51.98 C-28,-54.13 -23.5,-76.37 -0.75,-76.32 C22.77,-76.26 27.75,-55.87 27.72,-54.77 C27.55,-49.38 27.97,-28.17 27.97,-28.17 " android:valueType="pathType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="pathData" android:duration="250" android:startOffset="450" android:valueFrom="M-28.21 -28.42 C-28.21,-28.42 -27.85,-44.88 -27.97,-51.98 C-28,-54.13 -23.5,-76.37 -0.75,-76.32 C22.77,-76.26 27.75,-55.87 27.72,-54.77 C27.55,-49.38 27.97,-28.17 27.97,-28.17 " android:valueTo="M-28.21 -31.92 C-28.21,-31.92 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 " android:valueType="pathType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.414,0 0.647,1 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="_R_G_L_0_G_D_1_P_0"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="pathData" android:duration="317" android:startOffset="0" android:valueFrom="M79.79 -48.55 C79.79,-48.55 79.75,-53.75 79.78,-55.48 C79.83,-57.62 79.08,-78.36 53.07,-78.83 C29.5,-79.25 25.2,-59.38 25.22,-58.27 C25.25,-56.25 24.97,-31.17 24.97,-31.17 " android:valueTo="M-27.97 -55.05 C-27.97,-55.05 -28,-60.25 -27.97,-61.98 C-27.92,-64.13 -23.5,-86.37 -0.75,-86.32 C22.77,-86.26 27.75,-65.87 27.72,-64.77 C27.55,-59.38 27.97,-31.67 27.97,-31.67 " android:valueType="pathType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.974,0 0.458,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="pathData" android:duration="133" android:startOffset="317" android:valueFrom="M-27.97 -55.05 C-27.97,-55.05 -28,-60.25 -27.97,-61.98 C-27.92,-64.13 -23.5,-86.37 -0.75,-86.32 C22.77,-86.26 27.75,-65.87 27.72,-64.77 C27.55,-59.38 27.97,-31.67 27.97,-31.67 " android:valueTo="M-28.21 -28.42 C-28.21,-28.42 -27.85,-44.88 -27.97,-51.98 C-28,-54.13 -23.5,-76.37 -0.75,-76.32 C22.77,-76.26 27.75,-55.87 27.72,-54.77 C27.55,-49.38 27.97,-28.17 27.97,-28.17 " android:valueType="pathType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="pathData" android:duration="250" android:startOffset="450" android:valueFrom="M-28.21 -28.42 C-28.21,-28.42 -27.85,-44.88 -27.97,-51.98 C-28,-54.13 -23.5,-76.37 -0.75,-76.32 C22.77,-76.26 27.75,-55.87 27.72,-54.77 C27.55,-49.38 27.97,-28.17 27.97,-28.17 " android:valueTo="M-28.21 -31.92 C-28.21,-31.92 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 " android:valueType="pathType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.414,0 0.647,1 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="_R_G_L_0_G_N_5_T_1"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="translateXY" android:duration="400" android:startOffset="0" android:propertyXName="translateX" android:propertyYName="translateY" android:pathData="M 12,15C 12,15.09895833581686 12,15 12,15"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="translateXY" android:duration="67" android:startOffset="400" android:propertyXName="translateX" android:propertyYName="translateY" android:pathData="M 12,15C 12,15.09895833581686 12,15.594 12,15.594"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="translateXY" android:duration="83" android:startOffset="467" android:propertyXName="translateX" android:propertyYName="translateY" android:pathData="M 12,15.594C 12,15.594 12,15.09895833581686 12,15"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="time_group"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="translateX" android:duration="717" android:startOffset="0" android:valueFrom="0" android:valueTo="1" android:valueType="floatType"/></set></aapt:attr></target></animated-vector>
\ No newline at end of file
diff --git a/core/res/res/anim/lock_out.xml b/core/res/res/anim/lock_out.xml
new file mode 100755
index 0000000..2543d47
--- /dev/null
+++ b/core/res/res/anim/lock_out.xml
@@ -0,0 +1,277 @@
+<!--
+     Copyright (C) 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:aapt="http://schemas.android.com/aapt">
+    <aapt:attr name="android:drawable">
+        <vector
+            android:width="24dp"
+            android:height="24dp"
+            android:viewportWidth="24"
+            android:viewportHeight="24">
+            <group android:name="_R_G">
+                <group android:name="_R_G_L_2_G_N_4_T_0_M">
+                    <group
+                        android:name="_R_G_L_2_G_N_4_T_0"
+                        android:pivotX="8.25"
+                        android:pivotY="7.25"
+                        android:scaleX="1"
+                        android:scaleY="1"
+                        android:translateX="3.75"
+                        android:translateY="7.75">
+                        <group
+                            android:name="_R_G_L_2_G"
+                            android:pivotY="-32"
+                            android:scaleX="0.125"
+                            android:scaleY="0.125"
+                            android:translateX="8.25"
+                            android:translateY="32.267">
+                            <path
+                                android:name="_R_G_L_2_G_D_0_P_0"
+                                android:fillAlpha="0"
+                                android:fillColor="#ff0000"
+                                android:fillType="nonZero"
+                                android:pathData=" M-28.21 -31.92 C-28.21,-31.92 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 "
+                                android:trimPathStart="0"
+                                android:trimPathEnd="1"
+                                android:trimPathOffset="0" />
+                            <path
+                                android:name="_R_G_L_2_G_D_1_P_0"
+                                android:pathData=" M-28.21 -31.92 C-28.21,-31.92 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 "
+                                android:strokeWidth="16"
+                                android:strokeAlpha="1"
+                                android:strokeColor="?attr/textColor"
+                                android:trimPathStart="0"
+                                android:trimPathEnd="1"
+                                android:trimPathOffset="0" />
+                        </group>
+                    </group>
+                </group>
+                <group
+                    android:name="_R_G_L_1_G"
+                    android:pivotX="8.25"
+                    android:pivotY="7.25"
+                    android:scaleX="1"
+                    android:scaleY="1"
+                    android:translateX="3.75"
+                    android:translateY="7.75">
+                    <path
+                        android:name="_R_G_L_1_G_D_0_P_0"
+                        android:fillAlpha="1"
+                        android:fillColor="?attr/textColor"
+                        android:fillType="nonZero"
+                        android:pathData=" M14.25 0.25 C14.25,0.25 12.75,0.25 12.75,0.25 C12.75,0.25 10.75,0.25 10.75,0.25 C10.75,0.25 5.75,0.25 5.75,0.25 C5.75,0.25 3.75,0.25 3.75,0.25 C3.75,0.25 2.25,0.25 2.25,0.25 C1.15,0.25 0.25,1.15 0.25,2.25 C0.25,2.25 0.25,12.25 0.25,12.25 C0.25,13.35 1.15,14.25 2.25,14.25 C2.25,14.25 14.25,14.25 14.25,14.25 C15.35,14.25 16.25,13.35 16.25,12.25 C16.25,12.25 16.25,2.25 16.25,2.25 C16.25,1.15 15.35,0.25 14.25,0.25c  M14.25 12.25 C14.25,12.25 2.25,12.25 2.25,12.25 C2.25,12.25 2.25,2.25 2.25,2.25 C2.25,2.25 3.75,2.25 3.75,2.25 C3.75,2.25 12.75,2.25 12.75,2.25 C12.75,2.25 14.25,2.25 14.25,2.25 C14.25,2.25 14.25,12.25 14.25,12.25c " />
+                </group>
+                <group android:name="_R_G_L_0_G_N_4_T_0_M">
+                    <group
+                        android:name="_R_G_L_0_G_N_4_T_0"
+                        android:pivotX="8.25"
+                        android:pivotY="7.25"
+                        android:scaleX="1"
+                        android:scaleY="1"
+                        android:translateX="3.75"
+                        android:translateY="7.75">
+                        <group
+                            android:name="_R_G_L_0_G"
+                            android:translateX="6"
+                            android:translateY="5">
+                            <path
+                                android:name="_R_G_L_0_G_D_0_P_0"
+                                android:fillAlpha="1"
+                                android:fillColor="?attr/textColor"
+                                android:fillType="nonZero"
+                                android:pathData=" M2.25 0.25 C3.35,0.25 4.25,1.15 4.25,2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25c " />
+                        </group>
+                    </group>
+                </group>
+            </group>
+            <group android:name="time_group" />
+        </vector>
+    </aapt:attr>
+    <target android:name="_R_G_L_2_G_D_1_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="150"
+                    android:propertyName="strokeAlpha"
+                    android:startOffset="0"
+                    android:valueFrom="1"
+                    android:valueTo="0"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_2_G_N_4_T_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="200"
+                    android:propertyName="scaleX"
+                    android:startOffset="0"
+                    android:valueFrom="1"
+                    android:valueTo="0.09375"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.521,0 0.942,0.896 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="200"
+                    android:propertyName="scaleY"
+                    android:startOffset="0"
+                    android:valueFrom="1"
+                    android:valueTo="0.09375"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.521,0 0.942,0.896 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_2_G_N_4_T_0_M">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="0"
+                    android:propertyName="scaleY"
+                    android:startOffset="350"
+                    android:valueFrom="1"
+                    android:valueTo="0"
+                    android:valueType="floatType" />
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_1_G_D_0_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="150"
+                    android:propertyName="fillAlpha"
+                    android:startOffset="0"
+                    android:valueFrom="1"
+                    android:valueTo="0.02"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_1_G">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="200"
+                    android:propertyName="scaleX"
+                    android:startOffset="0"
+                    android:valueFrom="1"
+                    android:valueTo="0.09375"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.521,0 0.942,0.896 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="200"
+                    android:propertyName="scaleY"
+                    android:startOffset="0"
+                    android:valueFrom="1"
+                    android:valueTo="0.09375"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.521,0 0.942,0.896 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_0_G_D_0_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="83"
+                    android:propertyName="fillAlpha"
+                    android:startOffset="0"
+                    android:valueFrom="1"
+                    android:valueTo="0"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_0_G_N_4_T_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="200"
+                    android:propertyName="scaleX"
+                    android:startOffset="0"
+                    android:valueFrom="1"
+                    android:valueTo="0.09375"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.521,0 0.942,0.896 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="200"
+                    android:propertyName="scaleY"
+                    android:startOffset="0"
+                    android:valueFrom="1"
+                    android:valueTo="0.09375"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.521,0 0.942,0.896 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_0_G_N_4_T_0_M">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="0"
+                    android:propertyName="scaleY"
+                    android:startOffset="367"
+                    android:valueFrom="1"
+                    android:valueTo="0"
+                    android:valueType="floatType" />
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="time_group">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="500"
+                    android:propertyName="translateX"
+                    android:startOffset="0"
+                    android:valueFrom="0"
+                    android:valueTo="1"
+                    android:valueType="floatType" />
+            </set>
+        </aapt:attr>
+    </target>
+</animated-vector>
\ No newline at end of file
diff --git a/core/res/res/anim/lock_to_error.xml b/core/res/res/anim/lock_to_error.xml
new file mode 100755
index 0000000..29b4964
--- /dev/null
+++ b/core/res/res/anim/lock_to_error.xml
@@ -0,0 +1,574 @@
+<!--
+     Copyright (C) 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:aapt="http://schemas.android.com/aapt">
+    <aapt:attr name="android:drawable">
+        <vector
+            android:width="24dp"
+            android:height="24dp"
+            android:viewportWidth="24"
+            android:viewportHeight="24">
+            <group android:name="_R_G">
+                <group
+                    android:name="_R_G_L_3_G"
+                    android:pivotY="-32"
+                    android:scaleX="0.12762"
+                    android:scaleY="0.12762"
+                    android:translateX="12"
+                    android:translateY="39.871">
+                    <path
+                        android:name="_R_G_L_3_G_D_0_P_0"
+                        android:fillAlpha="0"
+                        android:fillColor="#ff0000"
+                        android:fillType="nonZero"
+                        android:pathData=" M-28.21 -31.92 C-28.21,-31.92 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 "
+                        android:trimPathStart="0"
+                        android:trimPathEnd="1"
+                        android:trimPathOffset="0" />
+                    <path
+                        android:name="_R_G_L_3_G_D_1_P_0"
+                        android:pathData=" M-28.21 -31.92 C-28.21,-31.92 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 "
+                        android:strokeWidth="16"
+                        android:strokeAlpha="1"
+                        android:strokeColor="?attr/textColor"
+                        android:trimPathStart="0"
+                        android:trimPathEnd="1"
+                        android:trimPathOffset="0" />
+                </group>
+                <group
+                    android:name="_R_G_L_2_G_T_1"
+                    android:rotation="45"
+                    android:scaleX="1"
+                    android:scaleY="1"
+                    android:translateX="12"
+                    android:translateY="15">
+                    <group
+                        android:name="_R_G_L_2_G"
+                        android:translateX="-2.25"
+                        android:translateY="-2.25">
+                        <path
+                            android:name="_R_G_L_2_G_D_0_P_0"
+                            android:fillAlpha="1"
+                            android:fillColor="?attr/textColor"
+                            android:fillType="nonZero"
+                            android:pathData=" M2.25 0.25 C3.35,0.25 4.25,1.15 4.25,2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25c " />
+                    </group>
+                </group>
+                <group
+                    android:name="_R_G_L_1_G_T_1"
+                    android:scaleX="0.125"
+                    android:scaleY="0.125"
+                    android:translateX="12.023"
+                    android:translateY="1.281">
+                    <group
+                        android:name="_R_G_L_1_G"
+                        android:translateX="0.317"
+                        android:translateY="45.25">
+                        <path
+                            android:name="_R_G_L_1_G_D_0_P_0"
+                            android:fillAlpha="0"
+                            android:fillColor="#EA4335"
+                            android:fillType="nonZero"
+                            android:pathData=" M4.21 -42.01 C4.21,-42.01 4.21,-32 4.21,-32 C4.21,-32 -5.25,-32 -5.25,-32 C-5.25,-32 -5.25,-42.01 -5.25,-42.01 C-5.25,-42.01 4.21,-42.01 4.21,-42.01c " />
+                    </group>
+                </group>
+                <group
+                    android:name="_R_G_L_0_G"
+                    android:pivotY="21"
+                    android:scaleX="0.14286"
+                    android:scaleY="0.14286"
+                    android:translateX="12"
+                    android:translateY="-6">
+                    <path
+                        android:name="_R_G_L_0_G_D_0_P_0"
+                        android:fillAlpha="0"
+                        android:fillColor="#ffffff"
+                        android:fillType="nonZero"
+                        android:pathData=" M49.24 -12.32 C49.24,-12.32 49.24,52.91 49.24,52.91 C49.24,58.95 44.34,63.85 38.3,63.85 C38.3,63.85 -37.8,63.85 -37.8,63.85 C-43.84,63.85 -48.74,58.95 -48.74,52.91 C-48.74,52.91 -48.74,-12.32 -48.74,-12.32 C-48.74,-18.37 -43.84,-23.27 -37.8,-23.27 C-37.8,-23.27 38.3,-23.27 38.3,-23.27 C44.34,-23.27 49.24,-18.37 49.24,-12.32c " />
+                    <path
+                        android:name="_R_G_L_0_G_D_1_P_0"
+                        android:pathData=" M49.24 -12.32 C49.24,-12.32 49.24,52.91 49.24,52.91 C49.24,58.95 44.34,63.85 38.3,63.85 C38.3,63.85 -37.8,63.85 -37.8,63.85 C-43.84,63.85 -48.74,58.95 -48.74,52.91 C-48.74,52.91 -48.74,-12.32 -48.74,-12.32 C-48.74,-18.37 -43.84,-23.27 -37.8,-23.27 C-37.8,-23.27 38.3,-23.27 38.3,-23.27 C44.34,-23.27 49.24,-18.37 49.24,-12.32c "
+                        android:strokeWidth="14"
+                        android:strokeAlpha="1"
+                        android:strokeColor="?attr/textColor"
+                        android:strokeLineCap="round"
+                        android:strokeLineJoin="round" />
+                </group>
+            </group>
+            <group android:name="time_group" />
+        </vector>
+    </aapt:attr>
+    <target android:name="_R_G_L_3_G_D_0_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="250"
+                    android:propertyName="trimPathStart"
+                    android:startOffset="0"
+                    android:valueFrom="0"
+                    android:valueTo="0.5"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_3_G_D_0_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="250"
+                    android:propertyName="trimPathEnd"
+                    android:startOffset="0"
+                    android:valueFrom="1"
+                    android:valueTo="0.5"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_3_G_D_1_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="117"
+                    android:propertyName="strokeColor"
+                    android:startOffset="0"
+                    android:valueFrom="#fff"
+                    android:valueTo="#fff"
+                    android:valueType="colorType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="17"
+                    android:propertyName="strokeColor"
+                    android:startOffset="117"
+                    android:valueFrom="#fff"
+                    android:valueTo="#EA4335"
+                    android:valueType="colorType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_3_G_D_1_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="133"
+                    android:propertyName="strokeWidth"
+                    android:startOffset="0"
+                    android:valueFrom="16"
+                    android:valueTo="8"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_3_G_D_1_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="250"
+                    android:propertyName="trimPathStart"
+                    android:startOffset="0"
+                    android:valueFrom="0"
+                    android:valueTo="0.5"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_3_G_D_1_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="250"
+                    android:propertyName="trimPathEnd"
+                    android:startOffset="0"
+                    android:valueFrom="1"
+                    android:valueTo="0.5"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_3_G">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="0"
+                    android:propertyName="scaleY"
+                    android:startOffset="183"
+                    android:valueFrom="0.12762"
+                    android:valueTo="0"
+                    android:valueType="floatType" />
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_2_G_D_0_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="117"
+                    android:propertyName="fillColor"
+                    android:startOffset="0"
+                    android:valueFrom="#fff"
+                    android:valueTo="#fff"
+                    android:valueType="colorType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="17"
+                    android:propertyName="fillColor"
+                    android:startOffset="117"
+                    android:valueFrom="#fff"
+                    android:valueTo="#EA4335"
+                    android:valueType="colorType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_2_G_D_0_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="133"
+                    android:propertyName="pathData"
+                    android:startOffset="0"
+                    android:valueFrom="M2.25 0.25 C3.35,0.25 4.25,1.15 4.25,2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25c "
+                    android:valueTo="M2.25 0.25 C3.35,0.25 4.25,1.15 4.25,2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25c "
+                    android:valueType="pathType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="133"
+                    android:propertyName="pathData"
+                    android:startOffset="133"
+                    android:valueFrom="M2.25 0.25 C3.35,0.25 4.25,1.15 4.25,2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25c "
+                    android:valueTo="M2.25 0.25 C2.25,0.25 4.25,2.25 4.25,2.25 C4.25,2.25 2.25,4.25 2.25,4.25 C2.25,4.25 0.25,2.25 0.25,2.25 C0.25,2.25 2.25,0.25 2.25,0.25c "
+                    android:valueType="pathType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_2_G_T_1">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="17"
+                    android:pathData="M 12,15C 12,15.171875 12,14.828125 12,15"
+                    android:propertyName="translateXY"
+                    android:propertyXName="translateX"
+                    android:propertyYName="translateY"
+                    android:startOffset="0">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="333"
+                    android:pathData="M 12,15C 12,15.171875 12,15.859124999999999 12,16.031"
+                    android:propertyName="translateXY"
+                    android:propertyXName="translateX"
+                    android:propertyYName="translateY"
+                    android:startOffset="17">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_2_G_T_1">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="17"
+                    android:propertyName="scaleX"
+                    android:startOffset="0"
+                    android:valueFrom="1"
+                    android:valueTo="1"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="17"
+                    android:propertyName="scaleY"
+                    android:startOffset="0"
+                    android:valueFrom="1"
+                    android:valueTo="1"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="333"
+                    android:propertyName="scaleX"
+                    android:startOffset="17"
+                    android:valueFrom="1"
+                    android:valueTo="0.4325"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="333"
+                    android:propertyName="scaleY"
+                    android:startOffset="17"
+                    android:valueFrom="1"
+                    android:valueTo="0.4325"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_1_G_D_0_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="150"
+                    android:propertyName="fillAlpha"
+                    android:startOffset="0"
+                    android:valueFrom="0"
+                    android:valueTo="0"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="17"
+                    android:propertyName="fillAlpha"
+                    android:startOffset="150"
+                    android:valueFrom="0"
+                    android:valueTo="1"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_1_G_D_0_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="167"
+                    android:propertyName="pathData"
+                    android:startOffset="0"
+                    android:valueFrom="M4.21 -42.01 C4.21,-42.01 4.21,-32 4.21,-32 C4.21,-32 -5.25,-32 -5.25,-32 C-5.25,-32 -5.25,-42.01 -5.25,-42.01 C-5.25,-42.01 4.21,-42.01 4.21,-42.01c "
+                    android:valueTo="M4.21 -42.01 C4.21,-42.01 4.21,-32 4.21,-32 C4.21,-32 -5.25,-32 -5.25,-32 C-5.25,-32 -5.25,-42.01 -5.25,-42.01 C-5.25,-42.01 4.21,-42.01 4.21,-42.01c "
+                    android:valueType="pathType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="183"
+                    android:propertyName="pathData"
+                    android:startOffset="167"
+                    android:valueFrom="M4.21 -42.01 C4.21,-42.01 4.21,-32 4.21,-32 C4.21,-32 -5.25,-32 -5.25,-32 C-5.25,-32 -5.25,-42.01 -5.25,-42.01 C-5.25,-42.01 4.21,-42.01 4.21,-42.01c "
+                    android:valueTo="M4.21 -42.01 C4.21,-42.01 4.16,33 4.16,33 C4.16,33 -5.3,33 -5.3,33 C-5.3,33 -5.25,-42.01 -5.25,-42.01 C-5.25,-42.01 4.21,-42.01 4.21,-42.01c "
+                    android:valueType="pathType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="50"
+                    android:propertyName="pathData"
+                    android:startOffset="350"
+                    android:valueFrom="M4.21 -42.01 C4.21,-42.01 4.16,33 4.16,33 C4.16,33 -5.3,33 -5.3,33 C-5.3,33 -5.25,-42.01 -5.25,-42.01 C-5.25,-42.01 4.21,-42.01 4.21,-42.01c "
+                    android:valueTo="M4.21 -42.01 C4.21,-42.01 4.19,30.81 4.19,30.81 C4.19,30.81 -5.27,30.81 -5.27,30.81 C-5.27,30.81 -5.25,-42.01 -5.25,-42.01 C-5.25,-42.01 4.21,-42.01 4.21,-42.01c "
+                    android:valueType="pathType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_1_G_T_1">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="167"
+                    android:pathData="M 12.023,1.281C 12.023,1.656 12.023,0.9059999999999999 12.023,1.281"
+                    android:propertyName="translateXY"
+                    android:propertyXName="translateX"
+                    android:propertyYName="translateY"
+                    android:startOffset="0">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="183"
+                    android:pathData="M 12.023,1.281C 12.023,1.656 12.023,3.156 12.023,3.531"
+                    android:propertyName="translateXY"
+                    android:propertyXName="translateX"
+                    android:propertyYName="translateY"
+                    android:startOffset="167">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_1_G_T_1">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="0"
+                    android:propertyName="scaleX"
+                    android:startOffset="167"
+                    android:valueFrom="0"
+                    android:valueTo="0.125"
+                    android:valueType="floatType" />
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_0_G_D_0_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="267"
+                    android:propertyName="pathData"
+                    android:startOffset="0"
+                    android:valueFrom="M49.24 -12.32 C49.24,-12.32 49.24,52.91 49.24,52.91 C49.24,58.95 44.34,63.85 38.3,63.85 C38.3,63.85 -37.8,63.85 -37.8,63.85 C-43.84,63.85 -48.74,58.95 -48.74,52.91 C-48.74,52.91 -48.74,-12.32 -48.74,-12.32 C-48.74,-18.37 -43.84,-23.27 -37.8,-23.27 C-37.8,-23.27 38.3,-23.27 38.3,-23.27 C44.34,-23.27 49.24,-18.37 49.24,-12.32c "
+                    android:valueTo="M75.1 -1.1 C75.1,19.57 66.72,38.28 53.18,51.83 C39.63,65.37 20.92,73.75 0.25,73.75 C-20.42,73.75 -39.13,65.37 -52.68,51.83 C-66.22,38.28 -74.6,19.57 -74.6,-1.1 C-74.6,-21.77 -66.22,-40.48 -52.68,-54.02 C-39.13,-67.57 -20.42,-75.95 0.25,-75.95 C20.92,-75.95 39.63,-67.57 53.18,-54.02 C66.72,-40.48 75.1,-21.77 75.1,-1.1c "
+                    android:valueType="pathType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_0_G_D_1_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="117"
+                    android:propertyName="strokeColor"
+                    android:startOffset="0"
+                    android:valueFrom="#fff"
+                    android:valueTo="#fff"
+                    android:valueType="colorType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="17"
+                    android:propertyName="strokeColor"
+                    android:startOffset="117"
+                    android:valueFrom="#fff"
+                    android:valueTo="#EA4335"
+                    android:valueType="colorType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_0_G_D_1_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="267"
+                    android:propertyName="strokeWidth"
+                    android:startOffset="0"
+                    android:valueFrom="14"
+                    android:valueTo="12"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_0_G_D_1_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="267"
+                    android:propertyName="pathData"
+                    android:startOffset="0"
+                    android:valueFrom="M49.24 -12.32 C49.24,-12.32 49.24,52.91 49.24,52.91 C49.24,58.95 44.34,63.85 38.3,63.85 C38.3,63.85 -37.8,63.85 -37.8,63.85 C-43.84,63.85 -48.74,58.95 -48.74,52.91 C-48.74,52.91 -48.74,-12.32 -48.74,-12.32 C-48.74,-18.37 -43.84,-23.27 -37.8,-23.27 C-37.8,-23.27 38.3,-23.27 38.3,-23.27 C44.34,-23.27 49.24,-18.37 49.24,-12.32c "
+                    android:valueTo="M75.1 -1.1 C75.1,19.57 66.72,38.28 53.18,51.83 C39.63,65.37 20.92,73.75 0.25,73.75 C-20.42,73.75 -39.13,65.37 -52.68,51.83 C-66.22,38.28 -74.6,19.57 -74.6,-1.1 C-74.6,-21.77 -66.22,-40.48 -52.68,-54.02 C-39.13,-67.57 -20.42,-75.95 0.25,-75.95 C20.92,-75.95 39.63,-67.57 53.18,-54.02 C66.72,-40.48 75.1,-21.77 75.1,-1.1c "
+                    android:valueType="pathType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="time_group">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="1017"
+                    android:propertyName="translateX"
+                    android:startOffset="0"
+                    android:valueFrom="0"
+                    android:valueTo="1"
+                    android:valueType="floatType" />
+            </set>
+        </aapt:attr>
+    </target>
+</animated-vector>
\ No newline at end of file
diff --git a/core/res/res/anim/lock_unlock.xml b/core/res/res/anim/lock_unlock.xml
new file mode 100755
index 0000000..9cc31a0
--- /dev/null
+++ b/core/res/res/anim/lock_unlock.xml
@@ -0,0 +1,337 @@
+<!--
+     Copyright (C) 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:aapt="http://schemas.android.com/aapt">
+    <aapt:attr name="android:drawable">
+        <vector
+            android:width="24dp"
+            android:height="24dp"
+            android:viewportWidth="24"
+            android:viewportHeight="24">
+            <group android:name="_R_G">
+                <group
+                    android:name="_R_G_L_2_G_T_1"
+                    android:translateX="12"
+                    android:translateY="15">
+                    <group
+                        android:name="_R_G_L_2_G"
+                        android:translateX="-8.25"
+                        android:translateY="-7.25">
+                        <path
+                            android:name="_R_G_L_2_G_D_0_P_0"
+                            android:fillAlpha="1"
+                            android:fillColor="?attr/textColor"
+                            android:fillType="nonZero"
+                            android:pathData=" M14.25 0.25 C14.25,0.25 12.75,0.25 12.75,0.25 C12.75,0.25 10.75,0.25 10.75,0.25 C10.75,0.25 5.75,0.25 5.75,0.25 C5.75,0.25 3.75,0.25 3.75,0.25 C3.75,0.25 2.25,0.25 2.25,0.25 C1.15,0.25 0.25,1.15 0.25,2.25 C0.25,2.25 0.25,12.25 0.25,12.25 C0.25,13.35 1.15,14.25 2.25,14.25 C2.25,14.25 14.25,14.25 14.25,14.25 C15.35,14.25 16.25,13.35 16.25,12.25 C16.25,12.25 16.25,2.25 16.25,2.25 C16.25,1.15 15.35,0.25 14.25,0.25c  M14.25 12.25 C14.25,12.25 2.25,12.25 2.25,12.25 C2.25,12.25 2.25,2.25 2.25,2.25 C2.25,2.25 3.75,2.25 3.75,2.25 C3.75,2.25 12.75,2.25 12.75,2.25 C12.75,2.25 14.25,2.25 14.25,2.25 C14.25,2.25 14.25,12.25 14.25,12.25c " />
+                    </group>
+                </group>
+                <group
+                    android:name="_R_G_L_1_G_N_5_T_1"
+                    android:translateX="12"
+                    android:translateY="15">
+                    <group
+                        android:name="_R_G_L_1_G_N_5_T_0"
+                        android:translateX="-8.25"
+                        android:translateY="-7.25">
+                        <group
+                            android:name="_R_G_L_1_G"
+                            android:pivotX="2.25"
+                            android:pivotY="2.25"
+                            android:scaleX="1"
+                            android:scaleY="1"
+                            android:translateX="6"
+                            android:translateY="5">
+                            <path
+                                android:name="_R_G_L_1_G_D_0_P_0"
+                                android:fillAlpha="1"
+                                android:fillColor="?attr/textColor"
+                                android:fillType="nonZero"
+                                android:pathData=" M2.25 0.25 C3.35,0.25 4.25,1.15 4.25,2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25c " />
+                        </group>
+                    </group>
+                </group>
+                <group
+                    android:name="_R_G_L_0_G_N_5_T_1"
+                    android:translateX="12"
+                    android:translateY="15">
+                    <group
+                        android:name="_R_G_L_0_G_N_5_T_0"
+                        android:translateX="-8.25"
+                        android:translateY="-7.25">
+                        <group
+                            android:name="_R_G_L_0_G"
+                            android:pivotX="27.965"
+                            android:pivotY="-32"
+                            android:scaleX="0.125"
+                            android:scaleY="0.125"
+                            android:translateX="-16.219"
+                            android:translateY="32.25">
+                            <path
+                                android:name="_R_G_L_0_G_D_0_P_0"
+                                android:fillAlpha="0"
+                                android:fillColor="#ff0000"
+                                android:fillType="nonZero"
+                                android:pathData=" M-28.21 -31.92 C-28.21,-31.92 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 " />
+                            <path
+                                android:name="_R_G_L_0_G_D_1_P_0"
+                                android:pathData=" M-28.21 -31.92 C-28.21,-31.92 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 "
+                                android:strokeWidth="16"
+                                android:strokeAlpha="1"
+                                android:strokeColor="?attr/textColor"/>
+                        </group>
+                    </group>
+                </group>
+            </group>
+            <group android:name="time_group" />
+        </vector>
+    </aapt:attr>
+    <target android:name="_R_G_L_2_G_T_1">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="133"
+                    android:pathData="M 12,15C 12,14.85416667163372 12,14.125 12,14.125"
+                    android:propertyName="translateXY"
+                    android:propertyXName="translateX"
+                    android:propertyYName="translateY"
+                    android:startOffset="0">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="133"
+                    android:pathData="M 12,14.125C 12,14.125 12,15.05870145463943 12,15.324"
+                    android:propertyName="translateXY"
+                    android:propertyXName="translateX"
+                    android:propertyYName="translateY"
+                    android:startOffset="133">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="100"
+                    android:pathData="M 12,15.324C 12,15.40252217555046 12,14.96669441461563 12,15"
+                    android:propertyName="translateXY"
+                    android:propertyXName="translateX"
+                    android:propertyYName="translateY"
+                    android:startOffset="267">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_1_G">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="100"
+                    android:propertyName="scaleX"
+                    android:startOffset="0"
+                    android:valueFrom="1"
+                    android:valueTo="0.85"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="100"
+                    android:propertyName="scaleY"
+                    android:startOffset="0"
+                    android:valueFrom="1"
+                    android:valueTo="0.85"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="283"
+                    android:propertyName="scaleX"
+                    android:startOffset="100"
+                    android:valueFrom="0.85"
+                    android:valueTo="1"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="283"
+                    android:propertyName="scaleY"
+                    android:startOffset="100"
+                    android:valueFrom="0.85"
+                    android:valueTo="1"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_1_G_N_5_T_1">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="133"
+                    android:pathData="M 12,15C 12,14.85416667163372 12,14.125 12,14.125"
+                    android:propertyName="translateXY"
+                    android:propertyXName="translateX"
+                    android:propertyYName="translateY"
+                    android:startOffset="0">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="133"
+                    android:pathData="M 12,14.125C 12,14.125 12,15.05870145463943 12,15.324"
+                    android:propertyName="translateXY"
+                    android:propertyXName="translateX"
+                    android:propertyYName="translateY"
+                    android:startOffset="133">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="100"
+                    android:pathData="M 12,15.324C 12,15.40252217555046 12,14.96669441461563 12,15"
+                    android:propertyName="translateXY"
+                    android:propertyXName="translateX"
+                    android:propertyYName="translateY"
+                    android:startOffset="267">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_0_G_D_0_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="67"
+                    android:propertyName="pathData"
+                    android:startOffset="0"
+                    android:valueFrom="M-28.21 -31.92 C-28.21,-31.92 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 "
+                    android:valueTo="M-27.97 -48.55 C-27.97,-48.55 -28,-53.75 -27.97,-55.48 C-27.92,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 "
+                    android:valueType="pathType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.353,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="333"
+                    android:propertyName="pathData"
+                    android:startOffset="67"
+                    android:valueFrom="M-27.97 -48.55 C-27.97,-48.55 -28,-53.75 -27.97,-55.48 C-27.92,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 "
+                    android:valueTo="M79.79 -48.55 C79.79,-48.55 79.75,-53.75 79.78,-55.48 C79.83,-57.62 79.08,-78.36 53.07,-78.83 C29.5,-79.25 25.2,-59.38 25.22,-58.27 C25.25,-56.25 24.97,-31.17 24.97,-31.17 "
+                    android:valueType="pathType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.542,0 0.026,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_0_G_D_1_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="67"
+                    android:propertyName="pathData"
+                    android:startOffset="0"
+                    android:valueFrom="M-28.21 -31.92 C-28.21,-31.92 -27.85,-48.38 -27.97,-55.48 C-28,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 "
+                    android:valueTo="M-27.97 -48.55 C-27.97,-48.55 -28,-53.75 -27.97,-55.48 C-27.92,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 "
+                    android:valueType="pathType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.353,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="333"
+                    android:propertyName="pathData"
+                    android:startOffset="67"
+                    android:valueFrom="M-27.97 -48.55 C-27.97,-48.55 -28,-53.75 -27.97,-55.48 C-27.92,-57.63 -23.5,-79.87 -0.75,-79.82 C22.77,-79.76 27.75,-59.37 27.72,-58.27 C27.55,-52.88 27.97,-31.67 27.97,-31.67 "
+                    android:valueTo="M79.79 -48.55 C79.79,-48.55 79.75,-53.75 79.78,-55.48 C79.83,-57.62 79.08,-78.36 53.07,-78.83 C29.5,-79.25 25.2,-59.38 25.22,-58.27 C25.25,-56.25 24.97,-31.17 24.97,-31.17 "
+                    android:valueType="pathType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.542,0 0.026,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_0_G_N_5_T_1">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="133"
+                    android:pathData="M 12,15C 12,14.85416667163372 12,14.125 12,14.125"
+                    android:propertyName="translateXY"
+                    android:propertyXName="translateX"
+                    android:propertyYName="translateY"
+                    android:startOffset="0">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="133"
+                    android:pathData="M 12,14.125C 12,14.125 12,15.05870145463943 12,15.324"
+                    android:propertyName="translateXY"
+                    android:propertyXName="translateX"
+                    android:propertyYName="translateY"
+                    android:startOffset="133">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="100"
+                    android:pathData="M 12,15.324C 12,15.40252217555046 12,14.96669441461563 12,15"
+                    android:propertyName="translateXY"
+                    android:propertyXName="translateX"
+                    android:propertyYName="translateY"
+                    android:startOffset="267">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="time_group">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="717"
+                    android:propertyName="translateX"
+                    android:startOffset="0"
+                    android:valueFrom="0"
+                    android:valueTo="1"
+                    android:valueType="floatType" />
+            </set>
+        </aapt:attr>
+    </target>
+</animated-vector>
\ No newline at end of file
diff --git a/packages/SettingsLib/res/drawable/btn_borderless_rect.xml b/core/res/res/drawable/btn_borderless_rect.xml
similarity index 100%
rename from packages/SettingsLib/res/drawable/btn_borderless_rect.xml
rename to core/res/res/drawable/btn_borderless_rect.xml
diff --git a/core/res/res/drawable/chooser_content_preview_rounded.xml b/core/res/res/drawable/chooser_content_preview_rounded.xml
new file mode 100644
index 0000000..7d85738
--- /dev/null
+++ b/core/res/res/drawable/chooser_content_preview_rounded.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+
+    <stroke
+        android:width="1dp"
+        android:color="#ccc" />
+ 
+    <corners android:radius="@dimen/chooser_corner_radius" />
+
+    <padding
+        android:left="16dp"
+        android:top="12dp"
+        android:right="16dp"
+        android:bottom="12dp"/>
+</shape>
diff --git a/core/res/res/drawable/ic_auth_error.xml b/core/res/res/drawable/ic_auth_error.xml
new file mode 100644
index 0000000..ea5f572
--- /dev/null
+++ b/core/res/res/drawable/ic_auth_error.xml
@@ -0,0 +1,23 @@
+<!--
+     Copyright (C) 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector android:height="24dp" android:viewportHeight="60"
+        android:viewportWidth="60" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="?attr/colorError" android:pathData="M28.8,37.5l2.4,0l0,2.5l-2.4,0z"/>
+    <path android:fillColor="?attr/colorError" android:pathData="M28.8,17.5l2.4,0l0,15l-2.4,0z"/>
+    <path android:fillColor="#00000000"
+          android:pathData="M30,6.2c-13.1,0 -23.7,10.6 -23.7,23.8S16.9,53.8 30,53.8c13.1,0 23.8,-10.6 23.8,-23.8S43.1,6.2 30,6.2z"
+          android:strokeColor="?android:attr/colorError" android:strokeWidth="2.5"/>
+</vector>
diff --git a/packages/SettingsLib/res/drawable/ic_bt_headphones_a2dp.xml b/core/res/res/drawable/ic_bt_headphones_a2dp.xml
similarity index 100%
rename from packages/SettingsLib/res/drawable/ic_bt_headphones_a2dp.xml
rename to core/res/res/drawable/ic_bt_headphones_a2dp.xml
diff --git a/packages/SettingsLib/res/drawable/ic_bt_headset_hfp.xml b/core/res/res/drawable/ic_bt_headset_hfp.xml
similarity index 100%
rename from packages/SettingsLib/res/drawable/ic_bt_headset_hfp.xml
rename to core/res/res/drawable/ic_bt_headset_hfp.xml
diff --git a/packages/SettingsLib/res/drawable/ic_bt_hearing_aid.xml b/core/res/res/drawable/ic_bt_hearing_aid.xml
similarity index 100%
rename from packages/SettingsLib/res/drawable/ic_bt_hearing_aid.xml
rename to core/res/res/drawable/ic_bt_hearing_aid.xml
diff --git a/packages/SettingsLib/res/drawable/ic_bt_laptop.xml b/core/res/res/drawable/ic_bt_laptop.xml
similarity index 100%
rename from packages/SettingsLib/res/drawable/ic_bt_laptop.xml
rename to core/res/res/drawable/ic_bt_laptop.xml
diff --git a/packages/SettingsLib/res/drawable/ic_bt_misc_hid.xml b/core/res/res/drawable/ic_bt_misc_hid.xml
similarity index 100%
rename from packages/SettingsLib/res/drawable/ic_bt_misc_hid.xml
rename to core/res/res/drawable/ic_bt_misc_hid.xml
diff --git a/packages/SettingsLib/res/drawable/ic_bt_network_pan.xml b/core/res/res/drawable/ic_bt_network_pan.xml
similarity index 100%
rename from packages/SettingsLib/res/drawable/ic_bt_network_pan.xml
rename to core/res/res/drawable/ic_bt_network_pan.xml
diff --git a/packages/SettingsLib/res/drawable/ic_bt_pointing_hid.xml b/core/res/res/drawable/ic_bt_pointing_hid.xml
similarity index 100%
rename from packages/SettingsLib/res/drawable/ic_bt_pointing_hid.xml
rename to core/res/res/drawable/ic_bt_pointing_hid.xml
diff --git a/core/res/res/drawable/ic_content_copy_gm2.xml b/core/res/res/drawable/ic_content_copy_gm2.xml
new file mode 100644
index 0000000..940da94
--- /dev/null
+++ b/core/res/res/drawable/ic_content_copy_gm2.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="#F999"
+      android:pathData="M18,21L4,21L4,7L2,7v14c0,1.1 0.9,2 2,2h14v-2zM21,17L21,3c0,-1.1 -0.9,-2 -2,-2L8,1c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h11c1.1,0 2,-0.9 2,-2zM19,17L8,17L8,3h11v14z"/>
+</vector>
diff --git a/packages/SettingsLib/res/drawable/ic_expand_more.xml b/core/res/res/drawable/ic_expand_more.xml
similarity index 100%
rename from packages/SettingsLib/res/drawable/ic_expand_more.xml
rename to core/res/res/drawable/ic_expand_more.xml
diff --git a/core/res/res/drawable/ic_lock_24dp.xml b/core/res/res/drawable/ic_lock_24dp.xml
new file mode 100644
index 0000000..d848426
--- /dev/null
+++ b/core/res/res/drawable/ic_lock_24dp.xml
@@ -0,0 +1,30 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24.0dp"
+        android:height="24.0dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="?attr/textColor"
+        android:pathData="M12.0,15.0m-2.0,0.0a2.0,2.0 0.0,1.0 1.0,4.0 0.0a2.0,2.0 0.0,1.0 1.0,-4.0 0.0"/>
+    <path
+        android:pathData="M0,0h24v24H0V0z"
+        android:fillColor="#00000000"/>
+    <path
+        android:fillColor="?attr/textColor"
+        android:pathData="M18.0,8.0l-1.5,0.0L16.5,5.5C16.5,3.01 14.49,1.0 12.0,1.0S7.5,3.01 7.5,5.5L7.5,8.0L6.0,8.0c-1.1,0.0 -2.0,0.9 -2.0,2.0l0.0,10.0c0.0,1.1 0.9,2.0 2.0,2.0l12.0,0.0c1.1,0.0 2.0,-0.9 2.0,-2.0L20.0,10.0C20.0,8.9 19.1,8.0 18.0,8.0zM9.5,5.5C9.5,4.12 10.62,3.0 12.0,3.0c1.38,0.0 2.5,1.12 2.5,2.5L14.5,8.0l-5.0,0.0L9.5,5.5zM18.0,20.0L6.0,20.0L6.0,10.0l1.5,0.0l9.0,0.0L18.0,10.0L18.0,20.0z"/>
+</vector>
diff --git a/core/res/res/drawable/ic_lock_open_24dp.xml b/core/res/res/drawable/ic_lock_open_24dp.xml
new file mode 100644
index 0000000..94eecad
--- /dev/null
+++ b/core/res/res/drawable/ic_lock_open_24dp.xml
@@ -0,0 +1,30 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24.0dp"
+        android:height="24.0dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="?attr/textColor"
+        android:pathData="M12.0,15.0m-2.0,0.0a2.0,2.0 0.0,1.0 1.0,4.0 0.0a2.0,2.0 0.0,1.0 1.0,-4.0 0.0"/>
+    <path
+        android:fillColor="?attr/textColor"
+        android:pathData="M18.5,1.0C16.01,1.0 14.0,3.01 14.0,5.5L14.0,8.0L6.0,8.0c-1.1,0.0 -2.0,0.9 -2.0,2.0l0.0,10.0c0.0,1.1 0.9,2.0 2.0,2.0l12.0,0.0c1.1,0.0 2.0,-0.9 2.0,-2.0L20.0,10.0c0.0,-1.1 -0.9,-2.0 -2.0,-2.0l-2.0,0.0L16.0,5.5C16.0,4.12 17.12,3.0 18.5,3.0C19.88,3.0 21.0,4.12 21.0,5.5L21.0,6.0l2.0,0.0L23.0,5.5C23.0,3.01 20.99,1.0 18.5,1.0zM18.0,10.0l0.0,10.0L6.0,20.0L6.0,10.0L18.0,10.0z"/>
+    <path
+        android:pathData="M0,0h24v24H0V0z"
+        android:fillColor="#00000000"/>
+</vector>
diff --git a/packages/SettingsLib/res/drawable/ic_lockscreen_ime.xml b/core/res/res/drawable/ic_lockscreen_ime.xml
similarity index 100%
rename from packages/SettingsLib/res/drawable/ic_lockscreen_ime.xml
rename to core/res/res/drawable/ic_lockscreen_ime.xml
diff --git a/core/res/res/drawable/ic_media_seamless.xml b/core/res/res/drawable/ic_media_seamless.xml
new file mode 100644
index 0000000..122e9c5
--- /dev/null
+++ b/core/res/res/drawable/ic_media_seamless.xml
@@ -0,0 +1,25 @@
+<!--
+    Copyright (C) 2017 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0"
+        android:tint="?android:attr/colorControlNormal">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M12,3l0.01,10.55c-0.59,-0.34 -1.27,-0.55 -2,-0.55C7.79,13 6,14.79 6,17c0,2.21 1.79,4 4.01,4S14,19.21 14,17V7h4V3H12zM10.01,19c-1.1,0 -2,-0.9 -2,-2c0,-1.1 0.9,-2 2,-2s2,0.9 2,2C12.01,18.1 11.11,19 10.01,19z"/>
+</vector>
diff --git a/packages/SettingsLib/res/drawable/ic_menu.xml b/core/res/res/drawable/ic_menu.xml
similarity index 100%
rename from packages/SettingsLib/res/drawable/ic_menu.xml
rename to core/res/res/drawable/ic_menu.xml
diff --git a/packages/SettingsLib/res/drawable/ic_minus.xml b/core/res/res/drawable/ic_minus.xml
similarity index 100%
rename from packages/SettingsLib/res/drawable/ic_minus.xml
rename to core/res/res/drawable/ic_minus.xml
diff --git a/packages/SettingsLib/res/drawable/ic_mode_edit.xml b/core/res/res/drawable/ic_mode_edit.xml
similarity index 100%
rename from packages/SettingsLib/res/drawable/ic_mode_edit.xml
rename to core/res/res/drawable/ic_mode_edit.xml
diff --git a/packages/SettingsLib/res/drawable/ic_bt_cellphone.xml b/core/res/res/drawable/ic_phone.xml
similarity index 100%
rename from packages/SettingsLib/res/drawable/ic_bt_cellphone.xml
rename to core/res/res/drawable/ic_phone.xml
diff --git a/packages/SettingsLib/res/drawable/ic_plus.xml b/core/res/res/drawable/ic_plus.xml
similarity index 100%
rename from packages/SettingsLib/res/drawable/ic_plus.xml
rename to core/res/res/drawable/ic_plus.xml
diff --git a/packages/SettingsLib/res/drawable/ic_qs_night_display_on.xml b/core/res/res/drawable/ic_qs_night_display_on.xml
similarity index 100%
rename from packages/SettingsLib/res/drawable/ic_qs_night_display_on.xml
rename to core/res/res/drawable/ic_qs_night_display_on.xml
diff --git a/packages/SettingsLib/res/drawable/ic_settings_bluetooth.xml b/core/res/res/drawable/ic_settings_bluetooth.xml
similarity index 100%
rename from packages/SettingsLib/res/drawable/ic_settings_bluetooth.xml
rename to core/res/res/drawable/ic_settings_bluetooth.xml
diff --git a/packages/SettingsLib/res/drawable/ic_settings_print.xml b/core/res/res/drawable/ic_settings_print.xml
similarity index 100%
rename from packages/SettingsLib/res/drawable/ic_settings_print.xml
rename to core/res/res/drawable/ic_settings_print.xml
diff --git a/packages/SettingsLib/res/drawable/ic_signal_location.xml b/core/res/res/drawable/ic_signal_location.xml
similarity index 100%
rename from packages/SettingsLib/res/drawable/ic_signal_location.xml
rename to core/res/res/drawable/ic_signal_location.xml
diff --git a/core/res/res/layout/chooser_grid.xml b/core/res/res/layout/chooser_grid.xml
index ded2b35..a24f920 100644
--- a/core/res/res/layout/chooser_grid.xml
+++ b/core/res/res/layout/chooser_grid.xml
@@ -17,21 +17,19 @@
 */
 -->
 <com.android.internal.widget.ResolverDrawerLayout
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:maxWidth="@dimen/resolver_max_width"
-        android:maxCollapsedHeight="288dp"
-        android:maxCollapsedHeightSmall="56dp"
-        android:id="@id/contentPanel">
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:maxWidth="@dimen/resolver_max_width"
+    android:maxCollapsedHeight="288dp"
+    android:maxCollapsedHeightSmall="56dp"
+    android:id="@id/contentPanel">
 
     <RelativeLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_alwaysShow="true"
-            android:elevation="8dp"
-            android:paddingStart="16dp"
-            android:background="?attr/colorBackgroundFloating" >
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_alwaysShow="true"
+        android:background="?attr/colorBackgroundFloating">
         <TextView android:id="@+id/profile_button"
                   android:layout_width="wrap_content"
                   android:layout_height="48dp"
@@ -46,39 +44,105 @@
                   android:layout_alignParentTop="true"
                   android:layout_alignParentRight="true"
                   android:singleLine="true"/>
-        <ImageView android:id="@+id/title_icon"
-                   android:layout_width="24dp"
-                   android:layout_height="24dp"
-                   android:layout_marginEnd="16dp"
-                   android:visibility="gone"
-                   android:scaleType="fitCenter"
-                   android:layout_below="@id/profile_button"
-                   android:layout_alignParentLeft="true"/>
+
         <TextView android:id="@+id/title"
                   android:layout_height="wrap_content"
                   android:layout_width="wrap_content"
                   android:textAppearance="?attr/textAppearanceMedium"
-                  android:textSize="14sp"
-                  android:gravity="start|center_vertical"
-                  android:paddingEnd="?attr/dialogPreferredPadding"
-                  android:paddingTop="12dp"
-                  android:paddingBottom="12dp"
+                  android:textSize="20sp"
+                  android:gravity="center"
+                  android:paddingTop="18dp"
+                  android:paddingBottom="18dp"
+                  android:paddingLeft="24dp"
+                  android:paddingRight="24dp"
                   android:layout_below="@id/profile_button"
-                  android:layout_toRightOf="@id/title_icon"/>
+                  android:layout_centerHorizontal="true"/>
     </RelativeLayout>
 
-    <ListView
+    <LinearLayout
+        android:id="@+id/content_preview"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        android:paddingBottom="@dimen/chooser_view_spacing"
+        android:background="?attr/colorBackgroundFloating">
+
+        <LinearLayout
             android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:id="@+id/resolver_list"
-            android:clipToPadding="false"
-            android:scrollbarStyle="outsideOverlay"
-            android:background="?attr/colorBackgroundFloating"
-            android:elevation="8dp"
-            android:listSelector="@color/transparent"
-            android:divider="@null"
-            android:scrollIndicators="top"
-            android:nestedScrollingEnabled="true" />
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:paddingLeft="@dimen/chooser_edge_margin_normal"
+            android:paddingRight="@dimen/chooser_edge_margin_normal"
+            android:layout_marginBottom="@dimen/chooser_view_spacing"
+            android:id="@+id/content_preview_text_layout">
+            <TextView
+                android:id="@+id/content_preview_text"
+                android:layout_width="0dp"
+                android:layout_weight="1"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical"
+                android:ellipsize="end"
+                android:gravity="start|top"
+                android:paddingRight="24dp"
+                android:maxLines="2"/>
+            <Button
+                android:id="@+id/copy_button"
+                android:layout_width="24dp"
+                android:layout_height="24dp"
+                android:gravity="center"
+                android:layout_gravity="center_vertical"
+                android:background="@drawable/ic_content_copy_gm2"/>
+        </LinearLayout>
+
+        <!-- Required sub-layout so we can get the nice rounded corners-->
+        <!-- around this section -->
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:layout_marginLeft="@dimen/chooser_edge_margin_thin"
+            android:layout_marginRight="@dimen/chooser_edge_margin_thin"
+            android:minHeight="80dp"
+            android:background="@drawable/chooser_content_preview_rounded"
+            android:id="@+id/content_preview_title_layout">
+
+            <view class="com.android.internal.app.ChooserActivity$RoundedRectImageView"
+                  android:id="@+id/content_preview_thumbnail"
+                  android:layout_width="80dp"
+                  android:layout_height="80dp"
+                  android:layout_marginRight="12dp"
+                  android:adjustViewBounds="true"
+                  android:layout_gravity="center_vertical"
+                  android:gravity="center"
+                  android:maxWidth="70dp"
+                  android:maxHeight="70dp"
+                  android:padding="5dp"
+                  android:scaleType="centerCrop"/>
+
+            <TextView
+                android:id="@+id/content_preview_title"
+                android:layout_width="0dp"
+                android:layout_weight="1"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical"
+                android:ellipsize="end"
+                android:maxLines="2"
+                android:textAppearance="?attr/textAppearanceMedium"/>
+        </LinearLayout>
+    </LinearLayout>
+
+    <ListView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:id="@+id/resolver_list"
+        android:clipToPadding="false"
+        android:scrollbarStyle="outsideOverlay"
+        android:background="?attr/colorBackgroundFloating"
+        android:elevation="8dp"
+        android:listSelector="@color/transparent"
+        android:divider="@null"
+        android:scrollIndicators="top"
+        android:nestedScrollingEnabled="true"/>
 
     <TextView android:id="@+id/empty"
               android:layout_width="match_parent"
@@ -88,6 +152,6 @@
               android:text="@string/noApplications"
               android:padding="32dp"
               android:gravity="center"
-              android:visibility="gone" />
+              android:visibility="gone"/>
 
 </com.android.internal.widget.ResolverDrawerLayout>
diff --git a/core/res/res/layout/notification_template_material_big_media.xml b/core/res/res/layout/notification_template_material_big_media.xml
index 5cb93eb..56f7a59 100644
--- a/core/res/res/layout/notification_template_material_big_media.xml
+++ b/core/res/res/layout/notification_template_material_big_media.xml
@@ -79,6 +79,10 @@
                 layout="@layout/notification_material_media_action"
                 android:id="@+id/action4"
             />
+            <include
+                layout="@layout/notification_material_media_action"
+                android:id="@+id/media_seamless"
+            />
         </LinearLayout>
     </LinearLayout>
 </com.android.internal.widget.MediaNotificationView>
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 770a82e..26aa99b 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tik om alle netwerke te sien"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Koppel"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Alle netwerke"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Gekoppel aan Wi‑Fi-netwerk wat voorgestel is deur <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Wil jy <xliff:g id="NAME">%s</xliff:g> toelaat om netwerke vir jou voor te stel?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Ja"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Nee"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi sal outomaties aanskakel"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi‑Fi het geen internettoegang nie"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tik vir opsies"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Veranderings aan jou warmkolinstellings"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Jou warmkolband het verander."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Hierdie toestel steun nie jou voorkeur vir net 5 GHz nie. Hierdie toestel sal in plaas daarvan die 5 GHz-band gebruik wanneer dit beskikbaar is."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB-ontfouter gekoppel"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Tik om USB-ontfouting af te skakel"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Kies om USB-ontfouting te deaktiveer."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Neem tans foutverslag …"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Deel foutverslag?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Deel tans foutverslag …"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 8ec7cd0..b049be7 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ሁሉንም አውታረ መረቦችን ለማየት መታ ያድርጉ"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"አገናኝ"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"ሁሉም አውታረ መረቦች"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"በ<xliff:g id="NAME">%s</xliff:g> ከተጠቆመው Wi-Fi ጋር ተገናኝቷል"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"<xliff:g id="NAME">%s</xliff:g> አውታረ መረቦችን ለእርስዎ እንዲጠቁሙ ይፈልጋሉ?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"አዎ"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"አይ"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi በራስ-ሰር ይበራል"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi በይነመረብ መዳረሻ የለውም"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ለአማራጮች መታ ያድርጉ"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"በእርስዎ ሆትስፖት ቅንብሮች ላይ ለውጦች"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"የእርስዎ ሆትስፖት ባንድ ተለውጧል።"</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"ይህ መሣሪያ የእርስዎን ምርጫ ለ5GHz ብቻ አይደግፍም። በምትኩ፣ ይህ መሣሪያ ሲገኝ 5GHz ባንድ ይጠቀማል።"</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB አድስ ተያይዟል"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"የዩኤስቢ ማረሚያን ለማጥፋት መታ ያድርጉ"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB ማረሚያ ላለማንቃት ምረጥ።"</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"የሳንካ ሪፖርትን በመውሰድ ላይ…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"የሳንካ ሪፖርት ይጋራ?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"የሳንካ ሪፖርትን በማጋራት ላይ…"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 8d7b801..815cec2 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -1333,8 +1333,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"انقر للاطلاع على جميع الشبكات"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"اتصال"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"جميع الشبكات"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"‏تم الاتصال بشبكة Wi‑Fi التي اقترحها <xliff:g id="NAME">%s</xliff:g>."</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"هل تريد السماح لـ <xliff:g id="NAME">%s</xliff:g> باقتراح شبكات لك؟"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"نعم"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"لا"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"‏سيتم تشغيل شبكة Wi-Fi تلقائيًا."</string>
@@ -1348,6 +1350,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"‏شبكة Wi-Fi غير متصلة بالإنترنت"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"انقر للحصول على الخيارات."</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"التغييرات التي طرأت على إعدادات نقطة الاتصال"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"تمّ تغيير نطاق نقطة الاتصال الخاصة بك."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"لا يتوافق هذا الجهاز مع إعدادك المفضّل الخاص باستخدام النطاق 5 غيغاهرتز فقط. وسيستخدم الجهاز بدلاً من ذلك النطاق 5 غيغاهرتز عندما يكون متاحًا."</string>
@@ -1432,6 +1436,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"‏تم توصيل تصحيح أخطاء USB"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"‏انقر لإيقاف تصحيح أخطاء USB."</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"‏اختيار إيقاف تصحيح أخطاء USB."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"جارٍ الحصول على تقرير الخطأ…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"هل تريد مشاركة تقرير الخطأ؟"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"جارٍ مشاركة تقرير الخطأ…"</string>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index 74a4584..c69706c 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"সকলো নেটৱৰ্ক চাবলৈ টিপক"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"সংযোগ কৰক"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"সকলো নেটৱৰ্ক"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"<xliff:g id="NAME">%s</xliff:g>এ প্ৰস্তাৱ দিয়া ৱাই-ফাই নেটৱৰ্কৰ লগত সংযোগ কৰা হ’ল"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"আপুনি <xliff:g id="NAME">%s</xliff:g>ক আপোনাৰ বাবে নেটৱৰ্কৰ প্ৰস্তাৱ দিয়াৰ অনুমতি দিব বিচাৰেনে?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"হয়"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"নহয়"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"ৱাই-ফাই স্বয়ংক্ৰিয়ভাৱে অন হ\'ব"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"ৱাই-ফাইত ইণ্টাৰনেট নাই"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"অধিক বিকল্পৰ বাবে টিপক"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"আপোনাৰ হটস্পট ছেটিংসমূহত কৰা সালসলনি"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"আপোনাৰ হটস্পটৰ বেণ্ড সলনি কৰা হ’ল।"</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"আপোনাৰ কেৱল ৫গিগাহাৰ্টজৰ প্ৰতি অগ্ৰাধিকাৰ এই ডিভাচইচটোৱে সমৰ্থন নকৰে। ইয়াৰ পৰিৱৰ্তে, ডিভাচইচটোৱে যেতিয়া ৫গিগাহাৰ্টজ বেণ্ড উপলব্ধ হ’ব তেতিয়া সেইয়া ব্যৱহাৰ কৰিব।"</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"ইউএছবি ডিবাগিং সংযোগ কৰা হ’ল"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"ইউএছবি ডিবাগিং বন্ধ কৰিবলৈ টিপক"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"ইউএছবি ডিবাগিং অক্ষম কৰিবলৈ বাছনি কৰক।"</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"বাগ সম্পর্কীয় অভিযোগ গ্ৰহণ কৰি থকা হৈছে…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"বাগ সম্পর্কীয় অভিযোগ শ্বেয়াৰ কৰিবনে?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"বাগ সম্পর্কীয় অভিযোগ শ্বেয়াৰ কৰি থকা হৈছে…"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index c941704..ecb9b19e 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Bütün şəbəkələri görmək üçün klikləyin"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Qoşulun"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Bütün şəbəkələr"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"<xliff:g id="NAME">%s</xliff:g> tərəfindən təklif edilən Wi‑Fi  şəbəkəsinə qoşuldu"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"<xliff:g id="NAME">%s</xliff:g> tərəfindən şəbəkələrin təklif edilməsinə icazə vermək itəyirsiniz?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Bəli"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Xeyr"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi avtomatik olaraq aktiv ediləcək"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi şəbəkəsinin internetə girişi yoxdur"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Seçimlər üçün tıklayın"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Hotspot ayarlarınızda dəyişiklik"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Hotspot qrupu dəyişdi."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Bu cihaz yalnız 5GHz üçün tərcihinizi dəstəkləmir. Əvəzinə əlçatan olduqda bu cihaz 5GHz qrupundan istifadə edəcək."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB sazlama qoşuludur"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"USB sazlamanı deaktiv etmək üçün klikləyin"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USb debaqı deaktivasiya etməyi seçin."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Baq hesabatı verilir..."</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Baq hesabatı paylaşılsın?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Baq hesabatı paylaşılır..."</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 7de4e9e..571b74d 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -1267,8 +1267,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Dodirnite da biste videli sve mreže"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Poveži"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Sve mreže"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Povezani ste sa Wi‑Fi mrežom koju predlaže <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Želite li da dozvolite da vam <xliff:g id="NAME">%s</xliff:g> predlaže mreže?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Da"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Ne"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi će se automatski uključiti"</string>
@@ -1282,6 +1284,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi nema pristup internetu"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Dodirnite za opcije"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Promene podešavanja za hotspot"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Opseg hotspota je promenjen."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Ovaj uređaj ne podržava podešavanje samo za 5 GHz. Uređaj će koristiti opseg od 5 GHz kada bude dostupan."</string>
@@ -1366,6 +1370,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Otklanjanje grešaka sa USB-a je omogućeno"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Dodirnite da biste isključili otklanjanje grešaka sa USB-a"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Izaberite da biste onemogućili otklanjanja grešaka sa USB-a."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Izveštaj o grešci se generiše…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Želite li da podelite izveštaj o grešci?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Deli se izveštaj o grešci…"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 4f98eaa..4c40491 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -1289,8 +1289,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Дакраніцеся, каб убачыць усе сеткі"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Падключыцца"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Усе сеткі"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Падключана да сеткі Wi‑Fi, прапанаванай праграмай \"<xliff:g id="NAME">%s</xliff:g>\""</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Хочаце дазволіць праграме \"<xliff:g id="NAME">%s</xliff:g>\" прапаноўваць вам сеткі?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Так"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Не"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi уключыцца аўтаматычна"</string>
@@ -1304,6 +1306,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"У Wi-Fi няма доступу да інтэрнэту"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Дакраніцеся, каб убачыць параметры"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Змяненні ў наладах хот-спота"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Частата хот-спота змянілася."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Прылада не можа працаваць толькі на частаце 5 ГГц. Гэта частата будзе выкарыстоўвацца, калі гэта магчыма."</string>
@@ -1388,6 +1392,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Адладка па USB падключана"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Націсніце, каб адключыць адладку па USB"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Выберыце, каб адключыць адладку USB."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Стварэнне справаздачы пра памылку…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Падзяліцца справаздачай пра памылку?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Перадача справаздачы пра памылку..."</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 704dc52..a476d23 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Докоснете, за да видите всички мрежи"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Свързване"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Всички мрежи"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Установена е връзка с Wi‑Fi мрежа, предложена от <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Искате ли да разрешите на <xliff:g id="NAME">%s</xliff:g> да ви предлага мрежи?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Да"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Не"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi ще се включи автоматично"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi мрежата няма достъп до интернет"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Докоснете за опции"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Промени в настройките ви за точка за достъп"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Честотната лента на точката ви за достъп е променена."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Това устройство не поддържа предпочитанието ви за използване само на честотната лента от 5 ГХц. Вместо това то ще я ползва, когато е възможно."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Отстраняване на грешки през USB"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Докоснете, за да изключите отстраняването на грешки през USB"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Изберете, за да деактивирате отстраняването на грешки през USB."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Сигналът за програмна грешка се извлича…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Да се сподели ли сигналът за програмна грешка?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Сигналът за програмна грешка се споделя…"</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index b6ab1e6..602a3c5 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"সমস্ত নেটওয়ার্ক দেখতে ট্যাপ করুন"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"সংযুক্ত করুন"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"সব নেটওয়ার্ক"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"<xliff:g id="NAME">%s</xliff:g>-এর সাজেস্ট করা ওয়াই-ফাইয়ে নেটওয়ার্ক কানেক্ট করা হয়েছে"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"আপনি <xliff:g id="NAME">%s</xliff:g>-কে নেটওয়ার্ক সাজেস্ট করতে দিতে চান?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"হ্যাঁ"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"না"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"ওয়াই-ফাই অটোমেটিক চালু হবে"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"ওয়াই-ফাই এ ইন্টারনেট অ্যাক্সেস নেই"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"বিকল্পগুলির জন্য আলতো চাপুন"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"আপনার হটস্পট সেটিংসে পরিবর্তনগুলি"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"আপনার হটস্পট ব্যান্ড পরিবর্তন করা হয়েছে।"</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"এই ডিভাইসটি শুধুমাত্র 5GHz এর জন্য আপনার পছন্দ সমর্থন করে না। পরিবর্তে, এই ডিভাইসটি 5GHz ব্যান্ড ব্যবহার করবে।"</string>
@@ -1345,6 +1349,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB ডিবাগিং সংযুক্ত হয়েছে"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"ইউএসবি ডিবাগিং বন্ধ করতে ট্যাপ করুন"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB ডিবাগিং অক্ষম করতে বেছে নিন।"</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"ত্রুটির প্রতিবেদন নেওয়া হচ্ছে..."</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"ত্রুটির প্রতিবেদন শেয়ার করবেন?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"ত্রুটির প্রতিবেদন শেয়ার করা হচ্ছে..."</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index ab0df69..1a4bd0c 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -1269,8 +1269,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Dodirnite da vidite sve mreže"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Povežite se"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Sve mreže"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Povezani ste na WiFi mrežu koju je predložila aplikacija <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Želite li dozvoliti aplikaciji <xliff:g id="NAME">%s</xliff:g> da vam predlaže mreže?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Da"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Ne"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi veza će se automatski uključiti"</string>
@@ -1284,6 +1286,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"WiFi nema pristup internetu"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Dodirnite za opcije"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Promjene postavki vaše pristupne tačke"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Opseg vaše pristupne tačke je promijenjen."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Ovaj uređaj ne podržava vašu postavku za mreže od isključivo 5GHz. Uređaj će koristiti opseg of 5GHz kada je dostupan."</string>
@@ -1368,6 +1372,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Otklanjanje grešaka putem uređaja spojenog na USB je uspostavljeno"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Dodirnite da isključite otklanjanje grešaka putem USB-a"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Odaberite da onemogućite ispravljanje grešaka koristeći USB"</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Prijem izvještaja o grešci..."</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Podijeliti izvještaj o grešci?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Dijeljenje izvještaja o grešci..."</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index e53f85e..76fc7fe 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toca per veure totes les xarxes"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Connecta"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Totes les xarxes"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"T\'has connectat a la xarxa Wi‑Fi proposada per l\'aplicació <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Vols permetre que <xliff:g id="NAME">%s</xliff:g> et proposi xarxes?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Sí"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"No"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"La Wi-Fi s\'activarà automàticament"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"La Wi-Fi no té accés a Internet"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Toca per veure les opcions"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Canvis en la configuració del punt d\'accés Wi-Fi"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Ha canviat la teva banda del punt d\'accés Wi-Fi."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Aquest dispositiu no admet utilitzar exclusivament una banda de 5 GHz. El dispositiu utilitzarà una banda de 5 GHz quan estigui disponible."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Depuració per USB activada"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Toca per desactivar la depuració per USB"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Selecciona per desactivar la depuració per USB"</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"S\'està creant l\'informe d\'errors…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Vols compartir l\'informe d\'errors?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"S\'està compartint l\'informe d\'errors…"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 55719e5..2283778 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -1289,8 +1289,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Klepnutím zobrazíte všechny sítě"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Připojit"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Všechny sítě"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Připojeno k síti Wi-Fi navrhované aplikací <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Chcete aplikaci <xliff:g id="NAME">%s</xliff:g> povolit, aby vám navrhovala sítě?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Ano"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Ne"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi se zapne automaticky"</string>
@@ -1304,6 +1306,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi nemá přístup k internetu"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Klepnutím zobrazíte možnosti"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Změny nastavení hotspotu"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Pásmo hotspotu se změnilo."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Toto zařízení nepodporuje vaše nastavení jen 5GHz pásma. Zařízení použije pásmo 5 GHz, jen když bude dostupné."</string>
@@ -1388,6 +1392,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Ladění přes USB připojeno"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Klepnutím vypnete ladění přes USB"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Vyberte, chcete-li zakázat ladění přes USB."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Vytváření zprávy o chybě…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Sdílet zprávu o chybě?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Sdílení zprávy o chybě…"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index a5ddc78..b64418c 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tryk for at se alle netværk"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Opret forbindelse"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Alle netværk"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Forbundet til Wi‑Fi-netværket, som <xliff:g id="NAME">%s</xliff:g> har foreslået"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Vil du tillade, at <xliff:g id="NAME">%s</xliff:g> foreslår netværk?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Ja"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Nej"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi aktiveres automatisk"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi-netværket har ikke internetadgang"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tryk for at se valgmuligheder"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Ændringer af dine indstillinger for hotspot"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Dit hotspotbånd er ændret."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Denne enhed understøtter ikke din præference om kun 5 GHz. Denne enhed vil i stedet bruge 5 GHz-båndet, når det er muligt."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB-fejlretning er tilsluttet"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Tryk for at deaktivere USB-fejlretning"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Vælg for at deaktivere USB-fejlretning."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Opretter fejlrapport…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Vil du dele fejlrapporten?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Deler fejlrapport…"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 205b373..5caa12a 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tippen, um alle Netzwerke zu sehen"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Verbinden"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Alle Netzwerke"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Mit einem von <xliff:g id="NAME">%s</xliff:g> vorgeschlagenen WLAN-Netzwerk verbunden"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Möchten Sie, dass <xliff:g id="NAME">%s</xliff:g> Ihnen Netzwerke vorschlägt?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Ja"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Nein"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"WLAN wird automatisch aktiviert"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"WLAN hat keinen Internetzugriff"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Für Optionen tippen"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Änderungen an deinen Hotspot-Einstellungen"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Dein Hotspot-Band hat sich geändert."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Dieses Gerät unterstützt die ausschließliche Nutzung von 5 GHz nicht. Es greift aber immer auf das 5-GHz-Band zurück, wenn dieses verfügbar ist."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB-Debugging aktiviert"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Zum Deaktivieren von USB-Debugging tippen"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB-Debugging deaktivieren: auswählen"</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Fehlerbericht wird abgerufen…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Fehlerbericht teilen?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Fehlerbericht wird geteilt…"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index e4e7a76..320bf27 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Πατήστε για να δείτε όλα τα δίκτυα"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Σύνδεση"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Όλα τα δίκτυα"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Σύνδεση στο δίκτυο Wi‑Fi που προτάθηκε από την εφαρμογή <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Θέλετε να επιτρέψετε στην εφαρμογή <xliff:g id="NAME">%s</xliff:g> να σας προτείνει δίκτυα;"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Ναι"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Όχι"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Το Wi‑Fi θα ενεργοποιηθεί αυτόματα"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Το Wi-Fi δεν έχει πρόσβαση στο διαδίκτυο"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Πατήστε για να δείτε τις επιλογές"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Αλλαγές στις ρυθμίσεις σημείου πρόσβασης Wi-Fi"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Το εύρος σημείου πρόσβασης Wi-Fi άλλαξε."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Αυτή η συσκευή δεν υποστηρίζει την προτίμησή σας για τη ζώνη 5 GHz μόνο. Αντ\' αυτού, αυτή η συσκευή θα χρησιμοποιεί τη ζώνη 5 GHz όταν είναι διαθέσιμη."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Συνδέθηκε ο εντοπισμός σφαλμάτων USB"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Πατήστε για να απενεργοποιήσετε τον εντοπισμό και τη διόρθωση σφαλμάτων USB"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Επιλογή για απενεργοποίηση του εντοπισμού σφαλμάτων USB."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Λήψη αναφοράς σφάλματος…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Κοινή χρήση αναφοράς σφάλματος;"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Κοινή χρήση αναφοράς σφάλματος…"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 7dd3da2..4d2155b 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -661,7 +661,7 @@
     <string name="policydesc_resetPassword" msgid="1278323891710619128">"Change the screen lock."</string>
     <string name="policylab_forceLock" msgid="2274085384704248431">"Lock the screen"</string>
     <string name="policydesc_forceLock" msgid="1141797588403827138">"Control how and when the screen locks."</string>
-    <string name="policylab_wipeData" msgid="3910545446758639713">"Erase all data"</string>
+    <string name="policylab_wipeData" msgid="3910545446758639713">"Delete all data"</string>
     <string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"Erase the tablet\'s data without warning by performing a factory data reset."</string>
     <string name="policydesc_wipeData" product="tv" msgid="5816221315214527028">"Erase the TV\'s data without warning by performing a factory data reset."</string>
     <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"Erase the phone\'s data without warning by performing a factory data reset."</string>
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tap to see all networks"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Connect"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"All networks"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Connected to Wi‑Fi network proposed by <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Do you want to let <xliff:g id="NAME">%s</xliff:g> propose networks for you?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Yes"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"No"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi will turn on automatically"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi has no Internet access"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tap for options"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Changes to your hotspot settings"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Your hotspot band has changed."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"This device doesn’t support your preference for 5 GHz only. Instead, this device will use the 5 GHz band when available."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Tap to turn off USB debugging"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Select to disable USB debugging."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Taking bug report…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Share bug report?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Sharing bug report…"</string>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index 21f6f1f..ab1fcaa 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -661,7 +661,7 @@
     <string name="policydesc_resetPassword" msgid="1278323891710619128">"Change the screen lock."</string>
     <string name="policylab_forceLock" msgid="2274085384704248431">"Lock the screen"</string>
     <string name="policydesc_forceLock" msgid="1141797588403827138">"Control how and when the screen locks."</string>
-    <string name="policylab_wipeData" msgid="3910545446758639713">"Erase all data"</string>
+    <string name="policylab_wipeData" msgid="3910545446758639713">"Delete all data"</string>
     <string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"Erase the tablet\'s data without warning by performing a factory data reset."</string>
     <string name="policydesc_wipeData" product="tv" msgid="5816221315214527028">"Erase the TV\'s data without warning by performing a factory data reset."</string>
     <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"Erase the phone\'s data without warning by performing a factory data reset."</string>
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tap to see all networks"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Connect"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"All networks"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Connected to Wi‑Fi network proposed by <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Do you want to let <xliff:g id="NAME">%s</xliff:g> propose networks for you?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Yes"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"No"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi will turn on automatically"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi has no Internet access"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tap for options"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Changes to your hotspot settings"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Your hotspot band has changed."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"This device doesn’t support your preference for 5 GHz only. Instead, this device will use the 5 GHz band when available."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Tap to turn off USB debugging"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Select to disable USB debugging."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Taking bug report…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Share bug report?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Sharing bug report…"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 7dd3da2..4d2155b 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -661,7 +661,7 @@
     <string name="policydesc_resetPassword" msgid="1278323891710619128">"Change the screen lock."</string>
     <string name="policylab_forceLock" msgid="2274085384704248431">"Lock the screen"</string>
     <string name="policydesc_forceLock" msgid="1141797588403827138">"Control how and when the screen locks."</string>
-    <string name="policylab_wipeData" msgid="3910545446758639713">"Erase all data"</string>
+    <string name="policylab_wipeData" msgid="3910545446758639713">"Delete all data"</string>
     <string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"Erase the tablet\'s data without warning by performing a factory data reset."</string>
     <string name="policydesc_wipeData" product="tv" msgid="5816221315214527028">"Erase the TV\'s data without warning by performing a factory data reset."</string>
     <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"Erase the phone\'s data without warning by performing a factory data reset."</string>
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tap to see all networks"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Connect"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"All networks"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Connected to Wi‑Fi network proposed by <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Do you want to let <xliff:g id="NAME">%s</xliff:g> propose networks for you?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Yes"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"No"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi will turn on automatically"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi has no Internet access"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tap for options"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Changes to your hotspot settings"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Your hotspot band has changed."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"This device doesn’t support your preference for 5 GHz only. Instead, this device will use the 5 GHz band when available."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Tap to turn off USB debugging"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Select to disable USB debugging."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Taking bug report…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Share bug report?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Sharing bug report…"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 7dd3da2..4d2155b 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -661,7 +661,7 @@
     <string name="policydesc_resetPassword" msgid="1278323891710619128">"Change the screen lock."</string>
     <string name="policylab_forceLock" msgid="2274085384704248431">"Lock the screen"</string>
     <string name="policydesc_forceLock" msgid="1141797588403827138">"Control how and when the screen locks."</string>
-    <string name="policylab_wipeData" msgid="3910545446758639713">"Erase all data"</string>
+    <string name="policylab_wipeData" msgid="3910545446758639713">"Delete all data"</string>
     <string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"Erase the tablet\'s data without warning by performing a factory data reset."</string>
     <string name="policydesc_wipeData" product="tv" msgid="5816221315214527028">"Erase the TV\'s data without warning by performing a factory data reset."</string>
     <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"Erase the phone\'s data without warning by performing a factory data reset."</string>
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tap to see all networks"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Connect"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"All networks"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Connected to Wi‑Fi network proposed by <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Do you want to let <xliff:g id="NAME">%s</xliff:g> propose networks for you?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Yes"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"No"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi will turn on automatically"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi has no Internet access"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tap for options"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Changes to your hotspot settings"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Your hotspot band has changed."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"This device doesn’t support your preference for 5 GHz only. Instead, this device will use the 5 GHz band when available."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Tap to turn off USB debugging"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Select to disable USB debugging."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Taking bug report…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Share bug report?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Sharing bug report…"</string>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index b4f1156d0..bcc4c6c 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -1245,8 +1245,8 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‏‏‎‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‎‏‏‎‎‏‏‎‎‏‏‎‎‏‏‎‏‎‏‎‏‎Tap to see all networks‎‏‎‎‏‎"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‎‎‏‎‎‏‏‏‏‏‎‎‎‏‎‏‏‎‏‏‎‎‎‏‏‏‏‏‎‎‎‏‏‏‏‎‏‎‎‏‏‏‏‎‏‏‎‎‎‎‏‎‏‎‎‎Connect‎‏‎‎‏‎"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‎‏‏‏‏‏‏‏‎‎‏‏‎‏‎‎‏‏‎‏‏‎‎‎‏‏‏‎‏‎‎‎‎‎‎‎‏‏‏‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎All networks‎‏‎‎‏‎"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‎‎‏‎‏‎‎‎‏‏‏‎‎‏‎‎‎‎‏‎‎‏‎‏‏‏‏‏‏‎‎‏‏‎‎‎‏‏‎‏‎‏‏‎‏‏‎‎‎‏‏‏‏‎‏‎‎Connected to Wi‑Fi network proposed by ‎‏‎‎‏‏‎<xliff:g id="NAME">%s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‏‎‎‎‎‏‏‎‏‏‎‏‏‏‎‎‎‎‏‏‎‏‏‎‏‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‏‎‎‏‎‏‎‏‎‏‏‏‏‎‏‎Do you want to let ‎‏‎‎‏‏‎<xliff:g id="NAME">%s</xliff:g>‎‏‎‎‏‏‏‎ propose networks for you?‎‏‎‎‏‎"</string>
+    <string name="wifi_suggestion_title" msgid="8951405130379148709">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‎‏‏‏‎‎‎‏‏‏‏‎‎‎‏‎‏‎‎‎‎‏‏‏‎‎‏‏‎‏‏‎‏‏‏‎‏‏‏‏‎‏‏‎‏‎‎‏‎‏‎A Wi‑Fi network proposed by ‎‏‎‎‏‏‎<xliff:g id="NAME">%s</xliff:g>‎‏‎‎‏‏‏‎ is available‎‏‎‎‏‎"</string>
+    <string name="wifi_suggestion_content" msgid="2658317015552324848">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‎‏‏‏‏‎‏‏‏‎‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‏‎‏‎‎‏‏‏‏‎‎‎‎‎Do you want to connect to networks proposed by ‎‏‎‎‏‏‎<xliff:g id="NAME">%s</xliff:g>‎‏‎‎‏‏‏‎?‎‏‎‎‏‎"</string>
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‏‏‎‏‎‏‎‏‎‏‎‎‏‎‏‎‏‎‎‏‏‎‎‏‏‎‏‏‏‏‎‏‎‎‏‏‎‏‏‎‎‏‎‏‏‎‏‎‏‎‎‏‎‏‎Yes‎‏‎‎‏‎"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‏‏‎‏‏‏‎‏‎‎‎‎‏‎‏‏‏‏‏‎‎‏‏‏‎‎‏‏‏‏‏‎‎‎‎‎‏‏‏‏‎‎‎‎‎‏‎‏‏‏‏‎‎‏‎No‎‏‎‎‏‎"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‎‎‏‎‏‏‎‎‏‏‎‎‎‎‏‏‎‏‏‎‏‏‏‎‎‏‏‏‎‎‎‎‏‏‎‏‎‎‎‏‎‏‎‎‎‏‎‎‎‏‏‏‎‏‎‎‎Wi‑Fi will turn on automatically‎‏‎‎‏‎"</string>
@@ -1260,6 +1260,7 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‎‏‏‎‎‎‏‏‎‏‎‏‎‏‎‏‎‎‎‏‏‏‎‎‎‏‏‏‎‏‏‏‏‏‏‎‎‎‎‎‎‎‏‎‏‎‏‏‎‏‎‎Wi-Fi has no internet access‎‏‎‎‏‎"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‎‏‏‎‎‏‏‎‏‏‏‎‏‏‎‏‏‏‏‏‎‎‏‏‎‏‏‏‏‏‏‎‎‏‎‏‏‎‎‎‏‎‎‎‏‏‎‏‎‏‏‎‏‎Tap for options‎‏‎‎‏‎"</string>
+    <string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‎‎‎‎‎‎‏‏‎‏‏‎‏‎‏‎‎‏‎‏‎‏‏‎‏‎‎‎‎‎‎‏‏‎‏‎‏‎‎‎‎‎‎‎‏‎‎‏‎‏‎‏‎Connected‎‏‎‎‏‎"</string>
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‎‎‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‎‎‎‎‏‎‎‎‎‏‎‎‎‏‎‏‏‎‏‏‎‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‎Changes to your hotspot settings‎‏‎‎‏‎"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‏‏‎‏‎‎‎‎‎‎‎‏‎‏‎‏‏‏‏‎‏‎‏‏‏‎‏‏‏‎‎‎‏‏‏‏‎‏‎‎‏‎‏‎‎‎‎‏‏‎‏‏‎Your hotspot band has changed.‎‏‎‎‏‎"</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‏‏‎‎‏‏‎‎‏‎‏‎‎‎‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‎‎‎‏‏‎‎‎‎‎‎‏‏‏‎‎‏‎‎‎‏‎This device doesn’t support your preference for 5GHz only. Instead, this device will use the 5GHz band when available.‎‏‎‎‏‎"</string>
@@ -1344,6 +1345,10 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‏‏‎‎‎‏‎‎‏‎‏‏‏‏‎‏‎‎‏‎‎‏‏‎‎‎‎‏‏‏‎‏‏‏‏‎‏‏‎‏‎‏‎‎‎‎‏‎‎‎‏‏‏‏‎‎USB debugging connected‎‏‎‎‏‎"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‎‎‎‎‎‏‏‏‏‏‏‎‎‏‎‎‎‏‎‎‎‎‏‏‎‎‎‎‏‏‎‏‏‎‏‎‎‎‎Tap to turn off USB debugging‎‏‎‎‏‎"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‎‏‏‎‎‏‎‎‎‏‎‏‎‎‎‎‏‎‏‎‎‎‎‏‎‎‎‏‏‎‎‎‏‏‏‎‎‏‎‎‎‎‎‏‎‏‎‏‏‏‏‎‎‎Select to disable USB debugging.‎‏‎‎‏‎"</string>
+    <string name="usb_contaminant_detected_title" msgid="7136400633704058349">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‎‏‎‎‏‏‎‎‏‎‏‏‎‏‎‎‏‎‎‎‎‏‏‏‎‏‎‏‎‏‏‎‎‏‏‎‏‏‎‎‎‏‏‎‏‏‏‏‎‏‏‎‏‎Liquid or debris in USB port‎‏‎‎‏‎"</string>
+    <string name="usb_contaminant_detected_message" msgid="832337061059487250">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‏‎‎‎‏‏‎‏‎‎‎‎‏‏‏‎‎‎‏‎‎‏‎‏‏‎‏‎‏‎‎‏‏‏‎‏‎‏‏‏‏‏‏‎‎‏‏‎‎‎‎‏‎‎‏‎‎USB port is automatically disabled. Tap to learn more.‎‏‎‎‏‎"</string>
+    <string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‏‎‎‎‏‏‏‏‏‏‏‎‎‎‏‏‎‏‏‏‏‏‏‎‎‏‏‎‏‏‎‏‎‎‎‏‎‎‎‎‏‏‎‏‏‏‏‏‎‎‏‏‎‎Safe to use USB port‎‏‎‎‏‎"</string>
+    <string name="usb_contaminant_not_detected_message" msgid="2415791798244545292">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‏‎‎‎‎‏‏‎‏‎‎‏‏‏‎‏‏‏‎‏‎‏‏‏‎‏‎‏‎‎‎‏‏‎‏‎‏‎‏‏‎‎‎‏‎‎‏‏‎‎‎‎‏‏‎‎‎Phone no longer detects liquid or debris.‎‏‎‎‏‎"</string>
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‎‎‏‎‎‏‎‎‎‎‏‏‏‎‎‏‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‎‏‏‎‏‎‎‎‎‎‏‎‏‎‎‎‏‏‎‎‎‏‏‎‎Taking bug report…‎‏‎‎‏‎"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‏‏‎‏‎‏‏‎‏‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‎‏‏‏‎‎‎‏‏‏‎‎‏‎‎‎‎‎‎‏‏‎‎‎‎‏‎Share bug report?‎‏‎‎‏‎"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‎‏‎‏‎‏‎‏‏‏‎‏‏‎‏‏‎‏‏‎‏‏‎‎‎‎‎‎‎‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‎‎‏‏‎‏‏‎‎‎Sharing bug report…‎‏‎‎‏‎"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index dc0a132..9290cf7 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Presiona para ver todas las redes"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectar"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Todas las redes"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Se estableció conexión con la red Wi-Fi sugerida por <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"¿Quieres permitir que <xliff:g id="NAME">%s</xliff:g> te sugiera redes?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Sí"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"No"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Se activará la conexión Wi-Fi automáticamente"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"La red Wi-Fi no tiene acceso a Internet"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Presiona para ver opciones"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Cambios en la configuración de tu hotspot"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Cambió la banda de tu hotspot."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Si bien este dispositivo no admite la opción para conectarse exclusivamente a bandas de 5 GHz, las usará cuando estén disponibles."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Depuración por USB conectada"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Presiona para desactivar la depuración USB"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Seleccionar para desactivar la depuración por USB"</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Realizando un informe de errores…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"¿Compartir informe de errores?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Compartiendo informe de errores…"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index c819bb6..851cd32 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -247,7 +247,7 @@
     <string name="global_action_settings" msgid="1756531602592545966">"Ajustes"</string>
     <string name="global_action_assist" msgid="3892832961594295030">"Asistencia"</string>
     <string name="global_action_voice_assist" msgid="7751191495200504480">"Asistente voz"</string>
-    <string name="global_action_lockdown" msgid="1099326950891078929">"Bloquear"</string>
+    <string name="global_action_lockdown" msgid="1099326950891078929">"Bloqueo seguro"</string>
     <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"&gt; 999"</string>
     <string name="notification_hidden_text" msgid="6351207030447943784">"Notificación nueva"</string>
     <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Teclado virtual"</string>
@@ -657,8 +657,8 @@
     <string name="policydesc_watchLogin_secondaryUser" product="tablet" msgid="4280246270601044505">"Controla el número de contraseñas incorrectas introducidas para desbloquear la pantalla y bloquea el tablet o borra todos los datos del usuario si se introducen demasiadas contraseñas incorrectas."</string>
     <string name="policydesc_watchLogin_secondaryUser" product="TV" msgid="3484832653564483250">"Controla el número de contraseñas incorrectas introducidas para desbloquear la pantalla y bloquea la TV o borra todos los datos del usuario si se introducen demasiadas contraseñas incorrectas."</string>
     <string name="policydesc_watchLogin_secondaryUser" product="default" msgid="2185480427217127147">"Controla el número de contraseñas incorrectas introducidas para desbloquear la pantalla y bloquea el teléfono o borra todos los datos del usuario si se introducen demasiadas contraseñas incorrectas."</string>
-    <string name="policylab_resetPassword" msgid="4934707632423915395">"Cambia el bloqueo de pantalla"</string>
-    <string name="policydesc_resetPassword" msgid="1278323891710619128">"Cambia el bloqueo de pantalla"</string>
+    <string name="policylab_resetPassword" msgid="4934707632423915395">"Cambiar el bloqueo de pantalla"</string>
+    <string name="policydesc_resetPassword" msgid="1278323891710619128">"Cambiar el bloqueo de pantalla"</string>
     <string name="policylab_forceLock" msgid="2274085384704248431">"Bloquear la pantalla"</string>
     <string name="policydesc_forceLock" msgid="1141797588403827138">"Controla cómo y cuándo se bloquea la pantalla"</string>
     <string name="policylab_wipeData" msgid="3910545446758639713">"Borrar todos los datos"</string>
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toca para ver todas las redes"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectarse"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Todas las redes"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Conexión establecida con la red Wi‑Fi recomendada por <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"¿Quieres que <xliff:g id="NAME">%s</xliff:g> te recomiende redes?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Sí"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"No"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"La conexión Wi‑Fi se activará automáticamente"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"La red Wi-Fi no tiene acceso a Internet"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Toca para ver opciones"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Cambios en los ajustes de tu punto de acceso"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"La banda de tu punto de acceso ha cambiado."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Este dispositivo no admite la opción de conectarse exclusivamente a bandas de 5 GHz, pero las usará cuando estén disponibles."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Depuración USB habilitada"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Toca para desactivar la depuración USB"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Seleccionar para inhabilitar la depuración USB"</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Creando informe de errores…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"¿Compartir informe de errores?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Compartiendo informe de errores…"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index f1c4106..c40ee10 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Puudutage kõikide võrkude nägemiseks"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Ühenda"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Kõik võrgud"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Ühendatud rakenduse <xliff:g id="NAME">%s</xliff:g> soovitatud WiFi-võrguga"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Kas soovite lubada rakendusel <xliff:g id="NAME">%s</xliff:g> teile võrke soovitada?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Jah"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Ei"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"WiFi lülitub sisse automaatselt"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"WiFi-võrgul pole juurdepääsu Internetile"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Puudutage valikute nägemiseks"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Muudatused teie leviala seadetes"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Teie leviala riba on muutunud."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"See seade ei toeta teie eelistatud ainult 5 GHz riba. Seade kasutab 5 GHz riba ainult siis, kui see on saadaval."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB-silumine ühendatud"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Puudutage USB silumise väljalülitamiseks"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Valige USB silumise keelamiseks"</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Veaaruande võtmine …"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Kas jagada veaaruannet?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Veaaruande jagamine …"</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index c361164..9c10e94 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -624,8 +624,8 @@
     <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Aplikazioen sare-erabilera kalkulatzeko modua aldatzeko baimena ematen die aplikazioei. Aplikazio normalek ez lukete beharko."</string>
     <string name="permlab_accessNotifications" msgid="7673416487873432268">"atzitu jakinarazpenak"</string>
     <string name="permdesc_accessNotifications" msgid="458457742683431387">"Jakinarazpenak berreskuratu, aztertu eta garbitzeko aukera ematen die aplikazioei, beste aplikazioek argitaratutako jakinarazpenak barne."</string>
-    <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"lotu jakinarazpenak hautemateko zerbitzu batera"</string>
-    <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Jakinarazpenak hautemateko zerbitzu baten goi-mailako interfazera lotzeko aukera ematen dio titularrari. Aplikazio normalek ez dute baimen hau behar."</string>
+    <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"lotu jakinarazpen-hautemaile bati"</string>
+    <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Jakinarazpen-hautemaile baten goi-mailako interfazera lotzeko aukera ematen dio titularrari. Aplikazio normalek ez dute baimen hau behar."</string>
     <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"lotu baldintza-hornitzaileen zerbitzuei"</string>
     <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Baldintza-hornitzaileen zerbitzuen goi-mailako interfazeari lotzea baimentzen die titularrei. Aplikazio normalek ez lukete beharko."</string>
     <string name="permlab_bindDreamService" msgid="4153646965978563462">"lotu dream zerbitzuei"</string>
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Sakatu hau sare guztiak ikusteko"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Konektatu"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Sare guztiak"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"<xliff:g id="NAME">%s</xliff:g> aplikazioak iradokitako Wi‑Fi sarera konektatuta"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"<xliff:g id="NAME">%s</xliff:g> aplikazioak sareak iradoki diezazkizun nahi duzu?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Bai"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Ez"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi konexioa automatikoki aktibatuko da"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Ezin da konektatu Internetera Wi-Fi bidez"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Sakatu aukerak ikusteko"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Aldaketak egin dira sare publikoaren ezarpenetan"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Aldatu da sare publikoaren banda."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Gailuak ez du onartzen 5 GHz-ko banda soilik erabiltzeko hobespena. Horren ordez, erabilgarri dagoen bakoitzean erabiliko da 5 GHz-ko banda."</string>
@@ -1345,6 +1349,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB arazketa konektatuta"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Sakatu USB arazketa desaktibatzeko"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Hautatu USB arazketa desgaitzeko."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Akatsen txostena sortzen…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Akatsen txostena partekatu nahi duzu?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Akatsen txostena partekatzen…"</string>
@@ -1438,7 +1450,7 @@
     <string name="accessibility_binding_label" msgid="4148120742096474641">"Erabilerraztasuna"</string>
     <string name="wallpaper_binding_label" msgid="1240087844304687662">"Horma-papera"</string>
     <string name="chooser_wallpaper" msgid="7873476199295190279">"Aldatu horma-papera"</string>
-    <string name="notification_listener_binding_label" msgid="2014162835481906429">"Jakinarazpenak hautemateko zerbitzua"</string>
+    <string name="notification_listener_binding_label" msgid="2014162835481906429">"Jakinarazpen-hautemailea"</string>
     <string name="vr_listener_binding_label" msgid="4316591939343607306">"Errealitate birtualeko hautemailea"</string>
     <string name="condition_provider_service_binding_label" msgid="1321343352906524564">"Baldintza-hornitzailea"</string>
     <string name="notification_ranker_binding_label" msgid="774540592299064747">"Jakinarazpenen sailkapen-zerbitzua"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 5bf81fa..25ee1df 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"برای دیدن همه شبکه‌ها ضربه بزنید"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"اتصال"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"همه شبکه‌ها"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"‏متصل به شبکه Wi‑Fi پیشنهادی <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"می‌خواهید به <xliff:g id="NAME">%s</xliff:g> اجازه دهید شبکه‌هایی را که به شما پیشنهاد کند؟"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"بله"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"خیر"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"‏Wi‑Fi به‌طور خودکار روشن خواهد شد"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"‏Wi-Fi به اینترنت دسترسی ندارد"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"برای گزینه‌ها ضربه بزنید"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"تغییرات در تنظیمات نقطه اتصال"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"نوار نقطه اتصال شما تغییر کرد."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"این دستگاه از اولویت فقط ۵ گیگاهرتز شما پشتیبانی نمی‌کند. هرزمان نوار ۵ گیگاهرتزی دردسترس باشد این دستگاه از آن استفاده خواهد کرد."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"‏اشکال‌زدایی USB متصل شد"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"‏برای خاموش کردن اشکال‌زدایی USB ضربه بزنید"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"‏انتخاب کنید تا رفع عیب USB غیرفعال شود."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"درحال گرفتن گزارش اشکال…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"گزارش اشکال به اشتراک گذاشته شود؟"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"درحال اشتراک‌گذاری گزارش اشکال…‏"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 9e2fde5..fda842a 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Napauta, niin näet kaikki verkot."</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Yhdistä"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Kaikki verkot"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Yhdistetty ehdotettuun (<xliff:g id="NAME">%s</xliff:g>) Wi-Fi-verkkoon"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Haluatko, että <xliff:g id="NAME">%s</xliff:g> voi ehdottaa sinulle verkkoja?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Kyllä"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Ei"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi käynnistyy automaattisesti"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi ei ole yhteydessä internetiin"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Näytä vaihtoehdot napauttamalla."</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Hotspot-asetustesi muutokset"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Hotspot-taajuutesi on muuttunut."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Tämä laite ei tue asetustasi (vain 5 GHz). Sen sijaan laite käyttää 5 GHz:n taajuutta sen ollessa käytettävissä."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB-vianetsintä yhdistetty"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Poista USB-virheenkorjaus käytöstä napauttamalla."</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Poista USB-vianetsintä käytöstä valitsemalla tämä."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Luodaan virheraporttia…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Jaetaanko virheraportti?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Jaetaan virheraporttia…"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 3b841d5..d2a2e5a 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Touchez pour afficher tous les réseaux"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Connexion"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Tous les réseaux"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Connecté au réseau Wi-Fi proposé par <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Voulez-vous autoriser <xliff:g id="NAME">%s</xliff:g> à vous suggérer des réseaux?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Oui"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Non"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Le Wi-Fi s\'activera automatiquement"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Le réseau Wi-Fi ne dispose d\'aucun accès à Internet"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Touchez pour afficher les options"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Modifications apportées à vos paramètres de point d\'accès"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"La bande de votre point d\'accès a changé."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Cet appareil ne prend pas en charge votre préférence pour la bande de 5 GHz seulement. Au lieu de cela, cet appareil utilisera la bande de 5 GHz lorsqu\'elle sera disponible."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Débogage USB activé"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Touchez l\'écran pour désactiver le débogage USB"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Sélectionnez cette option pour désactiver le débogage USB."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Création d\'un rapport de bogue en cours..."</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Partager le rapport de bogue?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Partage du rapport de bogue en cours..."</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 28df3bf..577a188 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Appuyer pour afficher tous les réseaux"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Se connecter"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Tous les réseaux"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Connecté au réseau Wi‑Fi proposé par <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Voulez-vous autoriser <xliff:g id="NAME">%s</xliff:g> à vous proposer des réseaux ?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Oui"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Non"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Le Wi-Fi sera activé automatiquement"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Impossible de se connecter à Internet via le réseau Wi-Fi"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Appuyez ici pour afficher des options."</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Modifications apportées à vos paramètres de point d\'accès"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Votre bande de point d\'accès a été modifiée."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Cet appareil n\'est pas compatible avec votre préférence d\'utilisation de la bande 5 GHz uniquement. Il utilisera la bande 5 GHz lorsqu\'elle sera disponible."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Débogage USB activé"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Appuyez pour désactiver le débogage USB"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Sélectionnez cette option pour désactiver le débogage USB."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Création du rapport de bug…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Partager le rapport de bug ?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Partage du rapport de bug…"</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 339f0f4f..8196de7 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toca para ver todas as redes"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectarse"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Todas as redes"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Conectácheste á rede wifi proposta pola aplicación <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Queres permitir que a aplicación <xliff:g id="NAME">%s</xliff:g> che propoña redes?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Si"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Non"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"A wifi activarase automaticamente"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"A wifi non ten acceso a Internet"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Toca para ver opcións."</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Cambios na configuración da zona wifi"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Modificouse a banda da zona wifi."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Este dispositivo non admite a opción de conectarse só a bandas de 5 GHz, pero usaraas se están dispoñibles."</string>
@@ -1345,6 +1349,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Depuración por USB conectada"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Toca para desactivar a depuración por USB"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Selecciona a opción para desactivar a depuración por USB."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Creando informe de erros…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Queres compartir o informe de erros?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Compartindo informe de erros..."</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 2124759..afba6d9 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"બધા નેટવર્ક જોવા ટૅપ કરો"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"કનેક્ટ કરો"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"બધા નેટવર્કો"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"<xliff:g id="NAME">%s</xliff:g> દ્વારા પ્રસ્તાવિત વાઇ-ફાઇ નેટવર્ક સાથે કનેક્ટ કર્યું"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"શું તમે <xliff:g id="NAME">%s</xliff:g>ને તમારા માટે નેટવર્કનો પ્રસ્તાવ આપવા દેવા માગો છો?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"હા"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"ના"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"વાઇ-ફાઇ આપમેળે ચાલુ થઈ જશે"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"વાઇ-ફાઇને કોઈ ઇન્ટરનેટ ઍક્સેસ નથી"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"વિકલ્પો માટે ટૅપ કરો"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"તમારી હૉટસ્પૉટ સેટિંગને બદલે છે"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"તમારું હૉટસ્પૉટ બેન્ડ બદલાયેલ છે."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"આ ઉપકરણ તમારી ફક્ત 5GHz માટેની પસંદગીને સમર્થન આપતું નથી. તેના બદલે, જ્યારે આ ઉપકરણ જ્યારે 5GHz બેન્ડ ઉપલબ્ધ હશે ત્યારે તેનો ઉપયોગ કરશે."</string>
@@ -1345,6 +1349,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB ડીબગિંગ કનેક્ટ થયું."</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"USB ડિબગીંગ બંધ કરવા માટે ટૅપ કરો"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB ડિબગીંગને અક્ષમ કરવા માટે પસંદ કરો."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"બગ રિપોર્ટ લઈ રહ્યાં છે…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"બગ રિપોર્ટ શેર કરીએ?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"બગ રિપોર્ટ શેર કરી રહ્યાં છે…"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index db89c3e..cde9ba7 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -556,7 +556,7 @@
     <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"पुन: प्रयास करें."</string>
     <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"कोई फ़िंगरप्रिंट रजिस्टर नहीं किया गया है."</string>
     <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"इस डिवाइस में फ़िंगरप्रिंट सेंसर नहीं है"</string>
-    <string name="fingerprint_name_template" msgid="5870957565512716938">"पहला फ़िगरप्रिंट <xliff:g id="FINGERID">%d</xliff:g>"</string>
+    <string name="fingerprint_name_template" msgid="5870957565512716938">"फ़िंगरप्रिंट <xliff:g id="FINGERID">%d</xliff:g>"</string>
   <string-array name="fingerprint_error_vendor">
   </string-array>
     <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"फ़िंगरप्रिंट आइकॉन"</string>
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"सभी नेटवर्क देखने के लिए यहां पर टैप करें"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"कनेक्ट करें"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"सभी नेटवर्क"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"<xliff:g id="NAME">%s</xliff:g> के दिए हुए वाई-फ़ाई नेटवर्क से कनेक्ट है"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"क्या आप <xliff:g id="NAME">%s</xliff:g> को आपके लिए नेटवर्क ऑफ़र करने देना चाहते हैं?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"हां"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"नहीं"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"वाई-फ़ाई अपने आप चालू हो जाएगा"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"वाई-फ़ाई के लिए इंटरनेट नहीं मिल रहा है"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"विकल्पों के लिए टैप करें"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"आपकी हॉटस्पॉट सेटिंग के हिसाब से बदलाव हो गए हैं"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"आपका हॉटस्पॉट बैंड बदल गया है."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"यह डिवाइस सिर्फ़ 5 गीगाहर्ट्ज़ की आपकी पसंद की सेटिंग पर काम नहीं करता, लेकिन जब भी 5 गीगाहर्ट्ज़ बैंड मौजूद होगा, डिवाइस उसका इस्तेमाल करने लगेगा."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"डीबग करने के लिए एडीबी कनेक्ट किया गया"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"यूएसबी को डीबग करने की सुविधा बंद करने के लिए टैप करें"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB डीबग करना अक्षम करने के लिए चुनें."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"गड़बड़ी की रिपोर्ट ली जा रही है…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"गड़बड़ी की रिपोर्ट शेयर करें?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"गड़बड़ी की रिपोर्ट शेयर की जा रही है…"</string>
@@ -1596,7 +1608,7 @@
     <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
     <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", सुरक्षित"</string>
     <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"आकार भूल गए"</string>
-    <string name="kg_wrong_pattern" msgid="1850806070801358830">"गलत आकार"</string>
+    <string name="kg_wrong_pattern" msgid="1850806070801358830">"गलत पैटर्न डाला गया है"</string>
     <string name="kg_wrong_password" msgid="2333281762128113157">"गलत पासवर्ड"</string>
     <string name="kg_wrong_pin" msgid="1131306510833563801">"गलत PIN"</string>
     <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="8790651267324125694">
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 4cd699b..003714c 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -1267,8 +1267,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Dodirnite za prikaz svih mreža"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Poveži"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Sve mreže"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Povezani ste s Wi‑Fi mrežom koju je predložila aplikacija <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Želite li dopustiti da vam aplikacija <xliff:g id="NAME">%s</xliff:g> predlaže mreže?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Da"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Ne"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi će se uključiti automatski"</string>
@@ -1282,6 +1284,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi nema pristup internetu"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Dodirnite za opcije"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Promjene postavki vaše žarišne točke"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Promijenila se frekvencija vaše žarišne točke."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Ovaj uređaj ne podržava vašu postavku za upotrebu samo 5 GHz. Upotrebljavat će frekvenciju od 5 GHz kada je dostupna."</string>
@@ -1366,6 +1370,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Priključen je alat za otklanjanje pogrešaka putem USB-a"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Dodirnite da biste isključili otklanjanje pogrešaka putem USB-a"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Odaberite da biste onemogućili rješavanje programske pogreške na USB-u."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Izrada izvješća o programskoj pogrešci…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Želite li podijeliti izvješće o programskoj pogrešci?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Dijeljenje izvješća o programskoj pogrešci…"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 3d2ed09..f50748d 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Koppintással megjelenítheti az összes hálózatot"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Kapcsolódás"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Összes hálózat"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Csatlakozva a(z) <xliff:g id="NAME">%s</xliff:g> által javasolt Wi-Fi-hálózathoz"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Szeretné, hogy a(z) <xliff:g id="NAME">%s</xliff:g> hálózatokat javasoljon Önnek?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Igen"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Nem"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"A Wi-Fi automatikusan bekapcsol"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"A Wi-Fi-hálózaton nincs internetkapcsolat"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Koppintson a beállítások megjelenítéséhez"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"A hotspot beállításainak módosítása"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"A hotspot sávja megváltozott."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Ez az eszköz nem támogatja a csak 5 GHz-es sávra vonatkozó beállítást. Az eszköz akkor használ 5 GHz-es sávot, ha a sáv rendelkezésre áll."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB hibakereső csatlakoztatva"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Koppintson az USB-hibakeresés kikapcsolásához"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Válassza ezt az USB hibakeresés kikapcsolásához."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Hibajelentés készítése…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Megosztja a hibajelentést?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Hibajelentés megosztása…"</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index e873140..85bba1e 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Հպեք՝ բոլոր ցանցերը տեսնելու համար"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Միանալ"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Բոլոր ցանցերը"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Միացել է «<xliff:g id="NAME">%s</xliff:g>» հավելվածի գտած Wi‑Fi ցանցին:"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Թույլատրե՞լ <xliff:g id="NAME">%s</xliff:g> հավելվածին առաջարկել ձեզ ցանցեր:"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Այո"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Ոչ"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi-ն ավտոմատ կմիանա"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi ցանցում ինտերնետ կապ չկա"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Հպեք՝ ընտրանքները տեսնելու համար"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Փոփոխություններ թեժ կետի կարգավորումներում"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Ձեր թեժ կետի հաճախականությունը փոխվել է։"</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Սարքը չի կարող աշխատել միայն 5 ԳՀց հաճախականությամբ։ Այդ հաճախականությունը կօգտագործվի հնարավորության դեպքում։"</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB վրիպազերծումը միացված է"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Հպեք՝ USB-ի վրիպազերծումն անջատելու համար"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Ընտրել` USB կարգաբերումը կասեցնելու համար:"</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Վրիպակի զեկույցի ստեղծում…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Տրամադրե՞լ վրիպակի զեկույցը:"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Վրիպակի զեկույցի տրամադրում…"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 299305f..17219cb 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tap untuk melihat semua jaringan"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Hubungkan"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Semua jaringan"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Terhubung ke jaringan Wi‑Fi yang diusulkan oleh <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Perbolehkan <xliff:g id="NAME">%s</xliff:g> mengusulkan jaringan kepada Anda?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Ya"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Tidak"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi akan aktif otomatis"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi tidak memiliki akses internet"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tap untuk melihat opsi"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Perubahan pada setelan hotspot Anda"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Pita hotspot Anda telah berubah."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Perangkat ini tidak mendukung preferensi Anda, yaitu hanya 5GHz. Sebagai gantinya, perangkat ini akan menggunakan pita frekuensi 5GHz jika tersedia."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Debugging USB terhubung"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Tap untuk menonaktifkan debug USB"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Pilih untuk menonaktifkan debugging USB."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Mengambil laporan bug…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Bagikan laporan bug?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Membagikan laporan bug..."</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index 94030bb..4fd0419 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Ýttu til að sjá öll netkerfi"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Tengjast"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Öll netkerfi"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Tengt við Wi-Fi net sem <xliff:g id="NAME">%s</xliff:g> stakk upp á"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Viltu leyfa <xliff:g id="NAME">%s</xliff:g> að stinga upp á neti fyrir þig?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Já"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Nei"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Kveikt verður sjálfkrafa á Wi‑Fi"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi er ekki með tengingu við internetið"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Ýttu til að sjá valkosti"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Breytingar á stillingum heits reits"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Tíðnisvið heita reitsins hefur breyst."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Þetta tæki styður ekki val þitt fyrir aðeins 5 GHz. Í staðinn mun þetta tæki nota 5 GHz tíðnisvið þegar það er í boði."</string>
@@ -1345,6 +1349,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB-villuleit tengd"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Ýttu til að slökkva á USB-villuleit"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Veldu til að gera USB-villuleit óvirka."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Tekur við villutilkynningu…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Deila villutilkynningu?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Deilir villutilkynningu..."</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 3be8acb..f1b1520 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tocca per vedere tutte le reti"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Connetti"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Tutte le reti"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"È stata stabilita la connessione alla rete Wi‑Fi proposta da <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Vuoi consentire all\'app <xliff:g id="NAME">%s</xliff:g> di proporti reti?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Sì"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"No"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Il Wi‑Fi verrà attivato automaticamente"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"La rete Wi-Fi non ha accesso a Internet"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tocca per le opzioni"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Modifiche alle tue impostazioni dell\'hotspot"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"La tua banda di hotspot è cambiata."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Questo dispositivo non supporta la tua preferenza esclusiva per 5 GHz. Utilizzerà invece la banda a 5 GHz solo quando è disponibile."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Debug USB collegato"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Tocca per disattivare il debug USB"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Seleziona per disattivare il debug USB."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Recupero della segnalazione di bug…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Condividere la segnalazione di bug?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Condivisione della segnalazione di bug…"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index d3cdd09..099fdcf 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -1289,8 +1289,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"יש להקיש כדי לראות את כל הרשתות"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"התחבר"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"כל הרשתות"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"‏יש חיבור לרשת Wi‑Fi שהוצעה על ידי <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"האם ברצונך לקבל הצעות לרשתות מ-<xliff:g id="NAME">%s</xliff:g>?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"כן"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"לא"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"‏ה-Wi-Fi יופעל אוטומטית"</string>
@@ -1304,6 +1306,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"‏לרשת ה-Wi-Fi אין גישה לאינטרנט"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"הקש לקבלת אפשרויות"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"שינויים להגדרות של הנקודה לשיתוף אינטרנט"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"התדר של הנקודה לשיתוף אינטרנט השתנה."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"‏מכשיר זה לא תומך בהעדפות שלך ל-5GHz בלבד. במקום זאת, מכשיר זה ישתמש בתדר 5GHz כשיהיה זמין."</string>
@@ -1388,6 +1392,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"‏ניפוי באגים של USB מחובר"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"‏יש להקיש כדי לכבות את ניפוי הבאגים ב-USB"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"‏בחר להשבית ניפוי באגים ב-USB."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"עיבוד דוח על באג..."</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"האם לשתף דוח על באג?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"שיתוף דוח על באג…"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 583ed78..30f511c 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"すべてのネットワークを表示するにはタップします"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"接続"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"すべてのネットワーク"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"<xliff:g id="NAME">%s</xliff:g> で推奨される Wi-Fi ネットワークに接続"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"ネットワークを推奨することを <xliff:g id="NAME">%s</xliff:g> に許可しますか?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"はい"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"いいえ"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi は自動的にオンになります"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi‑Fi はインターネットに接続していません"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"タップしてその他のオプションを表示"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"アクセス ポイントの設定の変更"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"アクセス ポイントの帯域幅が変更されました。"</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"この端末は 5 GHz のみという設定に対応していません。ただし、5 GHz 周波数帯が利用できるときには利用します。"</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USBデバッグが接続されました"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"タップして USB デバッグを無効にしてください"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USBデバッグを無効にする場合に選択します。"</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"バグレポートを取得しています…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"バグレポートを共有しますか?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"バグレポートの共有中…"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 2356fd4..9f6fc50 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"შეეხეთ ყველა ქსელის სანახავად"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"დაკავშირება"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"ყველა ქსელი"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"დაკავშირებულია <xliff:g id="NAME">%s</xliff:g>-ის მიერ შემოთავაზებულ Wi‑Fi ქსელთან"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"გსურთ, საშუალება მისცეთ <xliff:g id="NAME">%s</xliff:g>-ს, შემოგთავაზოთ ქსელები?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"დიახ"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"არა"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi ავტომატურად ჩაირთვება"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi‑Fi ქსელს ინტერნეტზე წვდომა არ აქვს"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"შეეხეთ ვარიანტების სანახავად"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"თქვენი უსადენო ქსელის პარამეტრების ცვლილება"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"თქვენი უსადენო ქსელის დიაპაზონი შეიცვალა."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"ამ მოწყობილობას არ შეუძლია მხოლოდ 5 გჰც სიხშირეზე მუშაობა. აღნიშნული სიხშირის გამოყენება მოხდება მაშინ, როცა ეს შესაძლებელია."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB გამართვა შეერთებულია"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"შეეხეთ, რათა გამორთოთ USB შეცდომების გამართვა"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"მონიშნეთ რათა შეწყვიტოთ USB-ის გამართვა"</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"მიმდინარეობს ხარვეზის შესახებ ანგარიშის შექმნა…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"გსურთ ხარვეზის შესახებ ანგარიშის გაზიარება?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"მიმდინარეობს ხარვეზის შესახებ ანგარიშის გაზიარება…"</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index f714ebe..0436bfa 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Барлық желілерді көру үшін түртіңіз"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Қосылу"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Барлық желілер"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"<xliff:g id="NAME">%s</xliff:g> ұсынған Wi‑Fi желісіне жалғанды"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"<xliff:g id="NAME">%s</xliff:g> сізге желі ұсынғанын қалайсыз ба?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Иә"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Жоқ"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi автоматты түрде қосылады"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi желісінде интернет байланысы жоқ"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Опциялар үшін түртіңіз"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Хотспот параметрлеріне өзгерістер енгізілді"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Хотспот жолағы өзгертілді."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Бұл құрылғы тек 5 ГГц жиілікте жұмыс істей алмайды. Бұл жиілік мүмкін болған жағдайда ғана қолданылады."</string>
@@ -1345,6 +1349,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB түзетуі қосылған"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"USB арқылы түзетуді өшіру үшін түртіңіз"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB түзетуін өшіру үшін таңдаңыз."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Қате туралы есеп алынуда…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Қате туралы есепті бөлісу керек пе?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Қате туралы есеп бөлісілуде…"</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index aa1adc8..f7e038c 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -1247,8 +1247,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ចុចដើម្បីមើលបណ្តាញទាំងអស់"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"ភ្ជាប់"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"បណ្ដាញ​ទាំងអស់"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"បានភ្ជាប់​បណ្ដាញ Wi‑Fi ដែលបាន​ណែនាំដោយ <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"តើអ្នក​ចង់អនុញ្ញាតឱ្យ <xliff:g id="NAME">%s</xliff:g> ណែនាំ​បណ្ដាញ​សម្រាប់អ្នកដែរទេ?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"បាទ/ចាស"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"ទេ"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi នឹង​បើក​ដោយ​ស្វ័យប្រវត្តិ"</string>
@@ -1262,6 +1264,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi មិនមាន​ការតភ្ជាប់​អ៊ីនធឺណិតទេ"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ប៉ះសម្រាប់ជម្រើស"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"ប្ដូរ​ទៅ​ការ​កំណត់​ហតស្ប៉ត​របស់អ្នក"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"រលកសញ្ញាហតស្ប៉តរបស់​អ្នកបាន​ផ្លាស់ប្ដូរ។"</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"ឧបករណ៍​នេះ​មិន​អាច​ប្រើចំណូល​ចិត្ត​របស់អ្នកសម្រាប់តែ 5GHz ទេ។ ផ្ទុយ​មកវិញ ឧបករណ៍​នេះ​នឹង​ប្រើរលកសញ្ញា​ 5GHz នៅពេល​ដែលអាច​ប្រើបាន។"</string>
@@ -1346,6 +1350,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"បាន​ភ្ជាប់​ការ​កែ​កំហុសតាម​ USB"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"ចុច​ដើម្បី​បិទ​ការកែកំហុសតាម ​USB"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"ជ្រើស​រើស ដើម្បី​បិទ​ការ​កែ​កំហុសតាម USB ។"</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"កំពុងទទួលយករបាយការណ៍កំហុស…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"ចែករំលែករបាយការណ៍កំហុសឬ?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"កំពុងចែករំលែករបាយកំហុស…"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index f33e297..0029f02 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ಎಲ್ಲಾ ನೆಟ್‌ವರ್ಕ್‌ಗಳನ್ನು ನೋಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"ಸಂಪರ್ಕಿಸಿ"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"ಎಲ್ಲಾ ನೆಟ್‌ವರ್ಕ್‌ಗಳು"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"<xliff:g id="NAME">%s</xliff:g> ಅವರಿಂದ ಸೂಚಿತ ವೈ-ಫೈ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"<xliff:g id="NAME">%s</xliff:g> ಅವರು ನಿಮಗಾಗಿ ನೆಟ್‌ವರ್ಕ್‌ಗಳನ್ನು ಪ್ರಸ್ತಾಪಿಸುವುದೇ?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"ಹೌದು"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"ಇಲ್ಲ"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"ವೈ‑ಫೈ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಆನ್ ಆಗುತ್ತದೆ"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"ವೈ ಫೈ ಯಾವುದೇ ಇಂಟರ್ನೆಟ್ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿಲ್ಲ"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ಆಯ್ಕೆಗಳಿಗೆ ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"ನಿಮ್ಮ ಹಾಟ್‌ಸ್ಪಾಟ್‌ ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ ಬದಲಾವಣೆಗಳು"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"ನಿಮ್ಮ ಹಾಟ್‌ಸ್ಪಾಟ್‌ ಬ್ಯಾಂಡ್ ಬದಲಾಗಿದೆ."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"ಈ ಸಾಧನವು 5GHz ಗೆ ಮಾತ್ರ ನಿಮ್ಮ ಆದ್ಯತೆಯನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ. ಬದಲಿಗೆ, ಈ ಸಾಧನವು 5GHz ಬ್ಯಾಂಡ್ ಅನ್ನು ಲಭ್ಯವಿರುವಾಗ ಬಳಸುತ್ತದೆ."</string>
@@ -1345,6 +1349,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB ಡೀಬಗಿಂಗ್‌‌ ಸಂಪರ್ಕ"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"USB ಡೀಬಗ್‌ ಮಾಡುವಿಕೆಯನ್ನು ಆಫ್‌ ಮಾಡಲು ಟ್ಯಾಪ್‌ ಮಾಡಿ"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB ಡೀಬಗ್‌ ಮಾಡುವಿಕೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಆಯ್ಕೆ ಮಾಡಿ."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"ದೋಷದ ವರದಿಯನ್ನು ತೆಗೆದುಕೊಳ್ಳಲಾಗುತ್ತಿದೆ…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"ಬಗ್ ವರದಿಯನ್ನು ಹಂಚುವುದೇ?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"ಬಗ್ ವರದಿಯನ್ನು ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತಿದೆ…"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 0e725a3..fcbeaafe 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"모든 네트워크를 보려면 탭하세요."</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"연결"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"모든 네트워크"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"<xliff:g id="NAME">%s</xliff:g>에서 제안한 Wi‑Fi 네트워크에 연결됨"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"<xliff:g id="NAME">%s</xliff:g>에서 네트워크를 제안하도록 허용하시겠습니까?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"예"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"아니요"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi가 자동으로 사용 설정됨"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi가 인터넷에 연결되어 있지 않습니다"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"탭하여 옵션 보기"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"핫스팟 설정 변경"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"핫스팟 대역이 변경되었습니다."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"이 기기에서는 5GHz 전용 환경설정이 지원되지 않습니다. 대신 가능할 때만 기기에서 5GHz 대역이 사용됩니다."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB 디버깅 연결됨"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"USB 디버깅을 사용 중지하려면 탭하세요."</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB 디버깅을 사용하지 않으려면 선택합니다."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"버그 보고서 가져오는 중..."</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"버그 보고서를 공유하시겠습니까?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"버그 신고서 공유 중..."</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 3e3ef6a..c184af7 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Бардык тармактарды көрүү үчүн басыңыз"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Туташуу"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Бардык тармактар"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"<xliff:g id="NAME">%s</xliff:g> сунуштаган Wi‑Fi тармагына туташтырылды"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"<xliff:g id="NAME">%s</xliff:g> сизге тармактарды сунуштай берсинби?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Ооба"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Жок"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi автоматтык түрдө күйөт"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi тармагы Интернетке туташпай турат"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Параметрлерди ачуу үчүн таптап коюңуз"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Туташуу түйүнүңүздүн жөндөөлөрүнө өзгөртүүлөр киргизилди"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Туташуу түйүнүңүздүн жыштыгы өзгөрдү."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Бул түзмөк 5ГГцти гана колдонуу жөндөөсүн колдоого албайт. Анын ордуна, бул түзмөк 5ГГц жыштыгын ал жеткиликтүү болгондо колдонот."</string>
@@ -1346,6 +1350,14 @@
     <string name="adb_active_notification_message" msgid="7463062450474107752">"USB аркылуу мүчүлүштүктөрдү оңдоону өчүрүү үчүн таптаңыз"</string>
     <!-- no translation found for adb_active_notification_message (8470296818270110396) -->
     <skip />
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Мүчүлүштүк тууралуу кабар алынууда…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Мүчүлүштүк тууралуу баяндама бөлүшүлсүнбү?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Мүчүлүштүк тууралуу баяндама бөлүшүлүүдө…"</string>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index a63cd59..ff3e3f6 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ແຕະເພື່ອເບິ່ງເຄືອຂ່າຍທັງໝົດ"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"ເຊື່ອມ​ຕໍ່"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"ເຄືອຂ່າຍທັງໝົດ"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"ເຊື່ອມຕໍ່ຫາເຄືອຂ່າຍ Wi‑Fi ທີ່ສະເໜີໂດຍ <xliff:g id="NAME">%s</xliff:g> ແລ້ວ"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"ທ່ານຕ້ອງການໃຫ້ <xliff:g id="NAME">%s</xliff:g> ສະເໜີເຄືອຂ່າຍໃຫ້ທ່ານບໍ່?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"ແມ່ນ"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"ບໍ່ແມ່ນ"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"ຈະມີການເປີດໃຊ້ Wi‑Fi ອັດຕະໂນມັດ"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi ບໍ່ມີສັນຍານອິນເຕີເນັດ"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ແຕະເພື່ອເບິ່ງຕົວເລືອກ"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"ການປ່ຽນແປງການຕັ້ງຄ່າຮັອດສະປອດຂອງທ່ານ"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"ຄື້ນຄວາມຖີ່ຮັອດສະປອດຂອງທ່ານປ່ຽນແປງແລ້ວ."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"ອຸປະກອນນີ້ບໍ່ຮອງຮັບການຕັ້ງຄ່າຂອງທ່ານສຳລັບ 5GHz ເທົ່ານັ້ນ. ແຕ່ວ່າອຸປະກອນນີ້ຈະໃຊ້ຄື້ນຄວາມຖີ່ 5GHz ເມື່ອສາມາດໃຊ້ໄດ້."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"ເຊື່ອມຕໍ່ການດີບັກຜ່ານ USB ແລ້ວ"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"ແຕະເພື່ອປິດການດີບັກ USB"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"ເລືອກເພື່ອປິດການດີບັ໊ກຜ່ານ USB."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"ກຳລັງຂໍລາຍງານຂໍ້ຜິດພາດ…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"ແບ່ງປັນລາຍງານບັນຫາບໍ?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"ກຳລັງແບ່ງປັນລາຍງານບັນຫາ…"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 0c0887b..2bd19a5 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -1289,8 +1289,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Palieskite, jei norite matyti visus tinklus"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Prisijungti"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Visi tinklai"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Prisijungta prie „<xliff:g id="NAME">%s</xliff:g>“ pasiūlyto „Wi‑Fi“ tinklo"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Ar norite leisti „<xliff:g id="NAME">%s</xliff:g>“ siūlyti jums tinklus?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Taip"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Ne"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"„Wi‑Fi“ bus įjungtas automatiškai"</string>
@@ -1304,6 +1306,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"„Wi‑Fi“ tinkle nėra interneto ryšio"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Palieskite, kad būtų rodomos parinktys."</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Viešosios interneto prieigos taško nustatymų pakeitimai"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Viešosios prieigos taško dažnio juosta pasikeitė."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Šiame įrenginyje nepalaikoma tik 5 GHz nuostata. Vietoj to šiame įrenginyje bus naudojama 5 GHz dažnio juosta, kai bus pasiekiama."</string>
@@ -1388,6 +1392,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB derinimas prijungtas"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Palieskite, kad išjungtumėte USB derinimą"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Pasirinkite, kas išjungtumėte USB derinimą."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Pateikiamas pranešimas apie riktą…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Bendrinti pranešimą apie riktą?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Bendrinamas pranešimas apie riktą..."</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index b802fee..c8c1c9e 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -1267,8 +1267,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Pieskarieties, lai skatītu visus tīklus"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Izveidot savienojumu"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Visi tīkli"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Izveidots savienojums ar Wi-Fi tīklu, ko ieteica lietotne <xliff:g id="NAME">%s</xliff:g>."</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Vai vēlaties, lai lietotne <xliff:g id="NAME">%s</xliff:g> iesaka tīklus?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Jā"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Nē"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi tiks automātiski ieslēgts"</string>
@@ -1282,6 +1284,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi tīklā nav piekļuves internetam."</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Pieskarieties, lai skatītu iespējas."</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Izmaiņas tīklāja iestatījumos"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Ir mainīts tīklāja joslas platums."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Šajā ierīcē netiek atbalstīta jūsu preference par tikai 5 GHz joslu. 5 GHz josla ierīcē tiks izmantota, kad tā būs pieejama."</string>
@@ -1366,6 +1370,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB atkļūdošana ir pievienota."</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Pieskarieties, lai izslēgtu USB atkļūdošanu"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Atlasiet, lai atspējotu USB atkļūdošanu."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Notiek kļūdas pārskata izveide…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Vai kopīgot kļūdas pārskatu?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Notiek kļūdas pārskata kopīgošana…"</string>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index 9c66edc..b72ede5 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Допрете за да ги видите сите мрежи"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Поврзете се"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Сите мрежи"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Поврзано на Wi‑Fi мрежа обезбедена од <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Дали сакате да дозволите <xliff:g id="NAME">%s</xliff:g> да ви предлага мрежи?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Да"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Не"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi ќе се вклучи автоматски"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi нема пристап до интернет"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Допрете за опции"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Промени на поставките за точка на пристап"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Појасот за точка на пристап е променет."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Уредов не ги поддржува вашите поставки за само 5 GHz. Наместо тоа, ќе го користи појасот од 5 GHz кога е достапен."</string>
@@ -1345,6 +1349,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Поврзано е отстранување грешки преку USB"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Допрете за да го исклучите отстранувањето грешки преку USB"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Изберете за да се оневозможи отстранување грешки на USB."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Се зема извештајот за грешки…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Да се сподели извештајот за грешки?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Се споделува извештај за грешки…"</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 76d2daf..9a35ff5 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"എല്ലാ നെറ്റ്‌വർക്കുകളും കാണാൻ ടാപ്പുചെയ്യുക"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"കണക്റ്റുചെയ്യുക"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"എല്ലാ നെറ്റ്‌വർക്കുകളും"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"<xliff:g id="NAME">%s</xliff:g> നിർദേശിച്ച വൈഫൈ നെറ്റ്‌വർക്കിൽ കണക്‌റ്റ് ചെയ്‌തു"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"നിങ്ങൾക്കായി <xliff:g id="NAME">%s</xliff:g>-നെ നെറ്റ്‌വർക്കുകൾ നിർദ്ദേശിക്കാൻ അനുവദിക്കണോ?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"ഉവ്വ്"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"ഇല്ല"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"വൈഫൈ സ്വമേധയാ ഓണാകും"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"വൈഫൈയ്ക്ക് ഇന്റർനെറ്റ് ആക്‌സസ് ഇല്ല"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ഓപ്ഷനുകൾക്ക് ടാപ്പുചെയ്യുക"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"നിങ്ങളുടെ ഹോട്ട്‌സ്‌പോട്ട് ക്രമീകരണത്തിൽ വരുത്തിയ മാറ്റങ്ങൾ"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"നിങ്ങളുടെ ഹോട്ട്‌സ്‌പോട്ട് ബാൻഡ് മാറി."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"നിങ്ങളുടെ മുൻഗണനയനുസരിച്ചുള്ള, 5GHz മാത്രം എന്നത് ഈ ഉപകരണം പിന്തുണയ്ക്കുന്നില്ല. പകരം, 5GHz ബാൻഡ് ലഭ്യമാകുമ്പോൾ അത് ഉപയോഗിക്കും."</string>
@@ -1345,6 +1349,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB ഡീബഗ്ഗിംഗ് കണക്റ്റ് ചെയ്തു"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"USB ഡീബഗ്ഗിംഗ് ഓഫാക്കാൻ ടാപ്പ് ചെയ്യുക"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB ഡീബഗ്ഗുചെയ്യൽ പ്രവർത്തനരഹിതമാക്കാൻ തിരഞ്ഞെടുക്കുക."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"ബഗ് റിപ്പോർട്ട് എടുക്കുന്നു…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"ബഗ് റിപ്പോർട്ട് പങ്കിടണോ?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"ബഗ് റിപ്പോർട്ട് പങ്കിടുന്നു…"</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 1e2746c..8ed5692 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Бүх сүлжээг харахын тулд товшино уу"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Холбогдох"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Бүх сүлжээ"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"<xliff:g id="NAME">%s</xliff:g>-с санал болгосон Wi-Fi сүлжээнд холбогдсон"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Та <xliff:g id="NAME">%s</xliff:g>-г танд сүлжээ санал болгохыг хүсэж байна уу?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Тийм"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Үгүй"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi автоматаар асна"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi-д интернет хандалт алга"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Сонголт хийхийн тулд товшино уу"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Таны сүлжээний цэгийн тохиргооны өөрчлөлт"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Таны сүлжээний цэгийн зурвасыг өөрчилсөн."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Энэ төхөөрөмж таны \"зөвхөн 5Гц\" гэсэн давуу сонголтыг дэмждэггүй. Үүний оронд энэ төхөөрөмж 5Гц зурвасыг боломжтой үед нь ашиглах болно."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB дебаг холбогдсон"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"USB дебаг хийхийг унтраахын тулд товшино уу"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB дебаг хийхийг идэвхгүй болгох бол сонгоно уу."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Алдааны тайланг авч байна..."</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Алдааны тайланг хуваалцах уу?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Алдааны тайланг хуваалцаж байна..."</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index 240a3bf..de422ec 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"सर्व नेटवर्क पाहण्यासाठी टॅप करा"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"कनेक्ट करा"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"सर्व नेटवर्क"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"<xliff:g id="NAME">%s</xliff:g> ने सुचवलेल्या वाय-फाय नेटवर्कशी कनेक्ट केले"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"तुम्हाला <xliff:g id="NAME">%s</xliff:g> ने तुमच्यासाठी नेटवर्क सुचवायला हवे आहे का?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"होय"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"नाही"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"वाय-फाय आपोआप चालू होईल"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"वाय-फाय ला इंटरनेटचा अॅक्सेस नाही"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"पर्यायांसाठी टॅप करा"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"तुमच्या हॉटस्पॉट सेटिंग्जमधील बदल"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"तुमचा हॉटस्पॉट बँड बदलला आहे."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"हे डिव्हाइस तुमच्या फक्त ५GHz साठी प्राधान्याला सपोर्ट करत नाही. त्याऐवजी, हे डिव्हाइस ५GHz बँड उपलब्ध असताना वापरेल."</string>
@@ -1345,6 +1349,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB डीबग करणे कनेक्‍ट केले"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"USB डीबगिंग बंद करण्यासाठी टॅप करा"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB डीबगिंग बंद करण्यासाठी निवडा."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"बग रीपोर्ट घेत आहे..."</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"बग अहवाल शेअर करायचा?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"बग रीपोर्ट शेअर करत आहे..."</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index c3c863a..4b62e7b 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Ketik untuk melihat semua rangkaian"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Sambung"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Semua rangkaian"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Dihubungkan ke rangkaian Wi‑Fi yang dicadangkan oleh <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Adakah anda ingin <xliff:g id="NAME">%s</xliff:g> mencadangkan rangkaian kepada anda?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Ya"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Tidak"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi akan dihidupkan secara automatik"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi tiada akses Internet"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Ketik untuk mendapatkan pilihan"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Perubahan kepada tetapan tempat liputan anda"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Jalur tempat liputan anda telah berubah."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Peranti ini tidak menyokong pilihan anda untuk 5GHz sahaja. Sebaliknya, peranti ini akan menggunakan jalur 5GHz apabila tersedia."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Penyahpepijatan USB disambungkan"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Ketik untuk mematikan penyahpepijatan USB"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Pilih untuk melumpuhkan penyahpepijatan USB."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Mengambil laporan pepijat…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Kongsi laporan pepijat?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Berkongsi laporan pepijat…"</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index c036730..0e772e4 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ကွန်ရက်အားလုံးကို ကြည့်ရန် တို့ပါ"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"ချိတ်ဆက်ရန်"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"ကွန်ရက်အားလုံး"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"<xliff:g id="NAME">%s</xliff:g> အကြံပြုထားသော Wi‑Fi ကွန် ရက်သို့ ချိတ်ဆက်ထားသည်"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"သင့်အတွက် ကွန်ရက်များ အကြံပြုရန် <xliff:g id="NAME">%s</xliff:g> ကို ခွင့်ပြုလိုပါသလား။"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Yes"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"No"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi ကို အလိုအလျောက်​ ပြန်ဖွင့်ပေးလိမ့်ပါမည်"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi တွင် အင်တာနက်ချိတ်ဆက်မှု မရှိပါ"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"အခြားရွေးချယ်စရာများကိုကြည့်ရန် တို့ပါ"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"သင်၏ဟော့စပေါ့ ဆက်တင်များ ပြောင်းလဲမှု"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"သင်၏ ဟော့စပေါ့လိုင်း ပြောင်းသွားပါပြီ။"</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"ဤစက်ပစ္စည်းသည် သင်၏ 5GHz သီးသန့်ရွေးချယ်မှုအတွက် ပံ့ပိုးမထားပါ။ ၎င်းအစား ဤစက်ပစ္စည်းသည် ရနိုင်သည့်အခါ 5GHz လိုင်းကို သုံးသွားပါမည်။"</string>
@@ -1345,6 +1349,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB အမှားရှာပြင်စနစ် ချိတ်ဆက်ထားသည်"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"USB အမှားရှာပြင်ခြင်းကို ပိတ်ရန် တို့ပါ"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB ဖြင့် အမှားရှာပြင်ခြင်းကို ပိတ်ရန် ရွေးပါ။"</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"ချွတ်ယွင်းချက် အစီရင်ခံစာပြုစုနေသည်..."</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"ချွတ်ယွင်းချက် အစီရင်ခံစာကို မျှဝေမလား။"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"ချွတ်ယွင်းမှုအစီရင်ခံစာ မျှဝေနေသည်…"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index e479834..12cc8f2 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Trykk for å se alle nettverkene"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Koble til"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Alle nettverk"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Koblet til et Wi-Fi-nettverk som ble foreslått av <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Vil du la <xliff:g id="NAME">%s</xliff:g> foreslå nettverk for deg?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Ja"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Nei"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi slås på automatisk"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi har ikke Internett-tilgang"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Trykk for å få alternativer"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Endres til innstillingene dine for Wi-Fi-soner"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Båndet ditt for Wi-Fi-sone er endret."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Denne enheten støtter ikke innstillingen din for bare 5 GHz. I stedet bruker enheten 5 GHz-båndet når det er tilgjengelig."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB-feilsøking tilkoblet"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Trykk for å slå av USB-feilsøking"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Velg for å deaktivere USB-debugging."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Kjører feilrapport …"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Vil du dele feilrapporten?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Deler feilrapporten …"</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index b892255..93e6aa6 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -1251,8 +1251,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"सबै नेटवर्कहरू हेर्न ट्याप गर्नुहोस्"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"जडान गर्नुहोस्"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"सबै नेटवर्कहरू"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"<xliff:g id="NAME">%s</xliff:g> ले प्रस्ताव गरेको Wi‑Fi नेटवर्कमा जोडियो"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"तपाईं <xliff:g id="NAME">%s</xliff:g> लाई आफ्ना लागि नेटवर्कहरूको प्रस्ताव गर्ने अनुमति दिन चाहनुहुन्छ?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"हो"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"होइन"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi स्वतः सक्रिय हुनेछ"</string>
@@ -1266,6 +1268,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi मार्फत इन्टरनेटमाथि पहुँच राख्न सकिँदैन"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"विकल्पहरूका लागि ट्याप गर्नुहोस्"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"तपाईंको हटस्पट सेटिङहरूमा परिवर्तन हुन्छ"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"तपाईंको हटस्पट ब्यान्ड परिवर्तन भएको छ।"</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"यो यन्त्रले तपाईंको 5GHz मात्रको प्राथमिकतालाई समर्थन गर्दैन। बरु, उपलब्ध भएको खण्डमा यो यन्त्रले 5GHz ब्यान्ड प्रयोग गर्छ।"</string>
@@ -1350,6 +1354,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB डिबग गर्ने सुविधा सुचारू छ"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"USB डिबग प्रक्रिया निष्क्रिय पार्न ट्याप गर्नुहोस्‌"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB डिबगिङलाई असक्षम पार्न ट्याप गर्नुहोस्।"</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"बग रिपोर्ट लिँदै..."</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"बग रिपोर्टलाई साझेदारी गर्ने हो?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"बग रिपोर्टलाई साझेदारी गर्दै ..."</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index c552f00..c2bafaf 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tik om alle netwerken te bekijken"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Verbinding maken"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Alle netwerken"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Verbonden met wifi-netwerk dat is voorgesteld door <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Wil je dat <xliff:g id="NAME">%s</xliff:g> je netwerken kan voorstellen?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Ja"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Nee"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wifi wordt automatisch ingeschakeld"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wifi-netwerk heeft geen internettoegang"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tik voor opties"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Wijzigingen in je hotspot-instellingen"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Je hotspot-band is gewijzigd."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Dit apparaat biedt geen ondersteuning voor je voorkeur voor alleen 5 GHz. In plaats daarvan gebruikt dit apparaat de 5-GHz-band wanneer deze beschikbaar is."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB-foutopsporing verbonden"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Tik om USB-foutopsporing uit te schakelen"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Selecteer deze optie om USB-foutopsporing uit te schakelen."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Bugrapport genereren…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Bugrapport delen?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Bugrapport delen…"</string>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index 57d39ce..9ad58cf 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -1086,27 +1086,27 @@
     <string name="inputMethod" msgid="1653630062304567879">"ଇନପୁଟ୍ ପଦ୍ଧତି"</string>
     <string name="editTextMenuTitle" msgid="4909135564941815494">"ଟେକ୍ସଟ୍‌ କାର୍ଯ୍ୟ"</string>
     <string name="email" msgid="4560673117055050403">"ଇମେଲ୍"</string>
-    <string name="email_desc" msgid="3638665569546416795">"ବାଛି ନେଇଥିବା ଠିକଣାରେ ଇମେଲ୍‌ ପଠାନ୍ତୁ"</string>
-    <string name="dial" msgid="1253998302767701559">"କଲ୍ କରନ୍ତୁ"</string>
-    <string name="dial_desc" msgid="6573723404985517250">"ବାଛି ନେଇଥିବା ଫୋନ୍‌ ନମ୍ବର୍‌ରେ କଲ୍‌ କରନ୍ତୁ"</string>
-    <string name="map" msgid="5441053548030107189">"ମାନଚିତ୍ର"</string>
-    <string name="map_desc" msgid="1836995341943772348">"ଚୟନିତ ଠିକଣାକୁ ଖୋଜନ୍ତୁ"</string>
+    <string name="email_desc" msgid="3638665569546416795">"ଚୟନିତ ଠିକଣାକୁ ଇମେଲ୍‍ ପଠାନ୍ତୁ"</string>
+    <string name="dial" msgid="1253998302767701559">"କଲ୍"</string>
+    <string name="dial_desc" msgid="6573723404985517250">"ଚୟନିତ ଫୋନ୍‍ ନମ୍ବର୍‍କୁ କଲ୍‍ କରନ୍ତୁ"</string>
+    <string name="map" msgid="5441053548030107189">"ମ୍ୟାପ୍‍"</string>
+    <string name="map_desc" msgid="1836995341943772348">"ଚୟନିତ ଠିକଣା ଖୋଜନ୍ତୁ"</string>
     <string name="browse" msgid="1245903488306147205">"ଖୋଲନ୍ତୁ"</string>
-    <string name="browse_desc" msgid="8220976549618935044">"ବାଛି ନେଇଥିବା URL ଖୋଲନ୍ତୁ"</string>
+    <string name="browse_desc" msgid="8220976549618935044">"ଚୟନିତ URL ଖୋଲନ୍ତୁ"</string>
     <string name="sms" msgid="4560537514610063430">"ମେସେଜ୍‌"</string>
-    <string name="sms_desc" msgid="7526588350969638809">"ବାଛି ନେଇଥିବା ଫୋନ୍‌ ନମ୍ବର୍‌ରେ ମେସେଜ୍‌ ପଠାନ୍ତୁ"</string>
-    <string name="add_contact" msgid="7867066569670597203">"ଯୋଡ଼ନ୍ତୁ"</string>
-    <string name="add_contact_desc" msgid="4830217847004590345">"ଯୋଗାଯୋଗରେ ଯୋଡ଼ନ୍ତୁ"</string>
+    <string name="sms_desc" msgid="7526588350969638809">"ଚୟନିତ ଫୋନ୍‌ ନମ୍ବର୍‌କୁ ମେସେଜ୍‌ ପଠାନ୍ତୁ"</string>
+    <string name="add_contact" msgid="7867066569670597203">"ଯୋଗ କରନ୍ତୁ"</string>
+    <string name="add_contact_desc" msgid="4830217847004590345">"ଯୋଗାଯୋଗରେ ଯୋଗ କରନ୍ତୁ"</string>
     <string name="view_calendar" msgid="979609872939597838">"ଦେଖନ୍ତୁ"</string>
-    <string name="view_calendar_desc" msgid="5828320291870344584">"ବାଛି ନେଇଥିବା ସମୟକୁ କ୍ୟାଲେଣ୍ଡର୍‌ରେ ଦେଖନ୍ତୁ"</string>
-    <string name="add_calendar_event" msgid="1953664627192056206">"ନିର୍ଦ୍ଧାରିତ କରନ୍ତୁ"</string>
-    <string name="add_calendar_event_desc" msgid="4326891793260687388">"ବାଛି ନେଇଥିବା ସମୟଟିରେ ଇଭେଣ୍ଟ ସେଟ୍‌ କରନ୍ତୁ"</string>
+    <string name="view_calendar_desc" msgid="5828320291870344584">"କ୍ୟାଲେଣ୍ଡର୍‌ରେ ଚୟନିତ ସମୟ ଦେଖନ୍ତୁ"</string>
+    <string name="add_calendar_event" msgid="1953664627192056206">"ସୂଚୀ"</string>
+    <string name="add_calendar_event_desc" msgid="4326891793260687388">"ଚୟନିତ ସମୟ ପାଇଁ ଇଭେଣ୍ଟ ସୂଚୀବଦ୍ଧ କରନ୍ତୁ"</string>
     <string name="view_flight" msgid="7691640491425680214">"ଟ୍ରାକ୍‌ କରନ୍ତୁ"</string>
-    <string name="view_flight_desc" msgid="3876322502674253506">"ବାଛି ନେଇଥିବା ଫ୍ଲାଇଟ୍‌କୁ ଟ୍ରାକ୍‌ କରନ୍ତୁ"</string>
-    <string name="translate" msgid="9218619809342576858">"ଅନୁବାଦ"</string>
-    <string name="translate_desc" msgid="4502367770068777202">"ବଛାଯାଇଥିବା ପାଠର ଅନୁବାଦ କରନ୍ତୁ"</string>
-    <string name="define" msgid="7394820043869954211">"ନିର୍ଦ୍ଧିଷ୍ଟ କରନ୍ତୁ"</string>
-    <string name="define_desc" msgid="7910883642444919726">"ବଛାଯାଇଥିବା ପାଠ୍ୟ ନିର୍ଦ୍ଧିଷ୍ଟ କରନ୍ତୁ"</string>
+    <string name="view_flight_desc" msgid="3876322502674253506">"ଚୟନିତ ଫ୍ଲାଇଟ୍‍କୁ ଟ୍ରାକ କରନ୍ତୁ"</string>
+    <string name="translate" msgid="9218619809342576858">"ଅନୁବାଦ କରନ୍ତୁ"</string>
+    <string name="translate_desc" msgid="4502367770068777202">"ଚୟନିତ ଟେକ୍ସଟ୍‍କୁ ଅନୁବାଦ କରନ୍ତୁ"</string>
+    <string name="define" msgid="7394820043869954211">"ପରିଭାଷିତ କରନ୍ତୁ"</string>
+    <string name="define_desc" msgid="7910883642444919726">"ଚୟନିତି ଟେକ୍ସଟ୍‍କୁ ପରିଭାଷିତ କରନ୍ତୁ"</string>
     <string name="low_internal_storage_view_title" msgid="5576272496365684834">"ଷ୍ଟୋରେଜ୍‌ ସ୍ପେସ୍‌ ଶେଷ ହେବାରେ ଲାଗିଛି"</string>
     <string name="low_internal_storage_view_text" msgid="6640505817617414371">"କିଛି ସିଷ୍ଟମ ଫଙ୍କଶନ୍‍ କାମ କରିନପାରେ"</string>
     <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"ସିଷ୍ଟମ୍ ପାଇଁ ପ୍ରର୍ଯ୍ୟାପ୍ତ ଷ୍ଟୋରେଜ୍‌ ନାହିଁ। ସୁନିଶ୍ଚିତ କରନ୍ତୁ ଯେ, ଆପଣଙ୍କ ପାଖରେ 250MB ଖାଲି ଜାଗା ଅଛି ଏବଂ ପୁନଃ ଆରମ୍ଭ କରନ୍ତୁ।"</string>
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ସମସ୍ତ ନେଟ୍‌ୱର୍କ ଦେଖିବାକୁ ଟାପ୍‍ କରନ୍ତୁ"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"କନେକ୍ଟ କରନ୍ତୁ"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"ସମସ୍ତ ନେଟ୍‌ୱର୍କ"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"<xliff:g id="NAME">%s</xliff:g>ଙ୍କ ଦ୍ୱାରା ପ୍ରସ୍ତାବିତ ୱାଇ-ଫାଇ ନେଟ୍‌ୱର୍କ ସହ ସଂଯୁକ୍ତ ହୋଇଛି"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"ଆପଣ କ’ଣ ଚାହୁଁଛନ୍ତି <xliff:g id="NAME">%s</xliff:g>, ଆପଣଙ୍କ ପାଇଁ ନେଟ୍‌ୱର୍କର ପ୍ରସ୍ତାବ ଦିଅନ୍ତୁ?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"ହଁ"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"ନାହିଁ"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"ୱାଇ-ଫାଇ ସ୍ୱଚାଳିତ ଭାବେ ଅନ୍ ହେବ"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"ୱାଇ-ଫାଇର କୌଣସି ଇଣ୍ଟରନେଟ୍‍ ଆକ୍ସେସ୍‍ ନାହିଁ"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ବିକଳ୍ପ ପାଇଁ ଟାପ୍‍ କରନ୍ତୁ"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"ଆପଣଙ୍କର ହଟ୍‌ସ୍ପଟ୍‍ ସେଟିଙ୍ଗକୁ ବଦଳିଯାଇଛି"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"ଆପଣଙ୍କର ହଟ୍‍ସ୍ପଟ୍‌ ପରିବର୍ତ୍ତନ କରାଯାଇଛି"</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"କେବଳ 5GHz ପାଇଁ, ଏହି ଡିଭାଇସ୍‍ ଆପଣଙ୍କର ପସନ୍ଦକୁ ସପୋର୍ଟ କରେନାହିଁ। ଏହା ପରିବର୍ତ୍ତେ, ଏହି ଡିଭାଇସ୍‍ 5GHz ବ୍ୟାଣ୍ଡ ବ୍ୟବହାର କରିବ।"</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB ଡିବଗିଙ୍ଗ ସଂଯୁକ୍ତ ହୋଇଛି"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"USBର ଡିବଗିଙ୍ଗ ସୁବିଧାକୁ ବନ୍ଦ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB ଡିବଗିଙ୍ଗକୁ ଅକ୍ଷମ କରିବା ପାଇଁ ଚୟନ କରନ୍ତୁ।"</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"ବଗ୍ ରିପୋର୍ଟ ନିଆଯାଉଛି…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"ବଗ୍‍ ରିପୋର୍ଟ ଶେୟାର୍‌ କରିବେ?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"ବଗ୍‍ ରିପୋର୍ଟ ଶେୟାର୍‌ କରାଯାଉଛି…"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 85afacb..7de2be7 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ਸਾਰੇ ਨੈੱਟਵਰਕਾਂ ਨੂੰ ਦੇਖਣ ਲਈ ਟੈਪ ਕਰੋ"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"ਕਨੈਕਟ ਕਰੋ"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"ਸਾਰੇ ਨੈੱਟਵਰਕ"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"<xliff:g id="NAME">%s</xliff:g> ਵੱਲੋਂ ਸੁਝਾਏ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਹੈ"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"ਕੀ ਤੁਸੀਂ ਚਾਹੁੰਦੇ ਹੋ ਕਿ <xliff:g id="NAME">%s</xliff:g> ਤੁਹਾਨੂੰ ਨੈੱਟਵਰਕ ਸੁਝਾਏ?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"ਹਾਂ"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"ਨਹੀਂ"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"ਵਾਈ‑ਫਾਈ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਚੱਲ ਪਵੇਗਾ"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"ਵਾਈ-ਫਾਈ ਦੀ ਕੋਈ ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਨਹੀਂ ਹੈ"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ਵਿਕਲਪਾਂ ਲਈ ਟੈਪ ਕਰੋ"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"ਤੁਹਾਡੀਆਂ ਹੌਟਸਪੌਟ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਬਦਲਾਅ"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"ਤੁਹਾਡਾ ਹੌਟਸਪੌਟ ਬੈਂਡ ਬਦਲ ਗਿਆ ਹੈ।"</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"ਇਹ ਡੀਵਾਈਸ ਸਿਰਫ਼ 5GHz ਦੀ ਤੁਹਾਡੀ ਤਰਜੀਹ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦਾ ਹੈ। ਇਸਦੀ ਬਜਾਏ, ਇਹ ਡੀਵਾਈਸ ਉਪਲਬਧ ਹੋਣ \'ਤੇ 5GHz ਬੈਂਡ ਵਰਤੇਗਾ।"</string>
@@ -1345,6 +1349,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB ਡੀਬਗਿੰਗ ਕਨੈਕਟ ਕੀਤੀ"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"USB ਡੀਬੱਗਿੰਗ ਬੰਦ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB ਡੀਬੱਗਿੰਗ ਅਯੋਗ ਬਣਾਉਣ ਲਈ ਚੁਣੋ।"</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"ਬੱਗ ਰਿਪਰੋਟ ਪ੍ਰਾਪਤ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ..."</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"ਕੀ ਬੱਗ ਰਿਪੋਰਟ ਸਾਂਝੀ ਕਰਨੀ ਹੈ?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"ਬੱਗ ਰਿਪੋਰਟ ਸਾਂਝੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 08d56e4..48dcdb5 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -1289,8 +1289,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Kliknij, by zobaczyć wszystkie sieci"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Połącz"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Wszystkie sieci"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Połączono z siecią Wi‑Fi zaproponowaną przez aplikację <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Czy chcesz zezwolić aplikacji <xliff:g id="NAME">%s</xliff:g> na proponowanie sieci?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Tak"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Nie"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi włączy się automatycznie"</string>
@@ -1304,6 +1306,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Sieć Wi-Fi nie ma dostępu do internetu"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Kliknij, by wyświetlić opcje"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Zmieniono ustawienia hotspotu"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Zmieniono pasmo hotspotu."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"To urządzenie nie może korzystać tylko z częstotliwości 5 GHz. Będzie korzystać z tego pasma, jeśli będzie ono dostępne."</string>
@@ -1388,6 +1392,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Podłączono moduł debugowania USB"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Kliknij, by wyłączyć debugowanie USB"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Wybierz, aby wyłączyć debugowanie USB."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Zgłaszam błąd…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Udostępnić raport o błędzie?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Udostępniam raport o błędzie…"</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 38368d3..c501699 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -680,7 +680,7 @@
     <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Desativar recursos bloq. de tela"</string>
     <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"Impede o uso de alguns recursos do bloqueio de tela."</string>
   <string-array name="phoneTypes">
-    <item msgid="8901098336658710359">"Residencial"</item>
+    <item msgid="8901098336658710359">"Casa"</item>
     <item msgid="869923650527136615">"Celular"</item>
     <item msgid="7897544654242874543">"Trabalho"</item>
     <item msgid="1103601433382158155">"Fax do trabalho"</item>
@@ -690,19 +690,19 @@
     <item msgid="9192514806975898961">"Personalizado"</item>
   </string-array>
   <string-array name="emailAddressTypes">
-    <item msgid="8073994352956129127">"Residencial"</item>
+    <item msgid="8073994352956129127">"Casa"</item>
     <item msgid="7084237356602625604">"Trabalho"</item>
     <item msgid="1112044410659011023">"Outros"</item>
     <item msgid="2374913952870110618">"Personalizado"</item>
   </string-array>
   <string-array name="postalAddressTypes">
-    <item msgid="6880257626740047286">"Residencial"</item>
+    <item msgid="6880257626740047286">"Casa"</item>
     <item msgid="5629153956045109251">"Trabalho"</item>
     <item msgid="4966604264500343469">"Outros"</item>
     <item msgid="4932682847595299369">"Personalizado"</item>
   </string-array>
   <string-array name="imAddressTypes">
-    <item msgid="1738585194601476694">"Residencial"</item>
+    <item msgid="1738585194601476694">"Casa"</item>
     <item msgid="1359644565647383708">"Trabalho"</item>
     <item msgid="7868549401053615677">"Outros"</item>
     <item msgid="3145118944639869809">"Personalizado"</item>
@@ -723,7 +723,7 @@
     <item msgid="1648797903785279353">"Jabber"</item>
   </string-array>
     <string name="phoneTypeCustom" msgid="1644738059053355820">"Personalizado"</string>
-    <string name="phoneTypeHome" msgid="2570923463033985887">"Residencial"</string>
+    <string name="phoneTypeHome" msgid="2570923463033985887">"Casa"</string>
     <string name="phoneTypeMobile" msgid="6501463557754751037">"Celular"</string>
     <string name="phoneTypeWork" msgid="8863939667059911633">"Comercial"</string>
     <string name="phoneTypeFaxWork" msgid="3517792160008890912">"Fax comercial"</string>
@@ -748,16 +748,16 @@
     <string name="eventTypeAnniversary" msgid="3876779744518284000">"Data comemorativa"</string>
     <string name="eventTypeOther" msgid="7388178939010143077">"Outros"</string>
     <string name="emailTypeCustom" msgid="8525960257804213846">"Personalizado"</string>
-    <string name="emailTypeHome" msgid="449227236140433919">"Residencial"</string>
+    <string name="emailTypeHome" msgid="449227236140433919">"Casa"</string>
     <string name="emailTypeWork" msgid="3548058059601149973">"Comercial"</string>
     <string name="emailTypeOther" msgid="2923008695272639549">"Outros"</string>
     <string name="emailTypeMobile" msgid="119919005321166205">"Celular"</string>
     <string name="postalTypeCustom" msgid="8903206903060479902">"Personalizado"</string>
-    <string name="postalTypeHome" msgid="8165756977184483097">"Residencial"</string>
+    <string name="postalTypeHome" msgid="8165756977184483097">"Casa"</string>
     <string name="postalTypeWork" msgid="5268172772387694495">"Comercial"</string>
     <string name="postalTypeOther" msgid="2726111966623584341">"Outros"</string>
     <string name="imTypeCustom" msgid="2074028755527826046">"Personalizado"</string>
-    <string name="imTypeHome" msgid="6241181032954263892">"Residencial"</string>
+    <string name="imTypeHome" msgid="6241181032954263892">"Casa"</string>
     <string name="imTypeWork" msgid="1371489290242433090">"Comercial"</string>
     <string name="imTypeOther" msgid="5377007495735915478">"Outros"</string>
     <string name="imProtocolCustom" msgid="6919453836618749992">"Personalizado"</string>
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toque para ver todas as redes"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectar"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Todas as redes"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Conectado à rede Wi-Fi sugerida por <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Permitir que o app <xliff:g id="NAME">%s</xliff:g> faça sugestões de rede?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Sim"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Não"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"O Wi‑Fi será ativado automaticamente"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"O Wi‑Fi não tem acesso à Internet"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Toque para ver opções"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Mudanças nas suas configurações de ponto de acesso"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Sua banda de ponto de acesso foi alterada."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Este dispositivo não é compatível com sua preferência apenas por 5 GHz. Em vez disso, o dispositivo usará a banda de 5 GHz quando ela estiver disponível."</string>
@@ -1342,8 +1346,16 @@
     <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Acessório de áudio analógico detectado"</string>
     <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"O dispositivo anexo não é compatível com esse smartphone. Toque para saber mais."</string>
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Depuração USB conectada"</string>
-    <string name="adb_active_notification_message" msgid="7463062450474107752">"Toque para desativar a depuração USB"</string>
+    <string name="adb_active_notification_message" msgid="7463062450474107752">"Toque para desativar a depuração USB."</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Selecione para desativar a depuração USB."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Gerando relatório do bug..."</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Compartilhar relatório do bug?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Compartilhando relatório do bug…"</string>
@@ -1454,8 +1466,8 @@
     <string name="no_file_chosen" msgid="6363648562170759465">"Nenhum arquivo escolhido"</string>
     <string name="reset" msgid="2448168080964209908">"Redefinir"</string>
     <string name="submit" msgid="1602335572089911941">"Enviar"</string>
-    <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"O app de direção está em execução"</string>
-    <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Toque para sair do app de direção."</string>
+    <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"O app para carro está sendo usado"</string>
+    <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Toque para sair do app para carro."</string>
     <string name="tethered_notification_title" msgid="3146694234398202601">"Vínculo ou ponto de acesso ativo"</string>
     <string name="tethered_notification_message" msgid="2113628520792055377">"Toque para configurar."</string>
     <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering desativado"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 67fe5b6..dece770 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toque para ver todas as redes"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Ligar"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Todas as redes"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Ligação a rede Wi‑Fi proposta por <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Pretende permitir que <xliff:g id="NAME">%s</xliff:g> lhe proponha redes?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Sim"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Não"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"O Wi‑Fi será ativado automaticamente"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"O Wi-Fi não tem acesso à Internet."</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Toque para obter mais opções"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Alterações às definições de zona Wi-Fi"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"A banda da sua zona Wi-Fi foi alterada."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Este dispositivo não suporta a sua preferência apenas para 5 GHz. Em alternativa, este dispositivo vai utilizar a banda de 5 GHz quando estiver disponível."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Depuração USB ligada"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Toque para desativar a depuração USB."</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Selecione para desativar a depuração por USB."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"A criar relatório de erro…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Pretende partilhar o relatório de erro?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"A partilhar relatório de erro…"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 38368d3..c501699 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -680,7 +680,7 @@
     <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Desativar recursos bloq. de tela"</string>
     <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"Impede o uso de alguns recursos do bloqueio de tela."</string>
   <string-array name="phoneTypes">
-    <item msgid="8901098336658710359">"Residencial"</item>
+    <item msgid="8901098336658710359">"Casa"</item>
     <item msgid="869923650527136615">"Celular"</item>
     <item msgid="7897544654242874543">"Trabalho"</item>
     <item msgid="1103601433382158155">"Fax do trabalho"</item>
@@ -690,19 +690,19 @@
     <item msgid="9192514806975898961">"Personalizado"</item>
   </string-array>
   <string-array name="emailAddressTypes">
-    <item msgid="8073994352956129127">"Residencial"</item>
+    <item msgid="8073994352956129127">"Casa"</item>
     <item msgid="7084237356602625604">"Trabalho"</item>
     <item msgid="1112044410659011023">"Outros"</item>
     <item msgid="2374913952870110618">"Personalizado"</item>
   </string-array>
   <string-array name="postalAddressTypes">
-    <item msgid="6880257626740047286">"Residencial"</item>
+    <item msgid="6880257626740047286">"Casa"</item>
     <item msgid="5629153956045109251">"Trabalho"</item>
     <item msgid="4966604264500343469">"Outros"</item>
     <item msgid="4932682847595299369">"Personalizado"</item>
   </string-array>
   <string-array name="imAddressTypes">
-    <item msgid="1738585194601476694">"Residencial"</item>
+    <item msgid="1738585194601476694">"Casa"</item>
     <item msgid="1359644565647383708">"Trabalho"</item>
     <item msgid="7868549401053615677">"Outros"</item>
     <item msgid="3145118944639869809">"Personalizado"</item>
@@ -723,7 +723,7 @@
     <item msgid="1648797903785279353">"Jabber"</item>
   </string-array>
     <string name="phoneTypeCustom" msgid="1644738059053355820">"Personalizado"</string>
-    <string name="phoneTypeHome" msgid="2570923463033985887">"Residencial"</string>
+    <string name="phoneTypeHome" msgid="2570923463033985887">"Casa"</string>
     <string name="phoneTypeMobile" msgid="6501463557754751037">"Celular"</string>
     <string name="phoneTypeWork" msgid="8863939667059911633">"Comercial"</string>
     <string name="phoneTypeFaxWork" msgid="3517792160008890912">"Fax comercial"</string>
@@ -748,16 +748,16 @@
     <string name="eventTypeAnniversary" msgid="3876779744518284000">"Data comemorativa"</string>
     <string name="eventTypeOther" msgid="7388178939010143077">"Outros"</string>
     <string name="emailTypeCustom" msgid="8525960257804213846">"Personalizado"</string>
-    <string name="emailTypeHome" msgid="449227236140433919">"Residencial"</string>
+    <string name="emailTypeHome" msgid="449227236140433919">"Casa"</string>
     <string name="emailTypeWork" msgid="3548058059601149973">"Comercial"</string>
     <string name="emailTypeOther" msgid="2923008695272639549">"Outros"</string>
     <string name="emailTypeMobile" msgid="119919005321166205">"Celular"</string>
     <string name="postalTypeCustom" msgid="8903206903060479902">"Personalizado"</string>
-    <string name="postalTypeHome" msgid="8165756977184483097">"Residencial"</string>
+    <string name="postalTypeHome" msgid="8165756977184483097">"Casa"</string>
     <string name="postalTypeWork" msgid="5268172772387694495">"Comercial"</string>
     <string name="postalTypeOther" msgid="2726111966623584341">"Outros"</string>
     <string name="imTypeCustom" msgid="2074028755527826046">"Personalizado"</string>
-    <string name="imTypeHome" msgid="6241181032954263892">"Residencial"</string>
+    <string name="imTypeHome" msgid="6241181032954263892">"Casa"</string>
     <string name="imTypeWork" msgid="1371489290242433090">"Comercial"</string>
     <string name="imTypeOther" msgid="5377007495735915478">"Outros"</string>
     <string name="imProtocolCustom" msgid="6919453836618749992">"Personalizado"</string>
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toque para ver todas as redes"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectar"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Todas as redes"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Conectado à rede Wi-Fi sugerida por <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Permitir que o app <xliff:g id="NAME">%s</xliff:g> faça sugestões de rede?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Sim"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Não"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"O Wi‑Fi será ativado automaticamente"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"O Wi‑Fi não tem acesso à Internet"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Toque para ver opções"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Mudanças nas suas configurações de ponto de acesso"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Sua banda de ponto de acesso foi alterada."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Este dispositivo não é compatível com sua preferência apenas por 5 GHz. Em vez disso, o dispositivo usará a banda de 5 GHz quando ela estiver disponível."</string>
@@ -1342,8 +1346,16 @@
     <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Acessório de áudio analógico detectado"</string>
     <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"O dispositivo anexo não é compatível com esse smartphone. Toque para saber mais."</string>
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Depuração USB conectada"</string>
-    <string name="adb_active_notification_message" msgid="7463062450474107752">"Toque para desativar a depuração USB"</string>
+    <string name="adb_active_notification_message" msgid="7463062450474107752">"Toque para desativar a depuração USB."</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Selecione para desativar a depuração USB."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Gerando relatório do bug..."</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Compartilhar relatório do bug?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Compartilhando relatório do bug…"</string>
@@ -1454,8 +1466,8 @@
     <string name="no_file_chosen" msgid="6363648562170759465">"Nenhum arquivo escolhido"</string>
     <string name="reset" msgid="2448168080964209908">"Redefinir"</string>
     <string name="submit" msgid="1602335572089911941">"Enviar"</string>
-    <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"O app de direção está em execução"</string>
-    <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Toque para sair do app de direção."</string>
+    <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"O app para carro está sendo usado"</string>
+    <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Toque para sair do app para carro."</string>
     <string name="tethered_notification_title" msgid="3146694234398202601">"Vínculo ou ponto de acesso ativo"</string>
     <string name="tethered_notification_message" msgid="2113628520792055377">"Toque para configurar."</string>
     <string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering desativado"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 501d7cc..9a72d5c 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -1267,8 +1267,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Atingeți pentru a vedea toate rețelele"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectați-vă"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Toate rețelele"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Conectat la rețeaua Wi-Fi propusă de <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Permiteți aplicației <xliff:g id="NAME">%s</xliff:g> să vă sugereze rețele?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Da"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Nu"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi se va activa automat"</string>
@@ -1282,6 +1284,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Rețeaua Wi-Fi nu are acces la internet"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Atingeți pentru opțiuni"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Modificări aduse setărilor pentru hotspot"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"S-a schimbat banda de frecvență a hotspotului."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Dispozitivul nu acceptă doar preferința pentru 5 GHz. Dispozitivul va folosi banda de 5 GHz când este disponibilă."</string>
@@ -1366,6 +1370,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Remedierea erorilor prin USB este conectată"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Atingeți pentru a dezactiva remedierea erorilor prin USB."</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Selectați pentru a dezactiva remedierea erorilor prin USB."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Se creează un raport de eroare…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Trimiteți raportul de eroare?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Se trimite raportul de eroare…"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 8cb2d69..bbd5d20 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -1289,8 +1289,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Нажмите, чтобы увидеть список сетей"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Подключиться"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Все сети"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Установлено подключение к сети Wi‑Fi, найденной приложением \'<xliff:g id="NAME">%s</xliff:g>\'"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Разрешить приложению \'<xliff:g id="NAME">%s</xliff:g>\' предлагать вам сети?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Да"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Нет"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi включится автоматически"</string>
@@ -1304,6 +1306,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Сеть Wi-Fi не подключена к Интернету"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Нажмите, чтобы показать варианты."</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Изменения в настройках точки доступа"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Частота точки доступа изменена."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Устройство не может работать только на частоте 5 ГГц. Эта частота будет использоваться, когда это возможно."</string>
@@ -1388,6 +1392,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Отладка по USB разрешена"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Нажмите, чтобы отключить отладку по USB."</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Нажмите, чтобы отключить отладку по USB."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Подготовка отчета об ошибке"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Разрешить доступ к информации об ошибке?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Отправка отчета об ошибке"</string>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index 4163033..aac3052 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -1247,8 +1247,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"සියලු ජාල බැලීමට තට්ටු කරන්න"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"සම්බන්ධ කරන්න"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"සියලු ජාල"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"<xliff:g id="NAME">%s</xliff:g> විසින් යෝජිත Wi-Fi ජාලයට සම්බන්ධ වුණි"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"<xliff:g id="NAME">%s</xliff:g>ඔබට ඔබ සඳහා ජාල යෝජනා කිරීමට අවශ්‍යද?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"ඔව්"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"නැත"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi ස්වයංක්‍රියව ක්‍රියාත්මක වනු ඇත"</string>
@@ -1262,6 +1264,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi සඳහා අන්තර්ජාල ප්‍රවේශය නැත"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"විකල්ප සඳහා තට්ටු කරන්න"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"ඔබගේ හොට්ස්පොට් සැකසීම්වලට වෙනස් කිරීම්"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"ඔබගේ හොට්ස්පොට් කලාපය වෙනස් වී ඇත."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"මෙම උපාංගය 5GHz සඳහා ඔබේ මනාපවලට සහාය නොදක්වයි. ඒ වෙනුවට, මෙම උපාංගය ලබා ගත හැකි විට 5GHz කලාපය භාවිතා කරනු ඇත."</string>
@@ -1346,6 +1350,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB නිදොස්කරණය සම්බන්ධිතයි"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"USB නිදොස් කිරීම ක්‍රියාවිරහිත කිරීමට තට්ටු කරන්න"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB නිදොස්කරණය අබල කිරීමට තෝරන්න."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"දෝෂ වාර්තාවක් ගනිමින්…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"දෝෂ වාර්තාව බෙදා ගන්නද?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"දෝෂ වාර්තාවක් බෙදා ගනිමින්..."</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 8905d2a..5ecf2b8 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -1289,8 +1289,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Klepnutím zobrazíte všetky siete"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Pripojiť"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Všetky siete"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Pripojené k sieti Wi‑Fi navrhnutej používateľom <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Chcete umožniť používateľovi <xliff:g id="NAME">%s</xliff:g> navrhovať siete za vás?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Áno"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Nie"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi sa zapne automaticky"</string>
@@ -1304,6 +1306,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Sieť Wi‑Fi nemá prístup k internetu"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Klepnutím získate možnosti"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Zmeny nastavení hotspotu"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Pásmo vášho hotspotu sa zmenilo."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Toto zariadenie nepodporuje vašu predvoľbu používať iba 5 GHz. Namiesto toho bude pásmo 5 GHz používať vtedy, keď bude k dispozícii."</string>
@@ -1388,6 +1392,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Ladenie cez USB pripojené"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Klepnutím vypnite ladenie cez USB"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Vyberte, ak chcete zakázať ladenie cez USB."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Preberá sa hlásenie chyby…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Chcete zdieľať hlásenie chyby?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Zdieľa sa hlásenie chyby…"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 9c20748..ecd4e91 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -1289,8 +1289,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Dotaknite se, če si želite ogledati vsa omrežja"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Vzpostavi povezavo"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Vsa omrežja"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Vzpostavljena povezava z omrežjem Wi‑Fi na predlog aplikacije <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Ali želite aplikaciji <xliff:g id="NAME">%s</xliff:g> dovoliti predlaganje omrežij?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Da"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Ne"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Povezava Wi‑Fi se bo samodejno vklopila"</string>
@@ -1304,6 +1306,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Omrežje Wi-Fi nima dostopa do interneta"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Dotaknite se za možnosti"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Spremembe nastavitev dostopne točke"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Pas dostopne točke je spremenjen."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Ta naprava ne podpira prednostne nastavitve samo za 5-GHz pas. Namesto tega bo ta naprava uporabljala 5-GHz pas, ko bo na voljo."</string>
@@ -1388,6 +1392,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Iskanje napak prek USB je povezano"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Dotaknite se, če želite izklopiti odpravljanje napak prek USB-ja"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Izberite, če želite onemogočiti iskanje in odpravljanje napak prek vrat USB."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Zajemanje poročila o napakah …"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Želite poslati poročilo o napakah?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Pošiljanje poročila o napakah …"</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 222b1d2..54ae5de 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Trokit për të parë të gjitha rrjetet"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Lidhu"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Të gjitha rrjetet"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Lidhur me rrjetin Wi‑Fi të propozuar nga <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Dëshiron të lejosh që <xliff:g id="NAME">%s</xliff:g> të propozojë rrjetet për ty?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Po"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Jo"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi do të aktivizohet automatikisht"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi nuk ka qasje në internet"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Trokit për opsionet"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Ndryshimet në cilësimet e zonës së qasjes për internet"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Brezi yt i zonës së qasjes për internet ka ndryshuar."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Kjo pajisje nuk e mbështet preferencën për vetëm 5 GHz. Përkundrazi, pajisja do të përdorë brezin 5 GHz nëse ka."</string>
@@ -1345,6 +1349,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Korrigjuesi i USB-së i lidhur"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Trokit për të çaktivizuar korrigjimin e USB-së"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Përzgjidhe për të çaktivizuar korrigjimin e gabimeve të USB-së"</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Po merret raporti i defekteve në kod…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Të ndahet raporti i defektit në kod?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Po ndan raportin e defekteve në kod..."</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 58fde19..b1a1dc7 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -1267,8 +1267,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Додирните да бисте видели све мреже"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Повежи"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Све мреже"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Повезани сте са Wi‑Fi мрежом коју предлаже <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Желите ли да дозволите да вам <xliff:g id="NAME">%s</xliff:g> предлаже мреже?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Да"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Не"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi ће се аутоматски укључити"</string>
@@ -1282,6 +1284,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi нема приступ интернету"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Додирните за опције"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Промене подешавања за хотспот"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Опсег хотспота је промењен."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Овај уређај не подржава подешавање само за 5 GHz. Уређај ће користити опсег од 5 GHz када буде доступан."</string>
@@ -1366,6 +1370,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Отклањање грешака са USB-а је омогућено"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Додирните да бисте искључили отклањање грешака са USB-а"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Изаберите да бисте онемогућили отклањања грешака са USB-а."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Извештај о грешци се генерише…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Желите ли да поделите извештај о грешци?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Дели се извештај о грешци…"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 2412f64..e81aaa2 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tryck för att visa alla nätverk"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Anslut"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Alla nätverk"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Ansluten till Wi-Fi-nätverket som föreslogs i <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Vill du tillåta att <xliff:g id="NAME">%s</xliff:g> föreslår nätverk till dig?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Ja"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Nej"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi aktiveras automatiskt"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi-nätverket är inte anslutet till internet"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tryck för alternativ"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Ändringar i inställningarna för surfzon"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Frekvensbandet för surfzonen har ändrats."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Den här enheten har inte stöd för inställningen för att endast använda 5 GHz. I stället används 5 GHz när det är möjligt."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB-felsökning ansluten"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Tryck för att inaktivera USB-felsökning"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Välj för att inaktivera USB-felsökning."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Felrapporten överförs …"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Vill du dela felrapporten?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Felrapporten delas …"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 2e2904d..db4c26b 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Gusa ili uone mitandao yote"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Unganisha"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Mitandao yote"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Imeunganishwa na mtandao wa Wi‑Fi uliopendekezwa na <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Je, ungependa kuruhusu <xliff:g id="NAME">%s</xliff:g> akupendekezee mitandao?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Ndiyo"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Hapana"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi itawashwa kiotomatiki"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi haina muunganisho wa intaneti"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Gusa ili upate chaguo"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Mabadiliko kwenye mipangilio ya mtandao pepe"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Bendi ya mtandao pepe wako imebadilika."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Kifaa hiki hakitumii mapendeleo yako ya GHz 5 pekee. Badala yake, kifaa hiki kitatumia bendi ya GHz 5 itakapopatikana."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Utatuaji wa USB umeunganishwa"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Gusa ili uzime utatuzi wa USB"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Chagua ili kulemaza utatuaji USB."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Inatayarisha ripoti ya hitilafu…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Ungependa kushiriki ripoti ya hitilafu?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Inashiriki ripoti ya hitilafu…"</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index b3c2ebf..3b91cb0 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"எல்லா நெட்வொர்க்குகளையும் பார்க்க, தட்டவும்"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"இணை"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"எல்லா நெட்வொர்க்குகளும்"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"<xliff:g id="NAME">%s</xliff:g> இன் வைஃபை நெட்வொர்க்குடன் இணைக்கப்பட்டது"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"உங்களுக்கு நெட்வொர்க்குகளைக் காட்ட <xliff:g id="NAME">%s</xliff:g>ஐ அனுமதிக்கவா?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"சரி"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"வேண்டாம்"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"வைஃபை தானாக ஆன் ஆகும்"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"வைஃபையில் இண்டர்நெட் அணுகல் இல்லை"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"விருப்பங்களுக்கு, தட்டவும்"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"உங்கள் ஹாட்ஸ்பாட் அமைப்புகளில் செய்யப்பட்டுள்ள மாற்றங்கள்"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"உங்கள் ஹாட்ஸ்பாட்டின் அலைவரிசை மாறிவிட்டது."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"இந்தச் சாதனத்தில், ’5GHz மட்டும்’ எனும் முன்னுரிமைத் தேர்வு ஆதரிக்கப்படவில்லை. எனினும் 5GHz அலைவரிசை கிடைக்கும்போது, சாதனம் அதைப் பயன்படுத்திக்கொள்ளும்."</string>
@@ -1345,6 +1349,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB பிழைத் திருத்தம் இணைக்கப்பட்டது"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"USB பிழைத் திருத்தத்தை ஆஃப் செய்ய, தட்டவும்"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB பிழைத்திருத்தத்தை முடக்க, தேர்ந்தெடுக்கவும்."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"பிழை அறிக்கையை எடுக்கிறது…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"பிழை அறிக்கையைப் பகிரவா?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"பிழை அறிக்கையைப் பகிர்கிறது…"</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 5d8c0a8..6e9e607 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"అన్ని నెట్‌వర్క్‌లు చూడటానికి నొక్కండి"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"కనెక్ట్ చేయి"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"అన్ని నెట్‌వర్క్‌లు"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"<xliff:g id="NAME">%s</xliff:g> సూచన మేరకు Wi‑Fi నెట్‌వర్క్‌కు కనెక్ట్ చేయబడింది"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"మీరు <xliff:g id="NAME">%s</xliff:g> మీకోసం సూచించే నెట్‌వర్క్‌లకు అనుమతిస్తారా?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"అవును"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"లేదు"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi స్వయంచాలకంగా ఆన్ అవుతుంది"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fiకి ఇంటర్నెట్ యాక్సెస్ లేదు"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ఎంపికల కోసం నొక్కండి"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"మీ హాట్‌స్పాట్ సెట్టింగ్‌లకు మార్పులు"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"మీ హాట్‌స్పాట్ బ్యాండ్ మార్చబడింది."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"ఈ పరికరం 5GHz కోసం మాత్రమే మీ ప్రాధాన్యతకు మద్దతు ఇవ్వదు. బదులుగా, ఈ పరికరం అందుబాటులో ఉన్నప్పుడు 5GHz బ్యాండ్‌ను ఉపయోగిస్తుంది."</string>
@@ -1345,6 +1349,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB డీబగ్గింగ్ కనెక్ట్ చేయబడింది"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"USB డీబగ్గింగ్‌ను ఆఫ్ చేయడానికి నొక్కండి"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"డీబగ్గింగ్‌ని నిలిపివేయడానికి ఎంచుకోండి."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"బగ్ నివేదికను తీస్తోంది…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"బగ్ నివేదికను భాగస్వామ్యం చేయాలా?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"బగ్ నివేదికను భాగస్వామ్యం చేస్తోంది..."</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 427793a..ac84c9b 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"แตะเพื่อดูเครือข่ายทั้งหมด"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"เชื่อมต่อ"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"เครือข่ายทั้งหมด"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"เชื่อมต่ออยู่กับเครือข่าย Wi‑Fi ที่ <xliff:g id="NAME">%s</xliff:g> แนะนำ"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"ต้องการให้ <xliff:g id="NAME">%s</xliff:g> แนะนำเครือข่ายให้ไหม"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"ใช่"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"ไม่"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi จะเปิดโดยอัตโนมัติ"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi เชื่อมต่ออินเทอร์เน็ตไม่ได้"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"แตะเพื่อดูตัวเลือก"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"มีการเปลี่ยนแปลงการตั้งค่าฮอตสปอต"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"ย่านความถี่ฮอตสปอตมีการเปลี่ยนแปลง"</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"อุปกรณ์นี้ไม่รองรับค่ากำหนดของคุณเฉพาะสำหรับ 5 GHz เท่านั้น และจะใช้ย่านความถี่ 5 GHz แทน เมื่อใช้ได้"</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"เชื่อมต่อการแก้ไขข้อบกพร่องผ่าน USB แล้ว"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"แตะเพื่อปิดการแก้ไขข้อบกพร่อง USB"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"เลือกเพื่อปิดใช้งานการแก้ไขข้อบกพร่อง USB"</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"กำลังสร้างรายงานข้อบกพร่อง…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"แชร์รายงานข้อบกพร่องไหม"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"กำลังแชร์รายงานข้อบกพร่อง…"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index cd4818f6..df403f7 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"I-tap upang makita ang lahat ng network"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Kumonekta"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Lahat ng network"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Nakakonekta sa Wi‑Fi network na iminungkahi ng <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Gusto mo bang hayaan ang <xliff:g id="NAME">%s</xliff:g> na magmungkahi ng mga network para sa iyo?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Oo"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Hindi"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Awtomatikong mag-o-on ang Wi‑Fi"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Walang access sa internet ang Wi-Fi"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"I-tap para sa mga opsyon"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Mga pagbabago sa mga setting ng iyong hotspot"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Nagbago ang band ng iyong hotspot."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Hindi sinusuportahan ng device na ito ang kagustuhan mong gumamit lang ng 5GHz. Sa halip, gagamitin ng device na ito ang 5GHz na band kapag available."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Nakakonekta ang pag-debug ng USB"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"I-tap para i-off ang pag-debug ng USB"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Piliin upang i-disable ang debugging ng USB."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Kinukuha ang ulat ng bug…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Gusto mo bang ibahagi ang ulat ng bug?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Ibinabahagi ang ulat ng bug…"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 92d3ba6..bff115d 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tüm ağları görmek için dokunun"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Bağlan"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Tüm ağlar"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"<xliff:g id="NAME">%s</xliff:g> tarafından önerilen kablosuz ağa bağlanıldı"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"<xliff:g id="NAME">%s</xliff:g> uygulamasının sizin için ağ önerisinde bulunmasına izin vermek istiyor musunuz?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Evet"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Hayır"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Kablosuz özelliği otomatik olarak açılacak"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Kablosuz bağlantının internet erişimi yok"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Seçenekler için dokunun"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Hotspot ayarlarınız değişti"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Hotspot bandı değişti."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Bu cihaz yalnızca 5 GHz bandının kullanılmasına yönelik tercihinizi desteklemiyor. Bunun yerine, bu cihaz 5 GHz bandını mevcut olduğunda kullanacak."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB hata ayıklaması bağlandı"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"USB hata ayıklama işlevini kapatmak için dokunun"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB hata ayıklamasını devre dışı bırakmak için seçin."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Hata raporu alınıyor…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Hata raporu paylaşılsın mı?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Hata raporu paylaşılıyor..."</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 80927ae..b534466 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -1289,8 +1289,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Торкніться, щоб побачити всі мережі"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Під’єднатися"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Усі мережі"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Під’єднано до мережі Wi-Fi, яку запропонував додаток <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Дозволити додатку <xliff:g id="NAME">%s</xliff:g> пропонувати вам мережі?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Так"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Ні"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi вмикатиметься автоматично"</string>
@@ -1304,6 +1306,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Мережа Wi-Fi не має доступу до Інтернету"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Торкніться, щоб відкрити опції"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Зміни в налаштуваннях точки доступу"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Діапазон точки доступу змінено."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"На цьому пристрої не підтримується налаштування лише 5 ГГц. Замість цього буде використовуватися діапазон 5 ГГц, якщо доступно."</string>
@@ -1388,6 +1392,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Налагодження USB завершено"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Торкніться, щоб вимкнути налагоджувач USB"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Виберіть, щоб вимкнути налагодження за USB"</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Створюється повідомлення про помилку…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Надіслати звіт про помилку?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Надсилається звіт про помилку…"</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 9c99929..425c936 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"تمام نیٹ ورکس دیکھنے کیلئے تھپتھپائيں"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"منسلک کریں"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"سبھی نیٹ ورکس"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"‏<xliff:g id="NAME">%s</xliff:g> کے ذریعے تجویز کردہ Wi-Fi نیٹ ورک سے منسلک کر دیا گیا"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"کیا آپ <xliff:g id="NAME">%s</xliff:g> کو آپ کے لیے نیٹ ورکس تجویز کرنے کی اجازت دینا چاہتے ہیں؟"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"ہاں"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"نہیں"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"‏Wi‑Fi از خود آن ہو جائے گا"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"‏Wi-Fi کو انٹرنیٹ تک رسائی نہیں ہے"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"اختیارات کیلئے تھپتھپائیں"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"اپنے ہاٹ اسپاٹ کی ترتیبات میں تبدیلیاں"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"آپ کا ہاٹ اسپات بینڈ تبدیل ہو گیا۔"</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"‏یہ آلہ صرف 5GHz کے لئے آپ کی ترجیح کا تعاون نہیں کرے گا۔ بلکہ 5GHz بینڈ کے دستیاب ہونے پر اس کا استعمال کرے گا۔"</string>
@@ -1345,6 +1349,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"‏USB ڈیبگ کرنا مربوط ہو گیا"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"‏USB ڈیبگنگ آف کرنے کے لیے تھپتھپائیں"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"‏USB ڈیبگ کرنے کو غیر فعال کرنے کیلئے منتخب کریں۔"</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"بگ رپورٹ لی جا رہی ہے…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"بگ رپورٹ کا اشتراک کریں؟"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"بگ رپورٹ کا اشتراک ہو رہا ہے…"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 1b9982a..21bc853 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Barcha tarmoqlarni ko‘rish uchun bosing"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Ulanish"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Barcha tarmoqlar"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"<xliff:g id="NAME">%s</xliff:g> ilovasi topgan Wi-Fi tarmoqqa ulanildi"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"<xliff:g id="NAME">%s</xliff:g> ilovasi sizga tarmoq taklif etishi uchun unga ruxsat berilsinmi?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Ha"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Yoʻq"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi avtomatik ravishda yoqiladi"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi tarmoqda internet aloqasi yo‘q"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Variantlarni ko‘rsatish uchun bosing"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Hotspot sozlamalari o‘zgartirildi"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Hotspot chastotasi o‘zgartirildi."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Qurilma faqat 5 GGs chastotada ishlay olmaydi. Bu chastotadan imkoniyatga qarab foydalaniladi."</string>
@@ -1345,6 +1349,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB orqali nosozliklarni tuzatish"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"USB orqali nosozliklarni aniqlashni faolsizlantirish uchun bosing"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB orqali nosozliklarni tuzatishni o‘chirib qo‘yish uchun bosing."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Xatoliklar hisoboti olinmoqda…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Xatoliklar hisoboti yuborilsinmi?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Xatoliklar hisoboti yuborilmoqda…"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index ca283aa..dc2a788 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Nhấn để xem tất cả các mạng"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Kết nối"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Tất cả các mạng"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Đã kết nối với mạng Wi‑Fi do <xliff:g id="NAME">%s</xliff:g> đề xuất"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Bạn có muốn cho phép <xliff:g id="NAME">%s</xliff:g> đề xuất mạng cho bạn không?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Có"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Không"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi sẽ tự động bật"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi không có quyền truy cập Internet"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Nhấn để biết tùy chọn"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Những thay đổi trong mục cài đặt điểm phát sóng của bạn"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Bằng tần của điểm phát sóng đã thay đổi."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Thiết bị này không hỗ trợ tùy chọn chỉ sử dụng băng tần 5 GHz. Thay vào đó, thiết bị này sẽ sử dụng băng tần 5 GHz khi có thể."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Đã kết nối gỡ lỗi USB"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Nhấn để tắt tính năng gỡ lỗi USB"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Chọn để vô hiệu hóa gỡ lỗi USB."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Đang thu thập báo cáo lỗi…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Chia sẻ báo cáo lỗi?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Đang chia sẻ báo cáo lỗi…"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index c280ea8..4fc4bff 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"点按即可查看所有网络"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"连接"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"所有网络"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"已连接到<xliff:g id="NAME">%s</xliff:g>建议的 WLAN 网络"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"要让<xliff:g id="NAME">%s</xliff:g>为您建议网络吗?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"是"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"否"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"WLAN 将自动开启"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"此 WLAN 网络无法访问互联网"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"点按即可查看相关选项"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"您的热点设置已变更"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"您的热点频段已变更。"</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"此设备不支持您的偏好设置(仅限 5GHz),而且会在 5GHz 频段可用时使用该频段。"</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"已连接到 USB 调试"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"点按即可关闭 USB 调试"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"选择即可停用 USB 调试功能。"</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"正在生成错误报告…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"要分享错误报告吗?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"正在分享错误报告…"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index c2167b5..0db520d 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -420,11 +420,11 @@
     <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"接收額外的位置提供者指令"</string>
     <string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"允許應用程式存取額外的位置提供者指令。這項設定可能會使應用程式干擾 GPS 或其他位置來源的運作。"</string>
     <string name="permlab_accessFineLocation" msgid="6265109654698562427">"只在前景存取精確位置"</string>
-    <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"此應用程式只可在前台運行時獲取您的確實位置資訊。您的手機必須支援並啟用這些位置資訊服務,應用程式方可使用這項功能,但這樣做可能會增加耗電量。"</string>
+    <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"此應用程式只可在前台運行時獲取您的確實位置資訊。您的手機必須支援並啟用這些定位服務,應用程式方可使用這項功能,但這樣做可能會增加耗電量。"</string>
     <string name="permlab_accessCoarseLocation" msgid="3707180371693213469">"只可在前景存取大概位置 (根據網絡定位)"</string>
-    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="8594719010575779120">"此應用程式只能在前景中根據網絡來源 (例如手機訊號發射塔和 Wi-Fi 網絡) 獲取您的位置資訊。您必須在平板電腦上開啟這些位置資訊服務,才能讓此應用程式使用位置資訊。"</string>
-    <string name="permdesc_accessCoarseLocation" product="tv" msgid="3027871910200890806">"此應用程式只能在前景中根據網絡來源 (例如手機訊號發射塔和 Wi-Fi 網絡) 獲取您的位置資訊。您必須在電視上開啟這些位置資訊服務,才能讓此應用程式使用位置資訊。"</string>
-    <string name="permdesc_accessCoarseLocation" product="default" msgid="854896049371048754">"此應用程式只能在前景中根據網絡來源 (例如手機訊號發射塔和 Wi-Fi 網絡) 獲取您的位置資訊。您必須在手機上開啟這些位置資訊服務,才能讓此應用程式使用位置資訊。"</string>
+    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="8594719010575779120">"此應用程式只能在前景中根據網絡來源 (例如手機訊號發射塔和 Wi-Fi 網絡) 獲取您的位置資訊。您必須在平板電腦上開啟這些定位服務,才能讓此應用程式使用位置資訊。"</string>
+    <string name="permdesc_accessCoarseLocation" product="tv" msgid="3027871910200890806">"此應用程式只能在前景中根據網絡來源 (例如手機訊號發射塔和 Wi-Fi 網絡) 獲取您的位置資訊。您必須在電視上開啟這些定位服務,才能讓此應用程式使用位置資訊。"</string>
+    <string name="permdesc_accessCoarseLocation" product="default" msgid="854896049371048754">"此應用程式只能在前景中根據網絡來源 (例如手機訊號發射塔和 Wi-Fi 網絡) 獲取您的位置資訊。您必須在手機上開啟這些定位服務,才能讓此應用程式使用位置資訊。"</string>
     <string name="permlab_accessBackgroundLocation" msgid="3965397804300661062">"在背景存取位置資訊"</string>
     <string name="permdesc_accessBackgroundLocation" msgid="1096394429579210251">"如果您另外授予概略位置或精確位置的存取權,這個應用程式在背景運行時將可存取位置資訊。"</string>
     <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"更改音效設定"</string>
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"輕按即可查看所有網絡"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"連線"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"所有網絡"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"已連接至「<xliff:g id="NAME">%s</xliff:g>」建議的 Wi‑Fi 網絡"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"您希望「<xliff:g id="NAME">%s</xliff:g>」為您建議網絡嗎?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"是"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"否"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi 將會自動開啟"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi 並未連接互聯網"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"輕按即可查看選項"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"您的熱點設定變更"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"您的熱點頻段已變更。"</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"此裝置不支援只限 5 GHz 的偏好設定,但會在 5 GHz 頻段可用時採用。"</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"已連接 USB 偵錯工具"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"輕按即可關閉 USB 偵錯功能"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"選取即可停用 USB 偵錯。"</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"正在取得錯誤報告…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"要分享錯誤報告嗎?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"正在分享錯誤報告…"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 231a7e9..ea4f148 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"輕觸即可查看所有網路"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"連線"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"所有網路"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"已連上「<xliff:g id="NAME">%s</xliff:g>」建議使用的 Wi-Fi 網路"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"是否要允許「<xliff:g id="NAME">%s</xliff:g>」為你建議網路?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"是"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"否"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi 將自動開啟"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi 沒有網際網路連線"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"輕觸即可查看選項"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"無線基地台設定變更"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"你的無線基地台頻帶已變更。"</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"這個裝置不支援你的偏好設定 (僅限 5GHz),而是會在 5GHz 可用時使用該頻帶。"</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"已連接 USB 偵錯工具"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"輕觸即可關閉 USB 偵錯功能"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"選取這個選項以停用 USB 偵錯功能。"</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"正在接收錯誤報告…"</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"要分享錯誤報告嗎?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"正在分享錯誤報告…"</string>
@@ -1417,7 +1429,7 @@
     <string name="ime_action_go" msgid="8320845651737369027">"開始"</string>
     <string name="ime_action_search" msgid="658110271822807811">"搜尋"</string>
     <string name="ime_action_send" msgid="2316166556349314424">"傳送"</string>
-    <string name="ime_action_next" msgid="3138843904009813834">"下一頁"</string>
+    <string name="ime_action_next" msgid="3138843904009813834">"下一步"</string>
     <string name="ime_action_done" msgid="8971516117910934605">"完成"</string>
     <string name="ime_action_previous" msgid="1443550039250105948">"上一步"</string>
     <string name="ime_action_default" msgid="2840921885558045721">"執行"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 0f570b0..48f56f8 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -1245,8 +1245,10 @@
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Thepha ukuze ubone onke amanethiwekhi"</string>
     <string name="wifi_available_action_connect" msgid="2635699628459488788">"Xhuma"</string>
     <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Onke amanethiwekhi"</string>
-    <string name="wifi_suggestion_title" msgid="1524719325616630906">"Kuxhumeke kunethiwekhi ye-Wi‑Fi ephakanyiswe ngu-<xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="wifi_suggestion_content" msgid="4505530604935334589">"Ingabe ufuna ukuvumela i-<xliff:g id="NAME">%s</xliff:g> iphakamisa amanethiwkehi kuwe?"</string>
+    <!-- no translation found for wifi_suggestion_title (8951405130379148709) -->
+    <skip />
+    <!-- no translation found for wifi_suggestion_content (2658317015552324848) -->
+    <skip />
     <string name="wifi_suggestion_action_allow_app" msgid="3689946344485394085">"Yebo"</string>
     <string name="wifi_suggestion_action_disallow_app" msgid="7977918905605931385">"Cha"</string>
     <string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"I-Wi-Fi izovuleka ngokuzenzakalela"</string>
@@ -1260,6 +1262,8 @@
     <skip />
     <string name="wifi_no_internet" msgid="8938267198124654938">"I-Wi-Fi ayinakho ukufinyelela kwe-inthanethi"</string>
     <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Thepha ukuze uthole izinketho"</string>
+    <!-- no translation found for captive_portal_logged_in_detailed (8489345381637456021) -->
+    <skip />
     <string name="wifi_softap_config_change" msgid="8475911871165857607">"Ushintsho kuzilungiselelo zakho ze-hotspot"</string>
     <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Ibhendi yakho ye-hotspot ishintshile."</string>
     <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Le divayisi ayisekeli okuncamelayo kwe-5GHz kuphela. Kunalokho, le divayisi izosebenzisa ibhendi ye-5GHz uma itholakala."</string>
@@ -1344,6 +1348,14 @@
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Ukulungisa iphutha le-USB kuxhunyiwe"</string>
     <string name="adb_active_notification_message" msgid="7463062450474107752">"Thepha ukuze uvale ukulungisa amaphutha kwe-USB"</string>
     <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Khetha ukuvimbela ukulungisa iphutha le-USB."</string>
+    <!-- no translation found for usb_contaminant_detected_title (7136400633704058349) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_detected_message (832337061059487250) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_title (4202417484434906086) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_not_detected_message (2415791798244545292) -->
+    <skip />
     <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Ithatha umbiko wesiphazamisi..."</string>
     <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Yabelana ngombiko wesiphazamisi?"</string>
     <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Yabelana ngombiko wesiphazamisi..."</string>
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index de6468d..759fc12 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -277,6 +277,12 @@
         <!-- Additional flag from base permission type: this permission automatically
             granted to device configurator -->
         <flag name="configurator" value="0x80000" />
+        <!-- Additional flag from base permission type: this permission designates the app
+            that will approve the sharing of incident reports. -->
+        <flag name="incidentReportApprover" value="0x100000" />
+        <!-- Additional flag from base permission type: this permission can be automatically
+            granted to the system app predictor -->
+        <flag name="appPredictor" value="0x200000" />
     </attr>
 
     <!-- Flags indicating more context for a permission group. -->
@@ -1113,6 +1119,15 @@
          -->
     <attr name="classLoader" format="string" />
 
+    <!-- Name of the class that gets invoked for preloading application code, when starting an
+         {@link android.R.attr#isolatedProcess} service that has
+         {@link android.R.attr#useAppZygote} set to <code>true</code>. This is a fully
+         qualified class name (for example, com.mycompany.myapp.MyZygotePreload); as a
+         short-hand if the first character of the class is a period then it is appended
+         to your package name. The class must implement the {@link android.app.ZygotePreload}
+         interface. -->
+    <attr name="zygotePreloadName" format="string"/>
+
     <!-- If set to <code>true</code>, indicates to the platform that this APK is
          a 'feature' split and that it implicitly depends on the base APK. This distinguishes
          this split APK from a 'configuration' split, which provides resource overrides
@@ -1126,10 +1141,12 @@
          resource] to be present in order to function. Default value is false. -->
     <attr name="isSplitRequired" format="boolean" />
 
-    <!-- Flag to specify if this app prioritizes code integrity. The system may choose
-         to run with better integrity guarantee in various components if possible based on the app's
-         <code>targetSdkVersion</code>. -->
-    <attr name="preferCodeIntegrity" format="boolean" />
+    <!-- Flag to specify if this app wants to run the dex within its APK but not extracted or
+         locally compiled variants. This keeps the dex code protected by the APK signature. Such
+         apps will always run in JIT mode (same when they are first installed), and the system will
+         never generate ahead-of-time compiled code for them. Depending on the app's workload,
+         there may be some run time performance change, noteably the cold start time. -->
+    <attr name="useEmbeddedDex" format="boolean" />
 
     <!-- Extra options for an activity's UI. Applies to either the {@code <activity>} or
          {@code <application>} tag. If specified on the {@code <application>}
@@ -1433,26 +1450,20 @@
 
     <attr name="usesNonSdkApi" format="boolean" />
 
-    <!-- Specify the type of foreground service. Apps targeting API
-     {@link android.os.Build.VERSION_CODES#Q} or later must specify foreground service type,
-     otherwise a SecurityException is thrown when
-     {@link android.app.Service#startForeground(int, Notification)} on this service is called.
-    -->
+    <!-- Specify the type of foreground service. Multiple types can be specified by ORing the flags
+         together. -->
     <attr name="foregroundServiceType">
         <!-- Data (photo, file, account) upload/download, backup/restore, import/export, fetch,
         transfer over network between device and cloud.  -->
-        <enum name="sync" value="1" />
+        <flag name="dataSync" value="0x01" />
         <!-- Music, video, news or other media play. -->
-        <enum name="mediaPlay" value="2" />
+        <flag name="mediaPlayback" value="0x02" />
         <!-- Ongoing phone call or video conference. -->
-        <enum name="phoneCall" value="3" />
+        <flag name="phoneCall" value="0x04" />
         <!-- GPS, map, navigation location update. -->
-        <enum name="location" value="4" />
+        <flag name="location" value="0x08" />
         <!-- Auto, bluetooth, TV or other devices connection, monitoring and interaction. -->
-        <enum name="deviceCompanion" value="5" />
-        <!-- Process that should not be interrupted, including installation, setup, photo
-        compression etc. -->
-        <enum name="ongoingProcess" value="6" />
+        <flag name="connectedDevice" value="0x10" />
     </attr>
 
 
@@ -1599,7 +1610,7 @@
              to honor this flag as well. -->
         <attr name="usesCleartextTraffic" />
         <attr name="multiArch" />
-        <attr name="preferCodeIntegrity" />
+        <attr name="useEmbeddedDex" />
         <attr name="extractNativeLibs" />
         <attr name="defaultToDeviceProtectedStorage" format="boolean" />
         <attr name="directBootAware" />
@@ -1641,6 +1652,7 @@
         <!-- If {@code true} the user is prompted to keep the app's data on uninstall -->
         <attr name="hasFragileUserData" />
 
+	<attr name="zygotePreloadName" />
     </declare-styleable>
     <!-- The <code>permission</code> tag declares a security permission that can be
          used to control access from other packages to specific components or
@@ -2297,17 +2309,18 @@
         <!-- If true, and this is an {@link android.R.attr#isolatedProcess} service, the service
              will be spawned from an Application Zygote, instead of the regular Zygote.
              <p>
-             The Application Zygote will pre-initialize the application's class loader,
-             and call a static callback into the application to allow it to perform
+             The Application Zygote will first pre-initialize the application's class loader. Then,
+             if the application has defined the {@link android.R.attr#zygotePreloadName} attribute,
+             the Application Zygote will call into that class to allow it to perform
              application-specific preloads (such as loading a shared library). Therefore,
              spawning from the Application Zygote will typically reduce the service
              launch time and reduce its memory usage. The downside of using this flag
              is that you will have an additional process (the app zygote itself) that
              is taking up memory. Whether actual memory usage is improved therefore strongly
              depends on the number of isolated services that an application starts,
-             and how much memory those services save by preloading. Therefore, it is
-             recommended to measure memory usage under typical workloads to determine
-             whether it makes sense to use this flag. -->
+             and how much memory those services save by preloading and sharing memory with
+             the app zygote. Therefore, it is recommended to measure memory usage under
+             typical workloads to determine whether it makes sense to use this flag. -->
         <attr name="useAppZygote" format="boolean" />
         <!-- If this is a foreground service, specify its category. -->
         <attr name="foregroundServiceType" />
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index c05795d..df20f85 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -712,6 +712,9 @@
     <!-- Indicates that connected MAC randomization is supported on this device -->
     <bool translatable="false" name="config_wifi_connected_mac_randomization_supported">false</bool>
 
+    <!-- Indicates that wifi link probing is supported on this device -->
+    <bool translatable="false" name="config_wifi_link_probing_supported">false</bool>
+
     <!-- Flag indicating whether we should enable the automatic brightness.
          Software implementation will be used if config_hardware_auto_brightness_available is not set -->
     <bool name="config_automatic_brightness_available">false</bool>
@@ -861,6 +864,11 @@
          The default is false. -->
     <bool name="config_lidControlsSleep">false</bool>
 
+    <!-- Indicate whether closing the lid causes the device to enter the folded state which means
+         to get a smaller screen and opening the lid causes the device to enter the unfolded state
+         which means to get a larger screen. -->
+    <bool name="config_lidControlsDisplayFold">false</bool>
+
     <!-- Desk dock behavior -->
 
     <!-- The number of degrees to rotate the display when the device is in a desk dock.
@@ -1017,7 +1025,8 @@
     <integer name="config_displayWhiteBalanceColorTemperatureDefault">6500</integer>
 
     <!-- The display primaries, in CIE1931 XYZ color space, for display
-         white balance to use in its calculations. -->
+         white balance to use in its calculations. The array must include a total of 12 float
+         values: 3 values per color (X, Y, Z) and 4 colors (R, G, B, W) -->
     <string-array name="config_displayWhiteBalanceDisplayPrimaries">
         <!-- Red X -->   <item>0.412315</item>
         <!-- Red Y -->   <item>0.212600</item>
@@ -1035,7 +1044,7 @@
 
     <!-- The nominal white coordinates, in CIE1931 XYZ color space, for Display White Balance to
          use in its calculations. AWB will adapt this white point to the target ambient white
-         point. -->
+         point. The array must include a total of 3 float values (X, Y, Z) -->
     <string-array name="config_displayWhiteBalanceDisplayNominalWhite">
         <!-- Nominal White X --> <item>0.950456</item>
         <!-- Nominal White Y --> <item>1.000000</item>
@@ -3488,6 +3497,13 @@
     -->
     <string name="config_defaultAttentionService" translatable="false"></string>
 
+    <!-- The package name for the incident report approver app.
+        This app is usually PermissionController or an app that replaces it.  When
+        a bugreport or incident report with EXPLICT-level sharing flags is going to be
+        shared, this app will be sent the PENDING_INCIDENT_REPORTS_CHANGED broadcast.
+    -->
+    <string name="config_incidentReportApproverPackage" translatable="false">com.android.permissioncontroller</string>
+
     <!-- The package name for the system's content capture service.
          This service must be trusted, as it can be activated without explicit consent of the user.
          If no service with the specified name exists on the device, content capture will be
@@ -3766,4 +3782,105 @@
 
     <!-- Whether or not aware is enabled by default -->
     <bool name="config_awareSettingAvailable">false</bool>
+
+    <!-- Display White-Balance -->
+
+    <!-- See AmbientSensor.AmbientBrightnessSensor.
+         The ambient brightness sensor rate (in milliseconds). Must be positive. -->
+    <integer name="config_displayWhiteBalanceBrightnessSensorRate">250</integer>
+
+    <!-- See AmbientFilter.
+         How long ambient brightness changes are kept and taken into consideration
+         (in milliseconds). Must be positive. -->
+    <integer name="config_displayWhiteBalanceBrightnessFilterHorizon">10000</integer>
+
+    <!-- See AmbientFilter.WeightedMovingAverageAmbientFilter.
+         Recent changes are prioritised by integrating their duration over y = x + intercept
+         (the higher it is, the less prioritised recent changes are). Must be a non-negative
+         number, or NaN to avoid this implementation. -->
+    <item name="config_displayWhiteBalanceBrightnessFilterIntercept" format="float" type="dimen">10.0</item>
+
+    <!-- See AmbientSensor.AmbientColorTemperatureSensor.
+         The ambient color temperature sensor name. -->
+    <string name="config_displayWhiteBalanceColorTemperatureSensorName">com.google.sensor.color</string>
+
+    <!-- See AmbientSensor.AmbientColorTemperatureSensor.
+         The ambient color temperature sensor rate (in milliseconds). Must be positive. -->
+    <integer name="config_displayWhiteBalanceColorTemperatureSensorRate">250</integer>
+
+    <!-- See AmbientFilter.
+         How long ambient color temperature changes are kept and taken into consideration
+         (in milliseconds). Must be positive. -->
+    <integer name="config_displayWhiteBalanceColorTemperatureFilterHorizon">10000</integer>
+
+    <!-- See AmbientFilter.WeightedMovingAverageAmbientFilter.
+         Recent changes are prioritised by integrating their duration over y = x + intercept
+         (the higher it is, the less prioritised recent changes are). Must be a non-negative
+         number, or NaN to avoid this implementation. -->
+    <item name="config_displayWhiteBalanceColorTemperatureFilterIntercept" format="float"
+            type="dimen">10.0</item>
+
+    <!-- See DisplayWhiteBalanceThrottler.
+         The debounce time (in milliseconds) for increasing the screen color temperature, throttled
+         if time > lastTime + debounce. Must be non-negative. -->
+    <integer name="config_displayWhiteBalanceIncreaseDebounce">5000</integer>
+
+    <!-- See DisplayWhiteBalanceThrottler.
+         The debounce time (in milliseconds) for decreasing the screen color tempearture, throttled
+         if time < lastTime - debounce. Must be non-negative. -->
+    <integer name="config_displayWhiteBalanceDecreaseDebounce">5000</integer>
+
+    <!-- See DisplayWhiteBalanceThrottler.
+         The ambient color temperature values used to determine the threshold as the corresponding
+         value in config_displayWhiteBalance{Increase,Decrease}Threholds. Must be non-empty, the
+         same length as config_displayWhiteBalance{Increase,Decrease}Thresholds, and contain
+         non-negative, strictly increasing numbers.
+
+         For example, if:
+
+         - baseThresolds = [0, 100, 1000];
+         - increaseThresholds = [0.1, 0.15, 0.2];
+         - decreaseThresholds = [0.1, 0.05, 0.0];
+
+         Then, given the ambient color temperature INCREASED from X to Y (so X < Y):
+         - If 0 <= Y < 100, we require Y > (1 + 0.1) * X = 1.1X;
+         - If 100 <= Y < 1000, we require Y > (1 + 0.15) * X = 1.15X;
+         - If 1000 <= Y, we require Y > (1 + 0.2) * X = 1.2X.
+
+         Or, if the ambient color temperature DECREASED from X to Y (so X > Y):
+         - If 0 <= Y < 100, we require Y < (1 - 0.1) * X = 0.9X;
+         - If 100 <= Y < 1000, we require Y < (1 - 0.05) * X = 0.95X;
+         - If 1000 <= Y, we require Y < (1 - 0) * X = X.
+
+         NOTE: the numbers in this example are made up, and don't represent how actual base,
+               increase or decrease thresholds would look like. -->
+    <array name="config_displayWhiteBalanceBaseThresholds">
+        <item>0.0</item>
+    </array>
+
+    <!-- See DisplayWhiteBalanceThrottler.
+         The increase threshold values, throttled if value < value * (1 + threshold). Must be
+         non-empty, the same length as config_displayWhiteBalanceBaseThresholds, and contain
+         non-negative numbers. -->
+    <array name="config_displayWhiteBalanceIncreaseThresholds">
+        <item>0.1</item>
+    </array>
+
+    <!-- See DisplayWhiteBalanceThrottler.
+         The decrease threshold values, throttled if value > value * (1 - threshold). Must be
+         non-empty, the same length as config_displayWhiteBalanceBaseThresholds, and contain
+         non-negative numbers. -->
+    <array name="config_displayWhiteBalanceDecreaseThresholds">
+        <item>0.1</item>
+    </array>
+
+    <!-- See DisplayWhiteBalanceController.
+         The ambient brightness threshold (in lux) beneath which we fall back to a fixed ambient
+         color temperature. -->
+    <item name="config_displayWhiteBalanceLowLightAmbientBrightnessThreshold" format="float" type="dimen">10.0</item>
+
+    <!-- See DisplayWhiteBalanceController.
+         The ambient color temperature (in cct) to which we fall back when the ambient brightness
+         drops beneath a certain threshold. -->
+    <item name="config_displayWhiteBalanceLowLightAmbientColorTemperature" format="float" type="dimen">6500.0</item>
 </resources>
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index c870683..38367fb 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -240,7 +240,7 @@
     <dimen name="notification_header_icon_size">18dp</dimen>
 
     <!-- size (width and height) of the icon in the notification header -->
-    <dimen name="notification_header_icon_size_ambient">20dp</dimen>
+    <dimen name="notification_header_icon_size_ambient">18dp</dimen>
 
     <!-- The margin before the start of the app name in the header. -->
     <dimen name="notification_header_app_name_margin_start">3dp</dimen>
@@ -714,4 +714,10 @@
     <dimen name="harmful_app_message_padding_bottom">24dp</dimen>
     <!-- Line spacing modifier for the message field of the harmful app dialog -->
     <item name="harmful_app_message_line_spacing_modifier" type="dimen">1.22</item>
+
+    <!-- chooser (sharesheet) spacing -->
+    <dimen name="chooser_corner_radius">8dp</dimen>
+    <dimen name="chooser_view_spacing">18dp</dimen>
+    <dimen name="chooser_edge_margin_thin">16dp</dimen>
+    <dimen name="chooser_edge_margin_normal">24dp</dimen>
 </resources>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index ec1bac1..e7d8102 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2936,6 +2936,8 @@
         <public name="minAspectRatio" />
         <!-- @hide @SystemApi -->
         <public name="inheritShowWhenLocked" />
+        <public name="zygotePreloadName" />
+        <public name="useEmbeddedDex" />
     </public-group>
 
     <public-group type="drawable" first-id="0x010800b4">
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index a761baf..fadb28f 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -2645,6 +2645,9 @@
     <!-- Displayed to the user to confirm that they have copied text from a web page to the clipboard. -->
     <string name="text_copied">Text copied to clipboard.</string>
 
+    <!-- Displayed to the user to confirm that they have copied text/images to the clipboard [CHAR LIMIT=NONE] -->
+    <string name="copied">Copied</string>
+
     <!-- Menu item displayed at the end of a menu to allow users to see another page worth of menu items. This is shown on any app's menu as long as the app has too many items in the menu.-->
     <string name="more_item_label">More</string>
     <!-- Prepended to the shortcut for a menu item to indicate that the user should hold the MENU button together with the shortcut to invoke the item. For example, if the shortcut to open a new tab in browser is MENU and B together, then this would be prepended to the letter "B" -->
@@ -3082,7 +3085,7 @@
     <!-- Label for a link to a intent resolver dialog when selecting an editor application -->
     <string name="whichEditApplicationLabel">Edit</string>
     <!-- Title of intent resolver dialog when selecting a sharing application to run. -->
-    <string name="whichSendApplication">Share with</string>
+    <string name="whichSendApplication">Share</string>
     <!-- Title of intent resolver dialog when selecting a sharing application to run
          and a previously used application is known. -->
     <string name="whichSendApplicationNamed">Share with %1$s</string>
@@ -3692,6 +3695,9 @@
     <!-- Notification action to browse external media [CHAR LIMIT=20] -->
     <string name="ext_media_browse_action">Explore</string>
 
+    <!-- Notification action to transfer media [CHAR LIMIT=40] -->
+    <string name="ext_media_seamless_action">Seamless transfer</string>
+
     <!-- Notification title when external media is missing [CHAR LIMIT=30] -->
     <string name="ext_media_missing_title"><xliff:g id="name" example="SD card">%s</xliff:g> missing</string>
     <!-- Notification body when external media is missing [CHAR LIMIT=30] -->
diff --git a/core/res/res/values/styles_device_defaults.xml b/core/res/res/values/styles_device_defaults.xml
index 79afe69..0dc54e0 100644
--- a/core/res/res/values/styles_device_defaults.xml
+++ b/core/res/res/values/styles_device_defaults.xml
@@ -374,7 +374,9 @@
     <style name="TextAppearance.DeviceDefault.Caption" parent="TextAppearance.Material.Caption">
         <item name="fontFamily">@string/config_bodyFontFamily</item>
     </style>
-    <style name="TextAppearance.DeviceDefault.ListItem" parent="TextAppearance.DeviceDefault.Subhead"/>
+    <style name="TextAppearance.DeviceDefault.ListItem" parent="TextAppearance.DeviceDefault.Subhead">
+        <item name="fontFamily">@string/config_headlineFontFamily</item>
+    </style>
     <style name="TextAppearance.DeviceDefault.ListItemSecondary" parent="TextAppearance.DeviceDefault.Body1"/>
 
     <!-- Preference Styles -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index f79e22d..c909873 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -50,6 +50,13 @@
   <java-symbol type="id" name="characterPicker" />
   <java-symbol type="id" name="clearDefaultHint" />
   <java-symbol type="id" name="contentPanel" />
+  <java-symbol type="id" name="content_preview" />
+  <java-symbol type="id" name="content_preview_thumbnail" />
+  <java-symbol type="id" name="content_preview_text" />
+  <java-symbol type="id" name="content_preview_text_layout" />
+  <java-symbol type="id" name="content_preview_title" />
+  <java-symbol type="id" name="content_preview_title_layout" />
+  <java-symbol type="id" name="copy_button" />
   <java-symbol type="id" name="current_scene" />
   <java-symbol type="id" name="scene_layoutid_cache" />
   <java-symbol type="id" name="customPanel" />
@@ -187,6 +194,7 @@
   <java-symbol type="id" name="action2" />
   <java-symbol type="id" name="action3" />
   <java-symbol type="id" name="action4" />
+  <java-symbol type="id" name="media_seamless" />
   <java-symbol type="id" name="big_picture" />
   <java-symbol type="id" name="big_text" />
   <java-symbol type="id" name="chronometer" />
@@ -540,6 +548,7 @@
   <java-symbol type="string" name="activity_resolver_work_profiles_support" />
   <java-symbol type="string" name="app_running_notification_title" />
   <java-symbol type="string" name="app_running_notification_text" />
+  <java-symbol type="string" name="copied" />
   <java-symbol type="string" name="delete" />
   <java-symbol type="string" name="deleteText" />
   <java-symbol type="string" name="grant_permissions_header_text" />
@@ -1349,6 +1358,9 @@
   <java-symbol type="drawable" name="ic_text_dot" />
   <java-symbol type="drawable" name="ic_print" />
   <java-symbol type="drawable" name="ic_print_error" />
+  <java-symbol type="drawable" name="ic_lock_24dp" />
+  <java-symbol type="drawable" name="ic_lock_open_24dp" />
+  <java-symbol type="drawable" name="ic_auth_error" />
   <java-symbol type="drawable" name="jog_dial_arrow_long_left_green" />
   <java-symbol type="drawable" name="jog_dial_arrow_long_right_red" />
   <java-symbol type="drawable" name="jog_dial_arrow_short_left_and_right" />
@@ -1423,6 +1435,27 @@
   <java-symbol type="drawable" name="ic_sim_card_multi_48px_clr" />
   <java-symbol type="drawable" name="ic_signal_cellular_alt_24px" />
 
+  <java-symbol type="drawable" name="btn_borderless_rect" />
+  <java-symbol type="drawable" name="ic_phone" />
+  <java-symbol type="drawable" name="ic_bt_headphones_a2dp" />
+  <java-symbol type="drawable" name="ic_bt_headset_hfp" />
+  <java-symbol type="drawable" name="ic_bt_hearing_aid" />
+  <java-symbol type="drawable" name="ic_bt_laptop" />
+  <java-symbol type="drawable" name="ic_bt_misc_hid" />
+  <java-symbol type="drawable" name="ic_bt_network_pan" />
+  <java-symbol type="drawable" name="ic_bt_pointing_hid" />
+  <java-symbol type="drawable" name="ic_expand_more" />
+  <java-symbol type="drawable" name="ic_lockscreen_ime" />
+  <java-symbol type="drawable" name="ic_menu" />
+  <java-symbol type="drawable" name="ic_minus" />
+  <java-symbol type="drawable" name="ic_mode_edit" />
+  <java-symbol type="drawable" name="ic_plus" />
+  <java-symbol type="drawable" name="ic_qs_night_display_on" />
+  <java-symbol type="drawable" name="ic_settings_bluetooth" />
+  <java-symbol type="drawable" name="ic_settings_print" />
+  <java-symbol type="drawable" name="ic_signal_location" />
+  <java-symbol type="drawable" name="ic_info_outline_24" />
+
   <java-symbol type="drawable" name="stat_notify_mmcc_indication_icn" />
   <java-symbol type="drawable" name="autofilled_highlight"/>
   <java-symbol type="drawable" name="ic_camera" />
@@ -1885,6 +1918,7 @@
   <java-symbol type="bool" name="config_wifi_convert_apband_5ghz_to_any" />
   <java-symbol type="bool" name="config_wifi_local_only_hotspot_5ghz" />
   <java-symbol type="bool" name="config_wifi_connected_mac_randomization_supported" />
+  <java-symbol type="bool" name="config_wifi_link_probing_supported" />
   <java-symbol type="bool" name="config_wifi_fast_bss_transition_enabled" />
   <java-symbol type="bool" name="config_wimaxEnabled" />
   <java-symbol type="bool" name="show_ongoing_ime_switcher" />
@@ -2188,6 +2222,10 @@
   <java-symbol type="anim" name="lock_screen_wallpaper_exit" />
   <java-symbol type="anim" name="launch_task_behind_source" />
   <java-symbol type="anim" name="wallpaper_open_exit" />
+  <java-symbol type="anim" name="lock_to_error" />
+  <java-symbol type="anim" name="lock_lock" />
+  <java-symbol type="anim" name="lock_unlock" />
+  <java-symbol type="anim" name="lock_in" />
 
   <java-symbol type="bool" name="config_alwaysUseCdmaRssi" />
   <java-symbol type="dimen" name="status_bar_icon_size" />
@@ -2211,6 +2249,7 @@
   <java-symbol type="string" name="ext_media_init_action" />
   <java-symbol type="string" name="ext_media_unmount_action" />
   <java-symbol type="string" name="ext_media_browse_action" />
+  <java-symbol type="string" name="ext_media_seamless_action" />
   <java-symbol type="string" name="ext_media_missing_title" />
   <java-symbol type="string" name="ext_media_missing_message" />
   <java-symbol type="string" name="ext_media_move_specific_title" />
@@ -2682,9 +2721,12 @@
   <java-symbol type="layout" name="date_picker_month_item_material" />
   <java-symbol type="id" name="month_view" />
   <java-symbol type="integer" name="config_zen_repeat_callers_threshold" />
+  <java-symbol type="dimen" name="chooser_corner_radius" />
+  <java-symbol type="dimen" name="chooser_view_spacing" />
+  <java-symbol type="dimen" name="chooser_edge_margin_thin" />
+  <java-symbol type="dimen" name="chooser_edge_margin_normal" />
   <java-symbol type="layout" name="chooser_grid" />
   <java-symbol type="layout" name="resolve_grid_item" />
-  <java-symbol type="id" name="title_icon" />
   <java-symbol type="id" name="day_picker_view_pager" />
   <java-symbol type="layout" name="day_picker_content_material" />
   <java-symbol type="drawable" name="scroll_indicator_material" />
@@ -3072,6 +3114,7 @@
   <java-symbol type="drawable" name="ic_restart" />
   <java-symbol type="drawable" name="ic_screenshot" />
   <java-symbol type="drawable" name="ic_faster_emergency" />
+  <java-symbol type="drawable" name="ic_media_seamless" />
   <java-symbol type="drawable" name="emergency_icon" />
 
   <java-symbol type="array" name="config_convert_to_emergency_number_map" />
@@ -3494,6 +3537,7 @@
   <java-symbol type="layout" name="car_user_switching_dialog" />
   <java-symbol type="id" name="user_loading_avatar" />
   <java-symbol type="id" name="user_loading" />
+  <java-symbol type="style" name="Theme.DeviceDefault.Light.Dialog.Alert.UserSwitchingDialog" />
 
   <java-symbol type="string" name="battery_saver_description_with_learn_more" />
 
@@ -3511,6 +3555,7 @@
   <java-symbol type="integer" name="config_defaultRingVibrationIntensity" />
 
   <java-symbol type="bool" name="config_maskMainBuiltInDisplayCutout" />
+  <java-symbol type="bool" name="config_lidControlsDisplayFold" />
 
   <java-symbol type="array" name="config_disableApksUnlessMatchedSku_apk_list" />
   <java-symbol type="array" name="config_disableApkUnlessMatchedSku_skus_list" />
@@ -3558,4 +3603,22 @@
   <!-- For Attention Service -->
   <java-symbol type="integer" name="config_attentionMaximumExtension" />
   <java-symbol type="integer" name="config_attentionApiTimeout" />
+
+  <java-symbol type="string" name="config_incidentReportApproverPackage" />
+
+  <!-- Display White-Balance -->
+  <java-symbol type="integer" name="config_displayWhiteBalanceBrightnessSensorRate" />
+  <java-symbol type="integer" name="config_displayWhiteBalanceBrightnessFilterHorizon" />
+  <java-symbol type="dimen" name="config_displayWhiteBalanceBrightnessFilterIntercept" />
+  <java-symbol type="string" name="config_displayWhiteBalanceColorTemperatureSensorName" />
+  <java-symbol type="integer" name="config_displayWhiteBalanceColorTemperatureSensorRate" />
+  <java-symbol type="integer" name="config_displayWhiteBalanceColorTemperatureFilterHorizon" />
+  <java-symbol type="dimen" name="config_displayWhiteBalanceColorTemperatureFilterIntercept" />
+  <java-symbol type="integer" name="config_displayWhiteBalanceIncreaseDebounce" />
+  <java-symbol type="integer" name="config_displayWhiteBalanceDecreaseDebounce" />
+  <java-symbol type="array" name="config_displayWhiteBalanceBaseThresholds" />
+  <java-symbol type="array" name="config_displayWhiteBalanceIncreaseThresholds" />
+  <java-symbol type="array" name="config_displayWhiteBalanceDecreaseThresholds" />
+  <java-symbol type="dimen" name="config_displayWhiteBalanceLowLightAmbientBrightnessThreshold" />
+  <java-symbol type="dimen" name="config_displayWhiteBalanceLowLightAmbientColorTemperature" />
 </resources>
diff --git a/core/tests/coretests/Android.mk b/core/tests/coretests/Android.mk
index 9d04e63..6a81050 100644
--- a/core/tests/coretests/Android.mk
+++ b/core/tests/coretests/Android.mk
@@ -37,7 +37,9 @@
     mockwebserver \
     guava \
     androidx.test.runner \
+    androidx.test.ext.junit \
     androidx.test.rules \
+    androidx.test.espresso.core \
     mockito-target-minus-junit4 \
     espresso-core \
     ub-uiautomator \
diff --git a/core/tests/coretests/AndroidManifest.xml b/core/tests/coretests/AndroidManifest.xml
index 86818c6..1764249 100644
--- a/core/tests/coretests/AndroidManifest.xml
+++ b/core/tests/coretests/AndroidManifest.xml
@@ -59,9 +59,11 @@
     <uses-permission android:name="android.permission.READ_DEVICE_CONFIG" />
     <uses-permission android:name="android.permission.READ_DREAM_STATE" />
     <uses-permission android:name="android.permission.WRITE_DREAM_STATE" />
+    <uses-permission android:name="android.permission.READ_CLIPBOARD_IN_BACKGROUND" />
     <uses-permission android:name="android.permission.READ_LOGS"/>
     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
     <uses-permission android:name="android.permission.READ_SMS"/>
+    <uses-permission android:name="android.permission.START_ACTIVITIES_FROM_BACKGROUND"/>
     <uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" />
     <uses-permission android:name="android.permission.USE_CREDENTIALS" />
     <uses-permission android:name="android.permission.WAKE_LOCK" />
@@ -1144,6 +1146,14 @@
             </intent-filter>
         </activity>
 
+        <activity android:name="android.view.accessibility.AccessibilityTestActivity"
+                  android:label="AccessibilityTestActivity" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
         <!-- Activity-level metadata -->
         <meta-data android:name="com.android.frameworks.coretests.isApp" android:value="true" />
         <meta-data android:name="com.android.frameworks.coretests.string" android:value="foo" />
diff --git a/core/tests/coretests/res/layout/accessibility_test.xml b/core/tests/coretests/res/layout/accessibility_test.xml
new file mode 100644
index 0000000..1bdd21b
--- /dev/null
+++ b/core/tests/coretests/res/layout/accessibility_test.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <Button android:id="@+id/appNameBtn"
+        android:text="@string/app_name"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginRight="60dp"
+        android:bufferType="normal">
+    </Button>
+</LinearLayout>
diff --git a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java
index bdf3aa2..a5ea441 100644
--- a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java
+++ b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java
@@ -465,12 +465,12 @@
 
         @Override
         public void scheduleCreateBackupAgent(ApplicationInfo applicationInfo,
-                CompatibilityInfo compatibilityInfo, int i) throws RemoteException {
+                CompatibilityInfo compatibilityInfo, int i, int userId) throws RemoteException {
         }
 
         @Override
         public void scheduleDestroyBackupAgent(ApplicationInfo applicationInfo,
-                CompatibilityInfo compatibilityInfo) throws RemoteException {
+                CompatibilityInfo compatibilityInfo, int userId) throws RemoteException {
         }
 
         @Override
diff --git a/core/tests/coretests/src/android/content/pm/RegisteredServicesCacheTest.java b/core/tests/coretests/src/android/content/pm/RegisteredServicesCacheTest.java
index 365e97d..c8150b1 100644
--- a/core/tests/coretests/src/android/content/pm/RegisteredServicesCacheTest.java
+++ b/core/tests/coretests/src/android/content/pm/RegisteredServicesCacheTest.java
@@ -16,6 +16,7 @@
 
 package android.content.pm;
 
+import android.content.Intent;
 import android.content.res.Resources;
 import android.os.FileUtils;
 import android.os.Parcel;
@@ -189,6 +190,36 @@
         assertEquals(0, cache.getPersistentServicesSize(u1));
     }
 
+    /**
+     * Check that an optimization to skip a call to PackageManager handles an invalidated cache.
+     *
+     * We added an optimization in generateServicesMap to only query PackageManager for packages
+     * that have been changed, because if a package is unchanged, we have already cached the
+     * services info for it, so we can save a query to PackageManager (and save some memory).
+     * However, if invalidateCache was called, we cannot optimize, and must do a full query.
+     * The initial optimization was buggy because it failed to check for an invalidated cache, and
+     * only scanned the changed packages, given in the ACTION_PACKAGE_CHANGED intent (b/122912184).
+     */
+    public void testParseServiceInfoOptimizationHandlesInvalidatedCache() {
+        TestServicesCache cache = new TestServicesCache();
+        cache.addServiceForQuerying(U0, r1, newServiceInfo(t1, UID1));
+        cache.addServiceForQuerying(U0, r2, newServiceInfo(t2, UID2));
+        assertEquals(2, cache.getAllServicesSize(U0));
+
+        // simulate the client of the cache invalidating it
+        cache.invalidateCache(U0);
+
+        // there should be 0 services (userServices.services == null ) at this point, but we don't
+        // call getAllServicesSize since that would force a full scan of packages,
+        // instead we trigger a package change in a package that is in the list of services
+        Intent intent = new Intent(Intent.ACTION_PACKAGE_CHANGED);
+        intent.putExtra(Intent.EXTRA_UID, UID1);
+        cache.handlePackageEvent(intent, U0);
+
+        // check that the optimization does a full query and caches both services
+        assertEquals(2, cache.getAllServicesSize(U0));
+    }
+
     private static RegisteredServicesCache.ServiceInfo<TestServiceType> newServiceInfo(
             TestServiceType type, int uid) {
         final ComponentInfo info = new ComponentInfo();
@@ -266,6 +297,11 @@
                 map = new HashMap<>();
                 mServices.put(userId, map);
             }
+            // in actual cases, resolveInfo should always have a serviceInfo, since we specifically
+            // query for intent services
+            resolveInfo.serviceInfo = new android.content.pm.ServiceInfo();
+            resolveInfo.serviceInfo.applicationInfo =
+                new ApplicationInfo(serviceInfo.componentInfo.applicationInfo);
             map.put(resolveInfo, serviceInfo);
         }
 
@@ -304,6 +340,11 @@
         public void onUserRemoved(int userId) {
             super.onUserRemoved(userId);
         }
+
+        @Override
+        public void handlePackageEvent(Intent intent, int userId) {
+            super.handlePackageEvent(intent, userId);
+        }
     }
 
     static class TestSerializer implements XmlSerializerAndParser<TestServiceType> {
diff --git a/core/tests/coretests/src/android/graphics/BitmapTest.java b/core/tests/coretests/src/android/graphics/BitmapTest.java
index e79d2ae..d2a1dd9 100644
--- a/core/tests/coretests/src/android/graphics/BitmapTest.java
+++ b/core/tests/coretests/src/android/graphics/BitmapTest.java
@@ -16,6 +16,8 @@
 
 package android.graphics;
 
+import android.hardware.HardwareBuffer;
+
 import androidx.test.filters.SmallTest;
 
 import junit.framework.TestCase;
@@ -233,14 +235,31 @@
     }
 
     @SmallTest
-    public void testCreateHardwareBitmapFromGraphicBuffer() {
+    public void testWrapHardwareBufferWithSrgbColorSpace() {
         GraphicBuffer buffer = GraphicBuffer.create(10, 10, PixelFormat.RGBA_8888,
                 GraphicBuffer.USAGE_HW_TEXTURE | GraphicBuffer.USAGE_SOFTWARE_MASK);
         Canvas canvas = buffer.lockCanvas();
         canvas.drawColor(Color.YELLOW);
         buffer.unlockCanvasAndPost(canvas);
-        Bitmap hardwareBitmap = Bitmap.createHardwareBitmap(buffer);
+        Bitmap hardwareBitmap =
+                Bitmap.wrapHardwareBuffer(HardwareBuffer.createFromGraphicBuffer(buffer), null);
         assertTrue(hardwareBitmap.isPremultiplied());
         assertFalse(hardwareBitmap.isMutable());
+        assertEquals(ColorSpace.get(ColorSpace.Named.SRGB), hardwareBitmap.getColorSpace());
+    }
+
+    @SmallTest
+    public void testWrapHardwareBufferWithDisplayP3ColorSpace() {
+        GraphicBuffer buffer = GraphicBuffer.create(10, 10, PixelFormat.RGBA_8888,
+                GraphicBuffer.USAGE_HW_TEXTURE | GraphicBuffer.USAGE_SOFTWARE_MASK);
+        Canvas canvas = buffer.lockCanvas();
+        canvas.drawColor(Color.YELLOW);
+        buffer.unlockCanvasAndPost(canvas);
+        Bitmap hardwareBitmap = Bitmap.wrapHardwareBuffer(
+                HardwareBuffer.createFromGraphicBuffer(buffer),
+                ColorSpace.get(ColorSpace.Named.DISPLAY_P3));
+        assertTrue(hardwareBitmap.isPremultiplied());
+        assertFalse(hardwareBitmap.isMutable());
+        assertEquals(ColorSpace.get(ColorSpace.Named.DISPLAY_P3), hardwareBitmap.getColorSpace());
     }
 }
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index bd7f852..2cb925a 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -132,8 +132,12 @@
                     Settings.Global.AUTOMATIC_POWER_SAVER_MODE,
                     Settings.Global.BACKGROUND_ACTIVITY_STARTS_ENABLED,
                     Settings.Global.BATTERY_CHARGING_STATE_UPDATE_DELAY,
+                    Settings.Global.BROADCAST_BG_CONSTANTS,
+                    Settings.Global.BROADCAST_FG_CONSTANTS,
+                    Settings.Global.BROADCAST_OFFLOAD_CONSTANTS,
                     Settings.Global.BATTERY_DISCHARGE_DURATION_THRESHOLD,
                     Settings.Global.BATTERY_DISCHARGE_THRESHOLD,
+                    Settings.Global.BATTERY_SAVER_ADAPTIVE_DEVICE_SPECIFIC_CONSTANTS,
                     Settings.Global.BATTERY_SAVER_DEVICE_SPECIFIC_CONSTANTS,
                     Settings.Global.BATTERY_STATS_CONSTANTS,
                     Settings.Global.BINDER_CALLS_STATS,
@@ -189,7 +193,6 @@
                     Settings.Global.CONNECTIVITY_METRICS_BUFFER_SIZE,
                     Settings.Global.CONNECTIVITY_SAMPLING_INTERVAL_IN_SECONDS,
                     Settings.Global.CONTACT_METADATA_SYNC_ENABLED,
-                    Settings.Global.CONTENT_CAPTURE_SERVICE_EXPLICITLY_ENABLED,
                     Settings.Global.CONVERSATION_ACTIONS_UPDATE_CONTENT_URL,
                     Settings.Global.CONVERSATION_ACTIONS_UPDATE_METADATA_URL,
                     Settings.Global.CONTACTS_DATABASE_WAL_ENABLED,
@@ -220,6 +223,7 @@
                     Settings.Global.DEVELOPMENT_SETTINGS_ENABLED,
                     Settings.Global.DEVICE_DEMO_MODE,
                     Settings.Global.DEVICE_IDLE_CONSTANTS,
+                    Settings.Global.BATTERY_SAVER_ADAPTIVE_CONSTANTS,
                     Settings.Global.BATTERY_SAVER_CONSTANTS,
                     Settings.Global.BATTERY_TIP_CONSTANTS,
                     Settings.Global.DEFAULT_SM_DP_PLUS,
@@ -293,6 +297,7 @@
                     Settings.Global.INTENT_FIREWALL_UPDATE_METADATA_URL,
                     Settings.Global.JOB_SCHEDULER_CONSTANTS,
                     Settings.Global.KEEP_PROFILE_IN_BACKGROUND,
+                    Settings.Global.KERNEL_CPU_THREAD_READER,
                     Settings.Global.LANG_ID_UPDATE_CONTENT_URL,
                     Settings.Global.LANG_ID_UPDATE_METADATA_URL,
                     Settings.Global.LAST_ACTIVE_USER_ID,
@@ -483,10 +488,10 @@
                     Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_SELECTION_PKGS,
                     Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_SELECTION_VALUES,
                     Settings.Global.GLOBAL_SETTINGS_ANGLE_WHITELIST,
-                    Settings.Global.GUP_DEV_ALL_APPS,
-                    Settings.Global.GUP_DEV_OPT_IN_APPS,
-                    Settings.Global.GUP_DEV_OPT_OUT_APPS,
-                    Settings.Global.GUP_BLACKLIST,
+                    Settings.Global.GAME_DRIVER_ALL_APPS,
+                    Settings.Global.GAME_DRIVER_OPT_IN_APPS,
+                    Settings.Global.GAME_DRIVER_OPT_OUT_APPS,
+                    Settings.Global.GAME_DRIVER_BLACKLIST,
                     Settings.Global.GAME_DRIVER_WHITELIST,
                     Settings.Global.GPU_DEBUG_LAYER_APP,
                     Settings.Global.ENABLE_GNSS_RAW_MEAS_FULL_TRACKING,
@@ -507,7 +512,6 @@
                     Settings.Global.WIFI_ALWAYS_REQUESTED,
                     Settings.Global.WIFI_BADGING_THRESHOLDS,
                     Settings.Global.WIFI_BOUNCE_DELAY_OVERRIDE_MS,
-                    Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED,
                     Settings.Global.WIFI_COUNTRY_CODE,
                     Settings.Global.WIFI_DATA_STALL_MIN_TX_BAD,
                     Settings.Global.WIFI_DATA_STALL_MIN_TX_SUCCESS_WITHOUT_RX,
@@ -524,6 +528,7 @@
                     Settings.Global.WIFI_LINK_SPEED_METRICS_ENABLED,
                     Settings.Global.WIFI_PNO_FREQUENCY_CULLING_ENABLED,
                     Settings.Global.WIFI_PNO_RECENCY_SORTING_ENABLED,
+                    Settings.Global.WIFI_LINK_PROBING_ENABLED,
                     Settings.Global.WIFI_MAX_DHCP_RETRY_COUNT,
                     Settings.Global.WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS,
                     Settings.Global.WIFI_NETWORK_SHOW_RSSI,
@@ -575,6 +580,7 @@
                  Settings.Secure.ALLOWED_GEOLOCATION_ORIGINS,
                  Settings.Secure.ALWAYS_ON_VPN_APP,
                  Settings.Secure.ALWAYS_ON_VPN_LOCKDOWN,
+                 Settings.Secure.ALWAYS_ON_VPN_LOCKDOWN_WHITELIST,
                  Settings.Secure.ANDROID_ID,
                  Settings.Secure.ANR_SHOW_BACKGROUND,
                  Settings.Secure.ASSISTANT,
@@ -605,6 +611,7 @@
                  Settings.Secure.CMAS_ADDITIONAL_BROADCAST_PKG,
                  Settings.Secure.COMPLETED_CATEGORY_PREFIX,
                  Settings.Secure.CONNECTIVITY_RELEASE_PENDING_INTENT_DELAY_MS,
+                 Settings.Secure.CONTENT_CAPTURE_ENABLED,
                  Settings.Secure.DEFAULT_INPUT_METHOD,
                  Settings.Secure.DEVICE_PAIRED,
                  Settings.Secure.DIALER_DEFAULT_APPLICATION,
diff --git a/core/tests/coretests/src/android/service/notification/StatusBarNotificationTest.java b/core/tests/coretests/src/android/service/notification/StatusBarNotificationTest.java
index 4aa1000..c99777b 100644
--- a/core/tests/coretests/src/android/service/notification/StatusBarNotificationTest.java
+++ b/core/tests/coretests/src/android/service/notification/StatusBarNotificationTest.java
@@ -77,7 +77,6 @@
     @Test
     public void testLogMaker() {
         final LogMaker logMaker = getNotification(PKG, GROUP_ID_1, CHANNEL_ID).getLogMaker();
-
         assertEquals(CHANNEL_ID,
                 (String) logMaker.getTaggedData(MetricsEvent.FIELD_NOTIFICATION_CHANNEL_ID));
         assertEquals(PKG, logMaker.getPackageName());
@@ -85,6 +84,18 @@
         assertEquals(TAG, logMaker.getTaggedData(MetricsEvent.NOTIFICATION_TAG));
         assertEquals(GROUP_ID_1,
                 logMaker.getTaggedData(MetricsEvent.FIELD_NOTIFICATION_GROUP_ID));
+        assertEquals(0,
+                logMaker.getTaggedData(MetricsEvent.FIELD_NOTIFICATION_GROUP_SUMMARY));
+        assertNull(logMaker.getTaggedData(MetricsEvent.FIELD_NOTIFICATION_CATEGORY));
+    }
+
+    @Test
+    public void testLogMakerWithCategory() {
+        Notification.Builder builder = getNotificationBuilder(GROUP_ID_1, CHANNEL_ID)
+                        .setCategory(Notification.CATEGORY_MESSAGE);
+        final LogMaker logMaker = getNotification(PKG, builder).getLogMaker();
+        assertEquals(Notification.CATEGORY_MESSAGE,
+                logMaker.getTaggedData(MetricsEvent.FIELD_NOTIFICATION_CATEGORY));
     }
 
     @Test
@@ -138,6 +149,10 @@
     }
 
     private StatusBarNotification getNotification(String pkg, String group, String channelId) {
+        return getNotification(pkg, getNotificationBuilder(group, channelId));
+    }
+
+    private Notification.Builder getNotificationBuilder(String group, String channelId) {
         final Notification.Builder builder = new Notification.Builder(mMockContext, channelId)
                 .setContentTitle("foo")
                 .setSmallIcon(android.R.drawable.sym_def_app_icon);
@@ -145,10 +160,13 @@
         if (group != null) {
             builder.setGroup(group);
         }
+        return builder;
+    }
 
-        Notification n = builder.build();
+    private StatusBarNotification getNotification(String pkg, Notification.Builder builder) {
+
         return new StatusBarNotification(
-                pkg, pkg, ID, TAG, UID, UID, n, USER, null, UID);
+                pkg, pkg, ID, TAG, UID, UID, builder.build(), USER, null, UID);
     }
 
 }
diff --git a/core/tests/coretests/src/android/view/AccessibilityInteractionControllerTest.java b/core/tests/coretests/src/android/view/AccessibilityInteractionControllerTest.java
new file mode 100644
index 0000000..d0719cb
--- /dev/null
+++ b/core/tests/coretests/src/android/view/AccessibilityInteractionControllerTest.java
@@ -0,0 +1,220 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.app.Activity;
+import android.app.Instrumentation;
+import android.app.Service;
+import android.app.UiAutomation;
+import android.graphics.Rect;
+import android.os.SystemClock;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import android.text.TextUtils;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.accessibility.AccessibilityTestActivity;
+import android.view.accessibility.AccessibilityWindowInfo;
+
+import com.android.compatibility.common.util.TestUtils;
+import com.android.frameworks.coretests.R;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.List;
+import java.util.concurrent.TimeoutException;
+
+@RunWith(AndroidJUnit4.class)
+public class AccessibilityInteractionControllerTest {
+    static final long TIMEOUT_DEFAULT = 10000; // 10 seconds
+
+    private static Instrumentation sInstrumentation;
+    private static UiAutomation sUiAutomation;
+
+    @Rule
+    public ActivityTestRule<AccessibilityTestActivity> mActivityRule = new ActivityTestRule<>(
+            AccessibilityTestActivity.class, false, false);
+
+    private AccessibilityInteractionController mAccessibilityInteractionController;
+    private ViewRootImpl mViewRootImpl;
+    private View mButton;
+
+    @BeforeClass
+    public static void oneTimeSetup() {
+        sInstrumentation = InstrumentationRegistry.getInstrumentation();
+        sUiAutomation = sInstrumentation.getUiAutomation();
+    }
+
+    @AfterClass
+    public static void postTestTearDown() {
+        sUiAutomation.destroy();
+    }
+
+    @Before
+    public void setUp() throws Throwable {
+        launchActivity();
+        enableTouchExploration(true);
+        mActivityRule.runOnUiThread(() -> {
+            mViewRootImpl = mActivityRule.getActivity().getWindow().getDecorView()
+                    .getViewRootImpl();
+            mButton = mActivityRule.getActivity().findViewById(R.id.appNameBtn);
+        });
+        mAccessibilityInteractionController =
+                mViewRootImpl.getAccessibilityInteractionController();
+    }
+
+    @After
+    public void tearDown() {
+        enableTouchExploration(false);
+    }
+
+    @Test
+    public void clearAccessibilityFocus_shouldClearFocus() throws Exception {
+        performAccessibilityFocus("com.android.frameworks.coretests:id/appNameBtn");
+        assertTrue("Button should have a11y focus",
+                mButton.isAccessibilityFocused());
+        mAccessibilityInteractionController.clearAccessibilityFocusClientThread();
+        sInstrumentation.waitForIdleSync();
+        assertFalse("Button should not have a11y focus",
+                mButton.isAccessibilityFocused());
+    }
+
+    @Test
+    public void clearAccessibilityFocus_uiThread_shouldClearFocus() throws Exception {
+        performAccessibilityFocus("com.android.frameworks.coretests:id/appNameBtn");
+        assertTrue("Button should have a11y focus",
+                mButton.isAccessibilityFocused());
+        sInstrumentation.runOnMainSync(() -> {
+            mAccessibilityInteractionController.clearAccessibilityFocusClientThread();
+        });
+        assertFalse("Button should not have a11y focus",
+                mButton.isAccessibilityFocused());
+    }
+
+    private void launchActivity() {
+        final Object waitObject = new Object();
+        final int[] location = new int[2];
+        final StringBuilder activityPackage = new StringBuilder();
+        final Rect bounds = new Rect();
+        final StringBuilder activityTitle = new StringBuilder();
+        try {
+            final long executionStartTimeMillis = SystemClock.uptimeMillis();
+            sUiAutomation.setOnAccessibilityEventListener((event) -> {
+                if (event.getEventTime() < executionStartTimeMillis) {
+                    return;
+                }
+                synchronized (waitObject) {
+                    waitObject.notifyAll();
+                }
+            });
+            enableRetrieveAccessibilityWindows();
+
+            final Activity activity = mActivityRule.launchActivity(null);
+            sInstrumentation.runOnMainSync(() -> {
+                activity.getWindow().getDecorView().getLocationOnScreen(location);
+                activityPackage.append(activity.getPackageName());
+                activityTitle.append(activity.getTitle());
+            });
+            sInstrumentation.waitForIdleSync();
+
+            TestUtils.waitOn(waitObject, () -> {
+                final AccessibilityWindowInfo window = findWindowByTitle(activityTitle);
+                if (window == null) return false;
+                window.getBoundsInScreen(bounds);
+                activity.getWindow().getDecorView().getLocationOnScreen(location);
+                if (bounds.isEmpty()) {
+                    return false;
+                }
+                return (!bounds.isEmpty())
+                        && (bounds.left == location[0]) && (bounds.top == location[1]);
+            }, TIMEOUT_DEFAULT, "Launch Activity");
+        } finally {
+            sUiAutomation.setOnAccessibilityEventListener(null);
+        }
+    }
+
+    private void enableRetrieveAccessibilityWindows() {
+        AccessibilityServiceInfo info = sUiAutomation.getServiceInfo();
+        info.flags |= AccessibilityServiceInfo.FLAG_RETRIEVE_INTERACTIVE_WINDOWS;
+        sUiAutomation.setServiceInfo(info);
+    }
+
+    private void enableTouchExploration(boolean enabled) {
+        final Object waitObject = new Object();
+        final AccessibilityManager accessibilityManager =
+                (AccessibilityManager) sInstrumentation.getContext().getSystemService(
+                        Service.ACCESSIBILITY_SERVICE);
+        final AccessibilityManager.TouchExplorationStateChangeListener listener = status -> {
+            synchronized (waitObject) {
+                waitObject.notifyAll();
+            }
+        };
+        try {
+            accessibilityManager.addTouchExplorationStateChangeListener(listener);
+            final AccessibilityServiceInfo info = sUiAutomation.getServiceInfo();
+            if (enabled) {
+                info.flags |= AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE;
+            } else {
+                info.flags &= ~AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE;
+            }
+            sUiAutomation.setServiceInfo(info);
+            TestUtils.waitOn(waitObject,
+                    () -> accessibilityManager.isTouchExplorationEnabled() == enabled,
+                    TIMEOUT_DEFAULT,
+                    (enabled ? "Enable" : "Disable") + "touch exploration");
+        } finally {
+            accessibilityManager.removeTouchExplorationStateChangeListener(listener);
+        }
+    }
+
+    private void performAccessibilityFocus(String viewId) throws TimeoutException {
+        final AccessibilityNodeInfo node = sUiAutomation.getRootInActiveWindow()
+                .findAccessibilityNodeInfosByViewId(viewId).get(0);
+        // Perform an action and wait for an event
+        sUiAutomation.executeAndWaitForEvent(
+                () -> node.performAction(AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS),
+                event -> event.getEventType() == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED,
+                TIMEOUT_DEFAULT);
+        node.refresh();
+    }
+
+    private AccessibilityWindowInfo findWindowByTitle(CharSequence title) {
+        final List<AccessibilityWindowInfo> windows = sUiAutomation.getWindows();
+        AccessibilityWindowInfo returnValue = null;
+        for (int i = 0; i < windows.size(); i++) {
+            final AccessibilityWindowInfo window = windows.get(i);
+            if (TextUtils.equals(title, window.getTitle())) {
+                returnValue = window;
+            } else {
+                window.recycle();
+            }
+        }
+        return returnValue;
+    }
+}
diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityTestActivity.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityTestActivity.java
new file mode 100644
index 0000000..a17fa73
--- /dev/null
+++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityTestActivity.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.accessibility;
+
+import android.app.Activity;
+import android.app.KeyguardManager;
+import android.content.Context;
+import android.os.Bundle;
+
+import com.android.frameworks.coretests.R;
+
+/**
+ * An activity for accessibility test.
+ */
+public class AccessibilityTestActivity extends Activity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        turnOnScreen();
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.accessibility_test);
+    }
+
+    private void turnOnScreen() {
+        setTurnScreenOn(true);
+        setShowWhenLocked(true);
+        KeyguardManager keyguardManager = (KeyguardManager) getSystemService(
+                Context.KEYGUARD_SERVICE);
+        keyguardManager.requestDismissKeyguard(this, null);
+    }
+}
diff --git a/core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java b/core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java
index bfa6e06..71612e6 100644
--- a/core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java
+++ b/core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java
@@ -78,7 +78,7 @@
         assertThrows(NullPointerException.class, () -> mSession1.notifyViewAppeared(null));
         assertThrows(NullPointerException.class, () -> mSession1.notifyViewDisappeared(null));
         assertThrows(NullPointerException.class,
-                () -> mSession1.notifyViewTextChanged(null, "whatever", 0));
+                () -> mSession1.notifyViewTextChanged(null, "whatever"));
     }
 
     @Test
diff --git a/core/tests/coretests/src/android/view/inputmethod/EditorInfoTest.java b/core/tests/coretests/src/android/view/inputmethod/EditorInfoTest.java
new file mode 100644
index 0000000..68099fe
--- /dev/null
+++ b/core/tests/coretests/src/android/view/inputmethod/EditorInfoTest.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.inputmethod;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import android.os.Parcel;
+import android.os.UserHandle;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Supplemental tests that cannot be covered by CTS (e.g. due to hidden API dependencies).
+ */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class EditorInfoTest {
+    private static final int TEST_USER_ID = 42;
+
+    /**
+     * Makes sure that {@code null} {@link EditorInfo#targetInputMethodUser} can be copied via
+     * {@link Parcel}.
+     */
+    @Test
+    public void testNullTargetInputMethodUserParcelable() throws Exception {
+        final EditorInfo editorInfo = new EditorInfo();
+        editorInfo.targetInputMethodUser = null;
+        assertNull(cloneViaParcel(editorInfo).targetInputMethodUser);
+    }
+
+    /**
+     * Makes sure that non-{@code null} {@link EditorInfo#targetInputMethodUser} can be copied via
+     * {@link Parcel}.
+     */
+    @Test
+    public void testNonNullTargetInputMethodUserParcelable() throws Exception {
+        final EditorInfo editorInfo = new EditorInfo();
+        editorInfo.targetInputMethodUser = UserHandle.of(TEST_USER_ID);
+        assertEquals(UserHandle.of(TEST_USER_ID), cloneViaParcel(editorInfo).targetInputMethodUser);
+    }
+
+    private static EditorInfo cloneViaParcel(EditorInfo original) {
+        Parcel parcel = null;
+        try {
+            parcel = Parcel.obtain();
+            original.writeToParcel(parcel, 0);
+            parcel.setDataPosition(0);
+            return EditorInfo.CREATOR.createFromParcel(parcel);
+        } finally {
+            if (parcel != null) {
+                parcel.recycle();
+            }
+        }
+    }
+}
diff --git a/core/tests/coretests/src/android/view/textclassifier/IntentFactoryTest.java b/core/tests/coretests/src/android/view/textclassifier/IntentFactoryTest.java
deleted file mode 100644
index 3fc8e4c..0000000
--- a/core/tests/coretests/src/android/view/textclassifier/IntentFactoryTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.view.textclassifier;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Intent;
-
-import androidx.test.InstrumentationRegistry;
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import com.google.android.textclassifier.AnnotatorModel;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.List;
-
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-public class IntentFactoryTest {
-
-    private static final String TEXT = "text";
-
-    @Test
-    public void create_typeDictionary() {
-        AnnotatorModel.ClassificationResult classificationResult =
-                new AnnotatorModel.ClassificationResult(
-                        TextClassifier.TYPE_DICTIONARY,
-                        1.0f,
-                        null,
-                        null);
-
-        List<TextClassifierImpl.LabeledIntent> intents = TextClassifierImpl.IntentFactory.create(
-                InstrumentationRegistry.getContext(),
-                TEXT,
-                false,
-                null,
-                classificationResult);
-
-        assertThat(intents).hasSize(1);
-        TextClassifierImpl.LabeledIntent labeledIntent = intents.get(0);
-        Intent intent = labeledIntent.getIntent();
-        assertThat(intent.getAction()).isEqualTo(Intent.ACTION_DEFINE);
-        assertThat(intent.getStringExtra(Intent.EXTRA_TEXT)).isEqualTo(TEXT);
-        assertThat(
-                intent.getBooleanExtra(TextClassifier.EXTRA_FROM_TEXT_CLASSIFIER, false)).isTrue();
-    }
-}
diff --git a/core/tests/coretests/src/android/view/textclassifier/LegacyIntentFactoryTest.java b/core/tests/coretests/src/android/view/textclassifier/LegacyIntentFactoryTest.java
new file mode 100644
index 0000000..73d3eec
--- /dev/null
+++ b/core/tests/coretests/src/android/view/textclassifier/LegacyIntentFactoryTest.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.textclassifier;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Intent;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.google.android.textclassifier.AnnotatorModel;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.List;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class LegacyIntentFactoryTest {
+
+    private static final String TEXT = "text";
+
+    private LegacyIntentFactory mLegacyIntentFactory;
+
+    @Before
+    public void setup() {
+        mLegacyIntentFactory = new LegacyIntentFactory();
+    }
+
+    @Test
+    public void create_typeDictionary() {
+        AnnotatorModel.ClassificationResult classificationResult =
+                new AnnotatorModel.ClassificationResult(
+                        TextClassifier.TYPE_DICTIONARY,
+                        1.0f,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null);
+
+        List<TextClassifierImpl.LabeledIntent> intents = mLegacyIntentFactory.create(
+                InstrumentationRegistry.getContext(),
+                TEXT,
+                /* foreignText */ false,
+                null,
+                classificationResult);
+
+        assertThat(intents).hasSize(1);
+        TextClassifierImpl.LabeledIntent labeledIntent = intents.get(0);
+        Intent intent = labeledIntent.getIntent();
+        assertThat(intent.getAction()).isEqualTo(Intent.ACTION_DEFINE);
+        assertThat(intent.getStringExtra(Intent.EXTRA_TEXT)).isEqualTo(TEXT);
+        assertThat(
+                intent.getBooleanExtra(TextClassifier.EXTRA_FROM_TEXT_CLASSIFIER, false)).isTrue();
+    }
+
+    @Test
+    public void create_translateAndDictionary() {
+        AnnotatorModel.ClassificationResult classificationResult =
+                new AnnotatorModel.ClassificationResult(
+                        TextClassifier.TYPE_DICTIONARY,
+                        1.0f,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null);
+
+        List<TextClassifierImpl.LabeledIntent> intents = mLegacyIntentFactory.create(
+                InstrumentationRegistry.getContext(),
+                TEXT,
+                /* foreignText */ true,
+                null,
+                classificationResult);
+
+        assertThat(intents).hasSize(2);
+        assertThat(intents.get(0).getIntent().getAction()).isEqualTo(Intent.ACTION_DEFINE);
+        assertThat(intents.get(1).getIntent().getAction()).isEqualTo(Intent.ACTION_TRANSLATE);
+    }
+}
diff --git a/core/tests/coretests/src/android/view/textclassifier/TemplateIntentFactoryTest.java b/core/tests/coretests/src/android/view/textclassifier/TemplateIntentFactoryTest.java
new file mode 100644
index 0000000..0fcf359
--- /dev/null
+++ b/core/tests/coretests/src/android/view/textclassifier/TemplateIntentFactoryTest.java
@@ -0,0 +1,218 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.textclassifier;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Intent;
+import android.net.Uri;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.google.android.textclassifier.AnnotatorModel;
+import com.google.android.textclassifier.NamedVariant;
+import com.google.android.textclassifier.RemoteActionTemplate;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.List;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class TemplateIntentFactoryTest {
+
+    private static final String TEXT = "text";
+    private static final String TITLE = "Map";
+    private static final String DESCRIPTION = "Check the map";
+    private static final String ACTION = Intent.ACTION_VIEW;
+    private static final String DATA = Uri.parse("http://www.android.com").toString();
+    private static final String TYPE = "text/html";
+    private static final Integer FLAG = Intent.FLAG_ACTIVITY_NEW_TASK;
+    private static final String[] CATEGORY =
+            new String[]{Intent.CATEGORY_DEFAULT, Intent.CATEGORY_APP_BROWSER};
+    private static final String PACKAGE_NAME = "pkg.name";
+    private static final String KEY_ONE = "key1";
+    private static final String VALUE_ONE = "value1";
+    private static final String KEY_TWO = "key2";
+    private static final int VALUE_TWO = 42;
+
+    private static final NamedVariant[] NAMED_VARIANTS = new NamedVariant[]{
+            new NamedVariant(KEY_ONE, VALUE_ONE),
+            new NamedVariant(KEY_TWO, VALUE_TWO)
+    };
+    private static final Integer REQUEST_CODE = 10;
+
+    @Mock
+    private IntentFactory mFallback;
+    private TemplateIntentFactory mTemplateIntentFactory;
+
+    @Before
+    public void setup() {
+        MockitoAnnotations.initMocks(this);
+        mTemplateIntentFactory = new TemplateIntentFactory(mFallback);
+    }
+
+    @Test
+    public void create_full() {
+        RemoteActionTemplate remoteActionTemplate = new RemoteActionTemplate(
+                TITLE,
+                DESCRIPTION,
+                ACTION,
+                DATA,
+                TYPE,
+                FLAG,
+                CATEGORY,
+                /* packageName */ null,
+                NAMED_VARIANTS,
+                REQUEST_CODE
+        );
+
+        AnnotatorModel.ClassificationResult classificationResult =
+                new AnnotatorModel.ClassificationResult(
+                        TextClassifier.TYPE_ADDRESS,
+                        1.0f,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        new RemoteActionTemplate[]{remoteActionTemplate});
+
+        List<TextClassifierImpl.LabeledIntent> intents = mTemplateIntentFactory.create(
+                InstrumentationRegistry.getContext(),
+                TEXT,
+                false,
+                null,
+                classificationResult);
+
+        assertThat(intents).hasSize(1);
+        TextClassifierImpl.LabeledIntent labeledIntent = intents.get(0);
+        assertThat(labeledIntent.getTitle()).isEqualTo(TITLE);
+        assertThat(labeledIntent.getDescription()).isEqualTo(DESCRIPTION);
+        assertThat(labeledIntent.getRequestCode()).isEqualTo(REQUEST_CODE);
+        Intent intent = labeledIntent.getIntent();
+        assertThat(intent.getAction()).isEqualTo(ACTION);
+        assertThat(intent.getData().toString()).isEqualTo(DATA);
+        assertThat(intent.getType()).isEqualTo(TYPE);
+        assertThat(intent.getFlags()).isEqualTo(FLAG);
+        assertThat(intent.getCategories()).containsExactly((Object[]) CATEGORY);
+        assertThat(intent.getPackage()).isNull();
+        assertThat(
+                intent.getStringExtra(KEY_ONE)).isEqualTo(VALUE_ONE);
+        assertThat(intent.getIntExtra(KEY_TWO, 0)).isEqualTo(VALUE_TWO);
+        assertThat(
+                intent.getBooleanExtra(TextClassifier.EXTRA_FROM_TEXT_CLASSIFIER, false)).isTrue();
+    }
+
+    @Test
+    public void create_pacakgeIsNotNull() {
+        RemoteActionTemplate remoteActionTemplate = new RemoteActionTemplate(
+                TITLE,
+                DESCRIPTION,
+                ACTION,
+                DATA,
+                TYPE,
+                FLAG,
+                CATEGORY,
+                PACKAGE_NAME,
+                NAMED_VARIANTS,
+                REQUEST_CODE
+        );
+
+        AnnotatorModel.ClassificationResult classificationResult =
+                new AnnotatorModel.ClassificationResult(
+                        TextClassifier.TYPE_ADDRESS,
+                        1.0f,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        new RemoteActionTemplate[]{remoteActionTemplate});
+
+        List<TextClassifierImpl.LabeledIntent> intents = mTemplateIntentFactory.create(
+                InstrumentationRegistry.getContext(),
+                TEXT,
+                false,
+                null,
+                classificationResult);
+
+        assertThat(intents).hasSize(0);
+    }
+
+    @Test
+    public void create_minimal() {
+        RemoteActionTemplate remoteActionTemplate = new RemoteActionTemplate(
+                null,
+                null,
+                null,
+                null,
+                null,
+                null,
+                null,
+                null,
+                null,
+                null
+        );
+
+        AnnotatorModel.ClassificationResult classificationResult =
+                new AnnotatorModel.ClassificationResult(
+                        TextClassifier.TYPE_ADDRESS,
+                        1.0f,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        new RemoteActionTemplate[]{remoteActionTemplate});
+
+        List<TextClassifierImpl.LabeledIntent> intents = mTemplateIntentFactory.create(
+                InstrumentationRegistry.getContext(),
+                TEXT,
+                false,
+                null,
+                classificationResult);
+
+        assertThat(intents).hasSize(1);
+        TextClassifierImpl.LabeledIntent labeledIntent = intents.get(0);
+        assertThat(labeledIntent.getTitle()).isNull();
+        assertThat(labeledIntent.getDescription()).isNull();
+        assertThat(labeledIntent.getRequestCode()).isEqualTo(
+                TextClassifierImpl.LabeledIntent.DEFAULT_REQUEST_CODE);
+        Intent intent = labeledIntent.getIntent();
+        assertThat(intent.getAction()).isNull();
+        assertThat(intent.getData()).isNull();
+        assertThat(intent.getType()).isNull();
+        assertThat(intent.getFlags()).isEqualTo(0);
+        assertThat(intent.getCategories()).isNull();
+        assertThat(intent.getPackage()).isNull();
+        assertThat(
+                intent.getBooleanExtra(TextClassifier.EXTRA_FROM_TEXT_CLASSIFIER, false)).isTrue();
+    }
+}
diff --git a/core/tests/coretests/src/android/view/textclassifier/TextClassifierTest.java b/core/tests/coretests/src/android/view/textclassifier/TextClassifierTest.java
index 5e58f82..582be9d 100644
--- a/core/tests/coretests/src/android/view/textclassifier/TextClassifierTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/TextClassifierTest.java
@@ -21,8 +21,10 @@
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 
+import android.app.RemoteAction;
 import android.content.Context;
 import android.content.Intent;
+import android.os.Bundle;
 import android.os.LocaleList;
 import android.text.Spannable;
 import android.text.SpannableString;
@@ -246,25 +248,31 @@
     public void testClassifyText_foreignText() {
         LocaleList originalLocales = LocaleList.getDefault();
         LocaleList.setDefault(LocaleList.forLanguageTags("en"));
-        String foreignText = "これは日本語のテキストです";
+        String japaneseText = "これは日本語のテキストです";
 
         Context context = new FakeContextBuilder()
                 .setIntentComponent(Intent.ACTION_TRANSLATE, FakeContextBuilder.DEFAULT_COMPONENT)
                 .build();
         TextClassifier classifier = new TextClassifierImpl(context, TC_CONSTANTS);
         TextClassification.Request request = new TextClassification.Request.Builder(
-                foreignText, 0, foreignText.length())
+                japaneseText, 0, japaneseText.length())
                 .setDefaultLocales(LOCALES)
                 .build();
 
         TextClassification classification = classifier.classifyText(request);
+        RemoteAction translateAction = classification.getActions().get(0);
         assertEquals(1, classification.getActions().size());
         assertEquals(
                 context.getString(com.android.internal.R.string.translate),
-                classification.getActions().get(0).getTitle());
-        Intent intent = (Intent) classification.getExtras()
-                .getParcelableArrayList(TextClassifierImpl.ACTIONS_INTENTS).get(0);
+                translateAction.getTitle());
+
+        assertEquals(translateAction, ExtrasUtils.findTranslateAction(classification));
+        Intent intent = ExtrasUtils.getActionsIntents(classification).get(0);
         assertEquals(Intent.ACTION_TRANSLATE, intent.getAction());
+        Bundle foreignLanguageInfo = ExtrasUtils.getForeignLanguageExtra(classification);
+        assertEquals("ja", ExtrasUtils.getEntityType(foreignLanguageInfo));
+        assertTrue(ExtrasUtils.getScore(foreignLanguageInfo) >= 0);
+        assertTrue(ExtrasUtils.getScore(foreignLanguageInfo) <= 1);
 
         LocaleList.setDefault(originalLocales);
     }
diff --git a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java
index aaa624e..6b9e69c 100644
--- a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java
+++ b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java
@@ -16,12 +16,12 @@
 
 package com.android.internal.app;
 
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.action.ViewActions.click;
-import static android.support.test.espresso.assertion.ViewAssertions.matches;
-import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-import static android.support.test.espresso.matcher.ViewMatchers.withText;
+import static androidx.test.espresso.Espresso.onView;
+import static androidx.test.espresso.action.ViewActions.click;
+import static androidx.test.espresso.assertion.ViewAssertions.matches;
+import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
+import static androidx.test.espresso.matcher.ViewMatchers.withId;
+import static androidx.test.espresso.matcher.ViewMatchers.withText;
 
 import static com.android.internal.app.ChooserWrapperActivity.sOverrides;
 
@@ -33,12 +33,21 @@
 import static org.mockito.Mockito.when;
 
 import android.app.usage.UsageStatsManager;
+import android.content.ClipData;
+import android.content.ClipDescription;
+import android.content.ClipboardManager;
+import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ResolveInfo;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.net.Uri;
 
-import androidx.test.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
 import androidx.test.rule.ActivityTestRule;
-import androidx.test.runner.AndroidJUnit4;
 
 import com.android.internal.R;
 import com.android.internal.app.ResolverActivity.ResolvedComponentInfo;
@@ -69,7 +78,21 @@
 
     @Test
     public void customTitle() throws InterruptedException {
-        Intent sendIntent = createSendImageIntent();
+        Intent viewIntent = createViewTextIntent();
+        List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2);
+
+        when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(),
+                Mockito.anyBoolean(),
+                Mockito.isA(List.class))).thenReturn(resolvedComponentInfos);
+        mActivityRule.launchActivity(Intent.createChooser(viewIntent, "chooser test"));
+
+        waitForIdle();
+        onView(withId(R.id.title)).check(matches(withText("chooser test")));
+    }
+
+    @Test
+    public void customTitleIgnoredForSendIntents() throws InterruptedException {
+        Intent sendIntent = createSendTextIntent();
         List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2);
 
         when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(),
@@ -77,12 +100,12 @@
                 Mockito.isA(List.class))).thenReturn(resolvedComponentInfos);
         mActivityRule.launchActivity(Intent.createChooser(sendIntent, "chooser test"));
         waitForIdle();
-        onView(withId(R.id.title)).check(matches(withText("chooser test")));
+        onView(withId(R.id.title)).check(matches(withText(R.string.whichSendApplication)));
     }
 
     @Test
     public void emptyTitle() throws InterruptedException {
-        Intent sendIntent = createSendImageIntent();
+        Intent sendIntent = createSendTextIntent();
         List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2);
 
         when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(),
@@ -95,8 +118,72 @@
     }
 
     @Test
+    public void emptyPreviewTitleAndThumbnail() throws InterruptedException {
+        Intent sendIntent = createSendTextIntentWithPreview(null, null);
+        List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2);
+
+        when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(),
+                Mockito.anyBoolean(),
+                Mockito.isA(List.class))).thenReturn(resolvedComponentInfos);
+        mActivityRule.launchActivity(Intent.createChooser(sendIntent, null));
+        waitForIdle();
+        onView(withId(R.id.content_preview_title)).check(matches(not(isDisplayed())));
+        onView(withId(R.id.content_preview_thumbnail)).check(matches(not(isDisplayed())));
+    }
+
+    @Test
+    public void visiblePreviewTitleWithoutThumbnail() throws InterruptedException {
+        String previewTitle = "My Content Preview Title";
+        Intent sendIntent = createSendTextIntentWithPreview(previewTitle, null);
+        List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2);
+
+        when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(),
+                Mockito.anyBoolean(),
+                Mockito.isA(List.class))).thenReturn(resolvedComponentInfos);
+        mActivityRule.launchActivity(Intent.createChooser(sendIntent, null));
+        waitForIdle();
+        onView(withId(R.id.content_preview_title)).check(matches(isDisplayed()));
+        onView(withId(R.id.content_preview_title)).check(matches(withText(previewTitle)));
+        onView(withId(R.id.content_preview_thumbnail)).check(matches(not(isDisplayed())));
+    }
+
+    @Test
+    public void visiblePreviewTitleWithInvalidThumbnail() throws InterruptedException {
+        String previewTitle = "My Content Preview Title";
+        Intent sendIntent = createSendTextIntentWithPreview(previewTitle,
+                Uri.parse("tel:(+49)12345789"));
+        List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2);
+
+        when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(),
+                Mockito.anyBoolean(),
+                Mockito.isA(List.class))).thenReturn(resolvedComponentInfos);
+        mActivityRule.launchActivity(Intent.createChooser(sendIntent, null));
+        waitForIdle();
+        onView(withId(R.id.content_preview_title)).check(matches(isDisplayed()));
+        onView(withId(R.id.content_preview_thumbnail)).check(matches(not(isDisplayed())));
+    }
+
+    @Test
+    public void visiblePreviewTitleAndThumbnail() throws InterruptedException {
+        String previewTitle = "My Content Preview Title";
+        Intent sendIntent = createSendTextIntentWithPreview(previewTitle,
+                Uri.parse("android.resource://com.android.frameworks.coretests/"
+                        + com.android.frameworks.coretests.R.drawable.test320x240));
+        sOverrides.previewThumbnail = createBitmap();
+        List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2);
+
+        when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(),
+                Mockito.anyBoolean(),
+                Mockito.isA(List.class))).thenReturn(resolvedComponentInfos);
+        mActivityRule.launchActivity(Intent.createChooser(sendIntent, null));
+        waitForIdle();
+        onView(withId(R.id.content_preview_title)).check(matches(isDisplayed()));
+        onView(withId(R.id.content_preview_thumbnail)).check(matches(isDisplayed()));
+    }
+
+    @Test
     public void twoOptionsAndUserSelectsOne() throws InterruptedException {
-        Intent sendIntent = createSendImageIntent();
+        Intent sendIntent = createSendTextIntent();
         List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2);
 
         when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(),
@@ -125,7 +212,7 @@
 
     @Test
     public void updateChooserCountsAndModelAfterUserSelection() throws InterruptedException {
-        Intent sendIntent = createSendImageIntent();
+        Intent sendIntent = createSendTextIntent();
         List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2);
 
         when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(),
@@ -158,7 +245,7 @@
         when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(),
                 Mockito.anyBoolean(),
                 Mockito.isA(List.class))).thenReturn(null);
-        Intent sendIntent = createSendImageIntent();
+        Intent sendIntent = createSendTextIntent();
         final ChooserWrapperActivity activity = mActivityRule
                 .launchActivity(Intent.createChooser(sendIntent, null));
         waitForIdle();
@@ -186,7 +273,7 @@
                 Mockito.anyBoolean(),
                 Mockito.isA(List.class))).thenReturn(resolvedComponentInfos);
 
-        Intent sendIntent = createSendImageIntent();
+        Intent sendIntent = createSendTextIntent();
         final ChooserWrapperActivity activity = mActivityRule
                 .launchActivity(Intent.createChooser(sendIntent, null));
         waitForIdle();
@@ -197,7 +284,7 @@
 
     @Test
     public void hasOtherProfileOneOption() throws Exception {
-        Intent sendIntent = createSendImageIntent();
+        Intent sendIntent = createSendTextIntent();
         List<ResolvedComponentInfo> resolvedComponentInfos =
                 createResolvedComponentsForTestWithOtherProfile(2);
         ResolveInfo toChoose = resolvedComponentInfos.get(1).getResolveInfoAt(0);
@@ -234,7 +321,7 @@
 
     @Test
     public void hasOtherProfileTwoOptionsAndUserSelectsOne() throws Exception {
-        Intent sendIntent = createSendImageIntent();
+        Intent sendIntent = createSendTextIntent();
         List<ResolvedComponentInfo> resolvedComponentInfos =
                 createResolvedComponentsForTestWithOtherProfile(3);
         ResolveInfo toChoose = resolvedComponentInfos.get(1).getResolveInfoAt(0);
@@ -273,7 +360,7 @@
 
     @Test
     public void hasLastChosenActivityAndOtherProfile() throws Exception {
-        Intent sendIntent = createSendImageIntent();
+        Intent sendIntent = createSendTextIntent();
         List<ResolvedComponentInfo> resolvedComponentInfos =
                 createResolvedComponentsForTestWithOtherProfile(3);
         ResolveInfo toChoose = resolvedComponentInfos.get(1).getResolveInfoAt(0);
@@ -308,14 +395,59 @@
         assertThat(chosen[0], is(toChoose));
     }
 
-    private Intent createSendImageIntent() {
+    @Test
+    public void copyTextToClipboard() throws Exception {
+        Intent sendIntent = createSendTextIntent();
+        List<ResolvedComponentInfo> resolvedComponentInfos =
+                createResolvedComponentsForTestWithOtherProfile(1);
+
+        when(ChooserWrapperActivity.sOverrides.resolverListController.getResolversForIntent(
+                Mockito.anyBoolean(),
+                Mockito.anyBoolean(),
+                Mockito.isA(List.class))).thenReturn(resolvedComponentInfos);
+
+        final ChooserWrapperActivity activity = mActivityRule
+                .launchActivity(Intent.createChooser(sendIntent, null));
+        waitForIdle();
+
+        onView(withId(R.id.copy_button)).perform(click());
+
+        ClipboardManager clipboard = (ClipboardManager) activity.getSystemService(
+                Context.CLIPBOARD_SERVICE);
+        ClipData clipData = clipboard.getPrimaryClip();
+        assertThat("testing intent sending", is(clipData.getItemAt(0).getText()));
+
+        ClipDescription clipDescription = clipData.getDescription();
+        assertThat("text/plain", is(clipDescription.getMimeType(0)));
+    }
+
+    private Intent createSendTextIntent() {
         Intent sendIntent = new Intent();
         sendIntent.setAction(Intent.ACTION_SEND);
         sendIntent.putExtra(Intent.EXTRA_TEXT, "testing intent sending");
-        sendIntent.setType("image/jpeg");
         return sendIntent;
     }
 
+    private Intent createSendTextIntentWithPreview(String title, Uri imageThumbnail) {
+        Intent sendIntent = new Intent();
+        sendIntent.setAction(Intent.ACTION_SEND);
+        sendIntent.putExtra(Intent.EXTRA_TEXT, "testing intent sending");
+        sendIntent.putExtra(Intent.EXTRA_TITLE, title);
+        if (imageThumbnail != null) {
+            ClipData.Item clipItem = new ClipData.Item(imageThumbnail);
+            sendIntent.setClipData(new ClipData("Clip Label", new String[]{"image/png"}, clipItem));
+        }
+
+        return sendIntent;
+    }
+
+    private Intent createViewTextIntent() {
+        Intent viewIntent = new Intent();
+        viewIntent.setAction(Intent.ACTION_VIEW);
+        viewIntent.putExtra(Intent.EXTRA_TEXT, "testing intent viewing");
+        return viewIntent;
+    }
+
     private List<ResolvedComponentInfo> createResolvedComponentsForTest(int numberOfResults) {
         List<ResolvedComponentInfo> infoList = new ArrayList<>(numberOfResults);
         for (int i = 0; i < numberOfResults; i++) {
@@ -340,4 +472,24 @@
     private void waitForIdle() {
         InstrumentationRegistry.getInstrumentation().waitForIdleSync();
     }
-}
\ No newline at end of file
+
+    private Bitmap createBitmap() {
+        int width = 200;
+        int height = 200;
+        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+        Canvas canvas = new Canvas(bitmap);
+
+        Paint paint = new Paint();
+        paint.setColor(Color.RED);
+        paint.setStyle(Paint.Style.FILL);
+        canvas.drawPaint(paint);
+
+        paint.setColor(Color.WHITE);
+        paint.setAntiAlias(true);
+        paint.setTextSize(14.f);
+        paint.setTextAlign(Paint.Align.CENTER);
+        canvas.drawText("Hi!", (width / 2.f), (height / 2.f), paint);
+
+        return bitmap;
+    }
+}
diff --git a/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java b/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java
index 60529f6..637d2ea 100644
--- a/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java
+++ b/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java
@@ -21,6 +21,9 @@
 import android.app.usage.UsageStatsManager;
 import android.content.Context;
 import android.content.pm.PackageManager;
+import android.graphics.Bitmap;
+import android.net.Uri;
+import android.util.Size;
 
 import java.util.function.Function;
 
@@ -74,6 +77,14 @@
         return super.getPackageManager();
     }
 
+    @Override
+    protected Bitmap loadThumbnail(Uri uri, Size size) {
+        if (sOverrides.previewThumbnail != null) {
+            return sOverrides.previewThumbnail;
+        }
+        return super.loadThumbnail(uri, size);
+    }
+
     /**
      * We cannot directly mock the activity created since instrumentation creates it.
      * <p>
@@ -85,11 +96,13 @@
         public Function<TargetInfo, Boolean> onSafelyStartCallback;
         public ResolverListController resolverListController;
         public Boolean isVoiceInteraction;
+        public Bitmap previewThumbnail;
 
         public void reset() {
             onSafelyStartCallback = null;
             isVoiceInteraction = null;
             createPackageManager = null;
+            previewThumbnail = null;
             resolverListController = mock(ResolverListController.class);
         }
     }
diff --git a/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderEndToEndTest.java b/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderEndToEndTest.java
index c03d1f3..3ddd8aa 100644
--- a/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderEndToEndTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderEndToEndTest.java
@@ -20,6 +20,7 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import android.os.Process;
 import android.os.SystemClock;
 import android.support.test.filters.LargeTest;
 import android.support.test.runner.AndroidJUnit4;
@@ -121,7 +122,8 @@
         workFinishedLatch.await();
 
         // Get thread data from KernelCpuThreadReader
-        final KernelCpuThreadReader kernelCpuThreadReader = KernelCpuThreadReader.create();
+        final KernelCpuThreadReader kernelCpuThreadReader =
+                KernelCpuThreadReader.create(8, uid -> uid == Process.myUid());
         assertNotNull(kernelCpuThreadReader);
         final ProcessCpuUsage currentProcessCpuUsage =
                 kernelCpuThreadReader.getCurrentProcessCpuUsage();
diff --git a/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderTest.java
index 0c56b8a..b9744f5 100644
--- a/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderTest.java
@@ -18,8 +18,10 @@
 
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
+import static org.testng.Assert.assertThrows;
 
 import android.content.Context;
 import android.os.FileUtils;
@@ -99,6 +101,8 @@
                 THREAD_NAMES, THREAD_CPU_FREQUENCIES, THREAD_CPU_TIMES);
 
         final KernelCpuThreadReader kernelCpuThreadReader = new KernelCpuThreadReader(
+                8,
+                uid -> 1000 <= uid && uid < 2000,
                 mProcDirectory.toPath(),
                 mProcDirectory.toPath().resolve("self/task/" + THREAD_IDS[0] + "/time_in_state"),
                 processUtils);
@@ -138,11 +142,13 @@
                     new int[][]{{uid}});
         }
         final KernelCpuThreadReader kernelCpuThreadReader = new KernelCpuThreadReader(
+                8,
+                uidPredicate,
                 mProcDirectory.toPath(),
                 mProcDirectory.toPath().resolve(uids[0] + "/task/" + uids[0] + "/time_in_state"),
                 processUtils);
         ArrayList<KernelCpuThreadReader.ProcessCpuUsage> processCpuUsageByUids =
-                kernelCpuThreadReader.getProcessCpuUsageByUids(uidPredicate);
+                kernelCpuThreadReader.getProcessCpuUsageByUids();
         processCpuUsageByUids.sort(Comparator.comparing(usage -> usage.processId));
 
         assertEquals(expectedUids.length, processCpuUsageByUids.size());
@@ -350,4 +356,106 @@
                 4, KernelCpuThreadReader.FrequencyBucketCreator.getBigFrequenciesStartIndex(
                         new long[]{1, 2, 3, 4}));
     }
+
+    @Test
+    public void testUidPredicate_singleRange() {
+        KernelCpuThreadReaderSettingsObserver.UidPredicate uidPredicate =
+                KernelCpuThreadReaderSettingsObserver.UidPredicate.fromString("1000-1999");
+        assertTrue(uidPredicate.test(1000));
+        assertTrue(uidPredicate.test(1050));
+        assertTrue(uidPredicate.test(1999));
+        assertFalse(uidPredicate.test(2000));
+        assertFalse(uidPredicate.test(0));
+        assertFalse(uidPredicate.test(10000));
+        assertFalse(uidPredicate.test(-100));
+    }
+
+    @Test
+    public void testUidPredicate_singleUid() {
+        KernelCpuThreadReaderSettingsObserver.UidPredicate uidPredicate =
+                KernelCpuThreadReaderSettingsObserver.UidPredicate.fromString("1234-1234");
+        assertTrue(uidPredicate.test(1234));
+        assertFalse(uidPredicate.test(1235));
+        assertFalse(uidPredicate.test(1232));
+        assertFalse(uidPredicate.test(0));
+        assertFalse(uidPredicate.test(-1234));
+    }
+
+    @Test
+    public void testUidPredicate_uidAndRange() {
+        KernelCpuThreadReaderSettingsObserver.UidPredicate uidPredicate =
+                KernelCpuThreadReaderSettingsObserver.UidPredicate.fromString(
+                        "1000-1000;1050-1060");
+        assertTrue(uidPredicate.test(1000));
+        assertTrue(uidPredicate.test(1050));
+        assertTrue(uidPredicate.test(1054));
+        assertTrue(uidPredicate.test(1060));
+        assertFalse(uidPredicate.test(1040));
+        assertFalse(uidPredicate.test(1001));
+        assertFalse(uidPredicate.test(0));
+        assertFalse(uidPredicate.test(-1000));
+    }
+
+    @Test
+    public void testUidPredicate_multiple() {
+        KernelCpuThreadReaderSettingsObserver.UidPredicate uidPredicate =
+                KernelCpuThreadReaderSettingsObserver.UidPredicate.fromString(
+                        "1000-1000;1050-1060;1001-1001;2000-3000");
+        assertTrue(uidPredicate.test(1000));
+        assertTrue(uidPredicate.test(1001));
+        assertTrue(uidPredicate.test(1050));
+        assertTrue(uidPredicate.test(1054));
+        assertTrue(uidPredicate.test(1060));
+        assertTrue(uidPredicate.test(1001));
+        assertTrue(uidPredicate.test(2000));
+        assertTrue(uidPredicate.test(2444));
+        assertTrue(uidPredicate.test(3000));
+        assertFalse(uidPredicate.test(0));
+        assertFalse(uidPredicate.test(1040));
+        assertFalse(uidPredicate.test(3001));
+        assertFalse(uidPredicate.test(1999));
+    }
+
+    @Test
+    public void testUidPredicate_emptyRangeString() {
+        assertThrows(
+                NumberFormatException.class,
+                () -> KernelCpuThreadReaderSettingsObserver.UidPredicate.fromString(""));
+    }
+
+    @Test
+    public void testUidPredicate_singleNumber() {
+        assertThrows(
+                NumberFormatException.class,
+                () -> KernelCpuThreadReaderSettingsObserver.UidPredicate.fromString("1000"));
+    }
+
+    @Test
+    public void testUidPredicate_lettersInRange() {
+        assertThrows(
+                NumberFormatException.class,
+                () -> KernelCpuThreadReaderSettingsObserver.UidPredicate.fromString(
+                        "0-0;1-1;a;3-3"));
+    }
+
+    @Test
+    public void testUidPredicate_onlyLetters() {
+        assertThrows(
+                NumberFormatException.class,
+                () -> KernelCpuThreadReaderSettingsObserver.UidPredicate.fromString("abc"));
+    }
+
+    @Test
+    public void testUidPredicate_backwardsRange() {
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> KernelCpuThreadReaderSettingsObserver.UidPredicate.fromString("20-10"));
+    }
+
+    @Test
+    public void testUidPredicate_comma() {
+        assertThrows(
+                NumberFormatException.class,
+                () -> KernelCpuThreadReaderSettingsObserver.UidPredicate.fromString("1-1,2-2,3-3"));
+    }
 }
diff --git a/data/etc/platform.xml b/data/etc/platform.xml
index fb43e41..44d71e2 100644
--- a/data/etc/platform.xml
+++ b/data/etc/platform.xml
@@ -169,6 +169,7 @@
     <assign-permission name="android.permission.DUMP" uid="incidentd" />
     <assign-permission name="android.permission.PACKAGE_USAGE_STATS" uid="incidentd" />
     <assign-permission name="android.permission.INTERACT_ACROSS_USERS" uid="incidentd" />
+    <assign-permission name="android.permission.REQUEST_INCIDENT_REPORT_APPROVAL" uid="incidentd" />
 
     <assign-permission name="android.permission.ACCESS_LOWPAN_STATE" uid="lowpan" />
     <assign-permission name="android.permission.MANAGE_LOWPAN_INTERFACES" uid="lowpan" />
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 904c3fb..bcac5fd 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -87,6 +87,7 @@
         <permission name="android.permission.MASTER_CLEAR"/>
         <permission name="android.permission.NETWORK_MANAGED_PROVISIONING"/>
         <permission name="android.permission.PERFORM_CDMA_PROVISIONING"/>
+        <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
         <permission name="android.permission.SET_TIME"/>
         <permission name="android.permission.SET_TIME_ZONE"/>
         <permission name="android.permission.SHUTDOWN"/>
@@ -140,6 +141,8 @@
         <permission name="android.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS"/>
         <permission name="android.permission.GET_APP_OPS_STATS"/>
         <permission name="android.permission.UPDATE_APP_OPS_STATS"/>
+        <permission name="android.permission.REQUEST_INCIDENT_REPORT_APPROVAL"/>
+        <permission name="android.permission.APPROVE_INCIDENT_REPORTS"/>
     </privapp-permissions>
 
     <privapp-permissions package="com.android.phone">
@@ -326,6 +329,8 @@
         <permission name="android.permission.USE_RESERVED_DISK"/>
         <permission name="android.permission.WRITE_MEDIA_STORAGE"/>
         <permission name="android.permission.WRITE_SECURE_SETTINGS"/>
+        <permission name="android.permission.STATUS_BAR_SERVICE"/>
+        <permission name="android.permission.REQUEST_INCIDENT_REPORT_APPROVAL"/>
     </privapp-permissions>
 
     <privapp-permissions package="com.android.statementservice">
diff --git a/data/fonts/fonts.xml b/data/fonts/fonts.xml
index 21531ab..626bbf00 100644
--- a/data/fonts/fonts.xml
+++ b/data/fonts/fonts.xml
@@ -65,6 +65,7 @@
         <font weight="400" style="italic">NotoSerif-Italic.ttf</font>
         <font weight="700" style="italic">NotoSerif-BoldItalic.ttf</font>
     </family>
+    <alias name="serif-bold" to="serif" weight="700" />
     <alias name="times" to="serif" />
     <alias name="times new roman" to="serif" />
     <alias name="palatino" to="serif" />
diff --git a/graphics/java/android/graphics/BaseCanvas.java b/graphics/java/android/graphics/BaseCanvas.java
index 65aaba1..aaf40b4 100644
--- a/graphics/java/android/graphics/BaseCanvas.java
+++ b/graphics/java/android/graphics/BaseCanvas.java
@@ -17,6 +17,7 @@
 package android.graphics;
 
 import android.annotation.ColorInt;
+import android.annotation.ColorLong;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.Size;
@@ -258,6 +259,16 @@
         nDrawColor(mNativeCanvasWrapper, color, mode.getXfermode().porterDuffMode);
     }
 
+    /**
+     * Make lint happy.
+     * See {@link Canvas#drawColor(long, BlendMode)}
+     */
+    public void drawColor(@ColorLong long color, @NonNull BlendMode mode) {
+        ColorSpace cs = Color.colorSpace(color);
+        nDrawColor(mNativeCanvasWrapper, cs.getNativeInstance(), color,
+                mode.getXfermode().porterDuffMode);
+    }
+
     public void drawLine(float startX, float startY, float stopX, float stopY,
             @NonNull Paint paint) {
         throwIfHasHwBitmapInSwMode(paint);
@@ -669,6 +680,9 @@
 
     private static native void nDrawColor(long nativeCanvas, int color, int mode);
 
+    private static native void nDrawColor(long nativeCanvas, long nativeColorSpace,
+            @ColorLong long color, int mode);
+
     private static native void nDrawPaint(long nativeCanvas, long nativePaint);
 
     private static native void nDrawPoint(long canvasHandle, float x, float y, long paintHandle);
diff --git a/graphics/java/android/graphics/BaseRecordingCanvas.java b/graphics/java/android/graphics/BaseRecordingCanvas.java
index 4f60935..3e11741 100644
--- a/graphics/java/android/graphics/BaseRecordingCanvas.java
+++ b/graphics/java/android/graphics/BaseRecordingCanvas.java
@@ -17,6 +17,7 @@
 package android.graphics;
 
 import android.annotation.ColorInt;
+import android.annotation.ColorLong;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.Size;
@@ -217,6 +218,13 @@
     }
 
     @Override
+    public final void drawColor(@ColorLong long color, @NonNull BlendMode mode) {
+        ColorSpace cs = Color.colorSpace(color);
+        nDrawColor(mNativeCanvasWrapper, cs.getNativeInstance(), color,
+                mode.getXfermode().porterDuffMode);
+    }
+
+    @Override
     public final void drawLine(float startX, float startY, float stopX, float stopY,
             @NonNull Paint paint) {
         nDrawLine(mNativeCanvasWrapper, startX, startY, stopX, stopY, paint.getNativeInstance());
@@ -590,6 +598,10 @@
     private static native void nDrawColor(long nativeCanvas, int color, int mode);
 
     @FastNative
+    private static native void nDrawColor(long nativeCanvas, long nativeColorSpace,
+            @ColorLong long color, int mode);
+
+    @FastNative
     private static native void nDrawPaint(long nativeCanvas, long nativePaint);
 
     @FastNative
diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java
index 8636949..080c5d5 100644
--- a/graphics/java/android/graphics/Bitmap.java
+++ b/graphics/java/android/graphics/Bitmap.java
@@ -21,7 +21,6 @@
 import android.annotation.ColorLong;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
-import android.annotation.TestApi;
 import android.annotation.UnsupportedAppUsage;
 import android.annotation.WorkerThread;
 import android.content.res.ResourcesImpl;
@@ -31,6 +30,7 @@
 import android.os.StrictMode;
 import android.os.Trace;
 import android.util.DisplayMetrics;
+import android.util.Half;
 import android.util.Log;
 import android.view.ThreadedRenderer;
 
@@ -712,18 +712,6 @@
     }
 
     /**
-     * Create hardware bitmap backed GraphicBuffer.
-     *
-     * @return Bitmap or null if this GraphicBuffer has unsupported PixelFormat.
-     *         currently PIXEL_FORMAT_RGBA_8888 is the only supported format
-     * @hide
-     */
-    @UnsupportedAppUsage
-    public static Bitmap createHardwareBitmap(@NonNull GraphicBuffer graphicBuffer) {
-        return nativeCreateHardwareBitmap(graphicBuffer);
-    }
-
-    /**
      * Create a hardware bitmap backed by a {@link HardwareBuffer}.
      *
      * <p>The passed HardwareBuffer's usage flags must contain
@@ -1751,6 +1739,48 @@
     }
 
     /**
+     * <p>Modifies the bitmap to have the specified {@link ColorSpace}, without
+     * affecting the underlying allocation backing the bitmap.</p>
+     *
+     * @throws IllegalArgumentException If the specified color space is {@code null}, not
+     *         {@link ColorSpace.Model#RGB RGB}, has a transfer function that is not an
+     *         {@link ColorSpace.Rgb.TransferParameters ICC parametric curve}, or whose
+     *         components min/max values reduce the numerical range compared to the
+     *         previously assigned color space.
+     *
+     * @param colorSpace to assign to the bitmap
+     */
+    public void setColorSpace(@NonNull ColorSpace colorSpace) {
+        checkRecycled("setColorSpace called on a recycled bitmap");
+        if (colorSpace == null) {
+            throw new IllegalArgumentException("The colorSpace cannot be set to null");
+        }
+        if (getColorSpace() != null) {
+            if (mColorSpace.getComponentCount() != colorSpace.getComponentCount()) {
+                throw new IllegalArgumentException("The new ColorSpace must have the same "
+                        + "component count as the current ColorSpace");
+            }
+            for (int i = 0; i < mColorSpace.getComponentCount(); i++) {
+                if (mColorSpace.getMinValue(i) < colorSpace.getMinValue(i)) {
+                    throw new IllegalArgumentException("The new ColorSpace cannot increase the "
+                            + "minimum value for any of the components compared to the current "
+                            + "ColorSpace. To perform this type of conversion create a new Bitmap "
+                            + "in the desired ColorSpace and draw this Bitmap into it.");
+                }
+                if (mColorSpace.getMaxValue(i) > colorSpace.getMaxValue(i)) {
+                    throw new IllegalArgumentException("The new ColorSpace cannot decrease the "
+                            + "maximum value for any of the components compared to the current "
+                            + "ColorSpace/ To perform this type of conversion create a new Bitmap"
+                            + "in the desired ColorSpace and draw this Bitmap into it.");
+                }
+            }
+        }
+
+        nativeSetColorSpace(mNativePtr, colorSpace.getNativeInstance());
+        mColorSpace = colorSpace;
+    }
+
+    /**
      * Fills the bitmap's pixels with the specified {@link Color}.
      *
      * @throws IllegalStateException if the bitmap is not mutable.
@@ -1770,9 +1800,7 @@
      * @throws IllegalArgumentException if the color space encoded in the long
      *                                  is invalid or unknown.
      *
-     * @hide pending API approval
      */
-    @TestApi
     public void eraseColor(@ColorLong long c) {
         checkRecycled("Can't erase a recycled bitmap");
         if (!isMutable()) {
@@ -1804,6 +1832,45 @@
         return nativeGetPixel(mNativePtr, x, y);
     }
 
+    private static float clamp(float value, @NonNull ColorSpace cs, int index) {
+        return Math.max(Math.min(value, cs.getMaxValue(index)), cs.getMinValue(index));
+    }
+
+    /**
+     * Returns the {@link Color} at the specified location. Throws an exception
+     * if x or y are out of bounds (negative or >= to the width or height
+     * respectively).
+     *
+     * @param x    The x coordinate (0...width-1) of the pixel to return
+     * @param y    The y coordinate (0...height-1) of the pixel to return
+     * @return     The {@link Color} at the specified coordinate
+     * @throws IllegalArgumentException if x, y exceed the bitmap's bounds
+     * @throws IllegalStateException if the bitmap's config is {@link Config#HARDWARE}
+     *
+     */
+    public Color getColor(int x, int y) {
+        checkRecycled("Can't call getColor() on a recycled bitmap");
+        checkHardware("unable to getColor(), "
+                + "pixel access is not supported on Config#HARDWARE bitmaps");
+        checkPixelAccess(x, y);
+
+        final ColorSpace cs = getColorSpace();
+        if (cs.equals(ColorSpace.get(ColorSpace.Named.SRGB))) {
+            return Color.valueOf(nativeGetPixel(mNativePtr, x, y));
+        }
+        // The returned value is in kRGBA_F16_SkColorType, which is packed as
+        // four half-floats, r,g,b,a.
+        long rgba = nativeGetColor(mNativePtr, x, y);
+        float r = Half.toFloat((short) ((rgba >>  0) & 0xffff));
+        float g = Half.toFloat((short) ((rgba >> 16) & 0xffff));
+        float b = Half.toFloat((short) ((rgba >> 32) & 0xffff));
+        float a = Half.toFloat((short) ((rgba >> 48) & 0xffff));
+
+        // Skia may draw outside of the numerical range of the colorSpace.
+        // Clamp to get an expected value.
+        return Color.valueOf(clamp(r, cs, 0), clamp(g, cs, 1), clamp(b, cs, 2), a, cs);
+    }
+
     /**
      * Returns in pixels[] a copy of the data in the bitmap. Each value is
      * a packed int representing a {@link Color}. The stride parameter allows
@@ -2132,6 +2199,7 @@
     private static native boolean nativeIsConfigF16(long nativeBitmap);
 
     private static native int nativeGetPixel(long nativeBitmap, int x, int y);
+    private static native long nativeGetColor(long nativeBitmap, int x, int y);
     private static native void nativeGetPixels(long nativeBitmap, int[] pixels,
                                                int offset, int stride, int x, int y,
                                                int width, int height);
@@ -2169,11 +2237,11 @@
     private static native void nativePrepareToDraw(long nativeBitmap);
     private static native int nativeGetAllocationByteCount(long nativeBitmap);
     private static native Bitmap nativeCopyPreserveInternalConfig(long nativeBitmap);
-    private static native Bitmap nativeCreateHardwareBitmap(GraphicBuffer buffer);
     private static native Bitmap nativeWrapHardwareBufferBitmap(HardwareBuffer buffer,
                                                                 long nativeColorSpace);
     private static native GraphicBuffer nativeCreateGraphicBufferHandle(long nativeBitmap);
     private static native boolean nativeGetColorSpace(long nativePtr, float[] xyz, float[] params);
+    private static native void nativeSetColorSpace(long nativePtr, long nativeColorSpace);
     private static native boolean nativeIsSRGB(long nativePtr);
     private static native boolean nativeIsSRGBLinear(long nativePtr);
     private static native void nativeCopyColorSpace(long srcBitmap, long dstBitmap);
diff --git a/graphics/java/android/graphics/BitmapShader.java b/graphics/java/android/graphics/BitmapShader.java
index bcf7229..eb0f2e1 100644
--- a/graphics/java/android/graphics/BitmapShader.java
+++ b/graphics/java/android/graphics/BitmapShader.java
@@ -65,16 +65,6 @@
         return nativeCreate(nativeMatrix, mBitmap, mTileX, mTileY);
     }
 
-    /**
-     * @hide
-     */
-    @Override
-    protected Shader copy() {
-        final BitmapShader copy = new BitmapShader(mBitmap, mTileX, mTileY);
-        copyLocalMatrix(copy);
-        return copy;
-    }
-
     private static native long nativeCreate(long nativeMatrix, Bitmap bitmap,
             int shaderTileModeX, int shaderTileModeY);
 }
diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java
index 8c1bae2..034dff0 100644
--- a/graphics/java/android/graphics/Canvas.java
+++ b/graphics/java/android/graphics/Canvas.java
@@ -17,6 +17,7 @@
 package android.graphics;
 
 import android.annotation.ColorInt;
+import android.annotation.ColorLong;
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -1682,6 +1683,18 @@
     }
 
     /**
+     * Fill the entire canvas' bitmap (restricted to the current clip) with the specified color,
+     * using srcover porterduff mode.
+     *
+     * @param color the color to draw onto the canvas
+     * @throws IllegalArgumentException if the color space encoded in the long
+     *                                  is invalid or unknown.
+     */
+    public void drawColor(@ColorLong long color) {
+        super.drawColor(color, BlendMode.SRC_OVER);
+    }
+
+    /**
      * Fill the entire canvas' bitmap (restricted to the current clip) with the specified color and
      * porter-duff xfermode.
      *
@@ -1707,6 +1720,19 @@
     }
 
     /**
+     * Fill the entire canvas' bitmap (restricted to the current clip) with the specified color and
+     * blendmode.
+     *
+     * @param color the color to draw with
+     * @param mode the blendmode to apply to the color
+     * @throws IllegalArgumentException if the color space encoded in the long
+     *                                  is invalid or unknown.
+     */
+    public void drawColor(@ColorLong long color, @NonNull BlendMode mode) {
+        super.drawColor(color, mode);
+    }
+
+    /**
      * Draw a line segment with the specified start and stop x,y coordinates, using the specified
      * paint.
      * <p>
diff --git a/graphics/java/android/graphics/ComposeShader.java b/graphics/java/android/graphics/ComposeShader.java
index 70a5f53..189e174 100644
--- a/graphics/java/android/graphics/ComposeShader.java
+++ b/graphics/java/android/graphics/ComposeShader.java
@@ -87,17 +87,6 @@
         }
     }
 
-    /**
-     * @hide
-     */
-    @Override
-    protected Shader copy() {
-        final ComposeShader copy = new ComposeShader(
-                mShaderA.copy(), mShaderB.copy(), mPorterDuffMode);
-        copyLocalMatrix(copy);
-        return copy;
-    }
-
     private static native long nativeCreate(long nativeMatrix,
             long nativeShaderA, long nativeShaderB, int porterDuffMode);
 }
diff --git a/graphics/java/android/graphics/ImageFormat.java b/graphics/java/android/graphics/ImageFormat.java
index c580c46..0787d85 100644
--- a/graphics/java/android/graphics/ImageFormat.java
+++ b/graphics/java/android/graphics/ImageFormat.java
@@ -183,6 +183,14 @@
     public static final int JPEG = 0x100;
 
     /**
+     * Depth augmented compressed JPEG format.
+     *
+     * <p>JPEG compressed main image along with XMP embedded depth metadata
+     * following ISO 16684-1:2011(E).</p>
+     */
+    public static final int DEPTH_JPEG = 0x69656963;
+
+    /**
      * <p>Multi-plane Android YUV 420 format</p>
      *
      * <p>This format is a generic YCbCr format, capable of describing any 4:2:0
@@ -787,6 +795,7 @@
             case PRIVATE:
             case RAW_DEPTH:
             case Y8:
+            case DEPTH_JPEG:
                 return true;
         }
 
diff --git a/graphics/java/android/graphics/LinearGradient.java b/graphics/java/android/graphics/LinearGradient.java
index 7e6fc35..12e63c0 100644
--- a/graphics/java/android/graphics/LinearGradient.java
+++ b/graphics/java/android/graphics/LinearGradient.java
@@ -17,21 +17,13 @@
 package android.graphics;
 
 import android.annotation.ColorInt;
+import android.annotation.ColorLong;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.UnsupportedAppUsage;
 
+
 public class LinearGradient extends Shader {
-
-    private static final int TYPE_COLORS_AND_POSITIONS = 1;
-    private static final int TYPE_COLOR_START_AND_COLOR_END = 2;
-
-    /**
-     * Type of the LinearGradient: can be either TYPE_COLORS_AND_POSITIONS or
-     * TYPE_COLOR_START_AND_COLOR_END.
-     */
-    private int mType;
-
     @UnsupportedAppUsage
     private float mX0;
     @UnsupportedAppUsage
@@ -41,16 +33,43 @@
     @UnsupportedAppUsage
     private float mY1;
     @UnsupportedAppUsage
-    private int[] mColors;
-    @UnsupportedAppUsage
     private float[] mPositions;
     @UnsupportedAppUsage
+    private TileMode mTileMode;
+
+    // @ColorInts are replaced by @ColorLongs, but these remain due to @UnsupportedAppUsage.
+    @UnsupportedAppUsage
+    @ColorInt
+    private int[] mColors;
+    @UnsupportedAppUsage
+    @ColorInt
     private int mColor0;
     @UnsupportedAppUsage
+    @ColorInt
     private int mColor1;
 
-    @UnsupportedAppUsage
-    private TileMode mTileMode;
+    @ColorLong
+    private final long[] mColorLongs;
+
+
+    /**
+     * Create a shader that draws a linear gradient along a line.
+     *
+     * @param x0           The x-coordinate for the start of the gradient line
+     * @param y0           The y-coordinate for the start of the gradient line
+     * @param x1           The x-coordinate for the end of the gradient line
+     * @param y1           The y-coordinate for the end of the gradient line
+     * @param colors       The sRGB colors to be distributed along the gradient line
+     * @param positions    May be null. The relative positions [0..1] of
+     *                     each corresponding color in the colors array. If this is null,
+     *                     the the colors are distributed evenly along the gradient line.
+     * @param tile         The Shader tiling mode
+     */
+    public LinearGradient(float x0, float y0, float x1, float y1, @NonNull @ColorInt int[] colors,
+            @Nullable float[] positions, @NonNull TileMode tile) {
+        this(x0, y0, x1, y1, convertColors(colors), positions, tile,
+                ColorSpace.get(ColorSpace.Named.SRGB));
+    }
 
     /**
      * Create a shader that draws a linear gradient along a line.
@@ -64,21 +83,33 @@
      *                     each corresponding color in the colors array. If this is null,
      *                     the the colors are distributed evenly along the gradient line.
      * @param tile         The Shader tiling mode
-    */
-    public LinearGradient(float x0, float y0, float x1, float y1, @NonNull @ColorInt int colors[],
-            @Nullable float positions[], @NonNull TileMode tile) {
-        if (colors.length < 2) {
-            throw new IllegalArgumentException("needs >= 2 number of colors");
-        }
+     *
+     * @throws IllegalArgumentException if there are less than two colors, the colors do
+     *      not share the same {@link ColorSpace} or do not use a valid one, or {@code positions}
+     *      is not {@code null} and has a different length from {@code colors}.
+     */
+    public LinearGradient(float x0, float y0, float x1, float y1, @NonNull @ColorLong long[] colors,
+            @Nullable float[] positions, @NonNull TileMode tile) {
+        this(x0, y0, x1, y1, colors.clone(), positions, tile, detectColorSpace(colors));
+    }
+
+    /**
+     * Base constructor. Assumes @param colors is a copy that this object can hold onto,
+     * and all colors share @param colorSpace.
+     */
+    private LinearGradient(float x0, float y0, float x1, float y1,
+            @NonNull @ColorLong long[] colors, @Nullable float[] positions, @NonNull TileMode tile,
+            @NonNull ColorSpace colorSpace) {
+        super(colorSpace);
+
         if (positions != null && colors.length != positions.length) {
             throw new IllegalArgumentException("color and position arrays must be of equal length");
         }
-        mType = TYPE_COLORS_AND_POSITIONS;
         mX0 = x0;
         mY0 = y0;
         mX1 = x1;
         mY1 = y1;
-        mColors = colors.clone();
+        mColorLongs = colors;
         mPositions = positions != null ? positions.clone() : null;
         mTileMode = tile;
     }
@@ -90,54 +121,43 @@
      * @param y0       The y-coordinate for the start of the gradient line
      * @param x1       The x-coordinate for the end of the gradient line
      * @param y1       The y-coordinate for the end of the gradient line
+     * @param color0   The sRGB color at the start of the gradient line.
+     * @param color1   The sRGB color at the end of the gradient line.
+     * @param tile     The Shader tiling mode
+     */
+    public LinearGradient(float x0, float y0, float x1, float y1,
+            @ColorInt int color0, @ColorInt int color1,
+            @NonNull TileMode tile) {
+        this(x0, y0, x1, y1, Color.pack(color0), Color.pack(color1), tile);
+    }
+
+    /**
+     * Create a shader that draws a linear gradient along a line.
+     *
+     * @param x0       The x-coordinate for the start of the gradient line
+     * @param y0       The y-coordinate for the start of the gradient line
+     * @param x1       The x-coordinate for the end of the gradient line
+     * @param y1       The y-coordinate for the end of the gradient line
      * @param color0   The color at the start of the gradient line.
      * @param color1   The color at the end of the gradient line.
      * @param tile     The Shader tiling mode
-    */
+     *
+     * @throws IllegalArgumentException if the colors do
+     *      not share the same {@link ColorSpace} or do not use a valid one.
+     */
     public LinearGradient(float x0, float y0, float x1, float y1,
-            @ColorInt int color0, @ColorInt int color1,
+            @ColorLong long color0, @ColorLong long color1,
             @NonNull TileMode tile) {
-        mType = TYPE_COLOR_START_AND_COLOR_END;
-        mX0 = x0;
-        mY0 = y0;
-        mX1 = x1;
-        mY1 = y1;
-        mColor0 = color0;
-        mColor1 = color1;
-        mColors = null;
-        mPositions = null;
-        mTileMode = tile;
+        this(x0, y0, x1, y1, new long[] {color0, color1}, null, tile);
     }
 
     @Override
     long createNativeInstance(long nativeMatrix) {
-        if (mType == TYPE_COLORS_AND_POSITIONS) {
-            return nativeCreate1(nativeMatrix, mX0, mY0, mX1, mY1,
-                    mColors, mPositions, mTileMode.nativeInt);
-        } else { // TYPE_COLOR_START_AND_COLOR_END
-            return nativeCreate2(nativeMatrix, mX0, mY0, mX1, mY1,
-                    mColor0, mColor1, mTileMode.nativeInt);
-        }
+        return nativeCreate(nativeMatrix, mX0, mY0, mX1, mY1,
+                mColorLongs, mPositions, mTileMode.nativeInt,
+                colorSpace().getNativeInstance());
     }
 
-    /**
-     * @hide
-     */
-    @Override
-    protected Shader copy() {
-        final LinearGradient copy;
-        if (mType == TYPE_COLORS_AND_POSITIONS) {
-            copy = new LinearGradient(mX0, mY0, mX1, mY1, mColors.clone(),
-                    mPositions != null ? mPositions.clone() : null, mTileMode);
-        } else { // TYPE_COLOR_START_AND_COLOR_END
-            copy = new LinearGradient(mX0, mY0, mX1, mY1, mColor0, mColor1, mTileMode);
-        }
-        copyLocalMatrix(copy);
-        return copy;
-    }
-
-    private native long nativeCreate1(long matrix, float x0, float y0, float x1, float y1,
-            int colors[], float positions[], int tileMode);
-    private native long nativeCreate2(long matrix, float x0, float y0, float x1, float y1,
-            int color0, int color1, int tileMode);
+    private native long nativeCreate(long matrix, float x0, float y0, float x1, float y1,
+            long[] colors, float[] positions, int tileMode, long colorSpaceHandle);
 }
diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java
index 7eee6f4..73442db 100644
--- a/graphics/java/android/graphics/Paint.java
+++ b/graphics/java/android/graphics/Paint.java
@@ -24,7 +24,6 @@
 import android.annotation.Nullable;
 import android.annotation.Px;
 import android.annotation.Size;
-import android.annotation.TestApi;
 import android.annotation.UnsupportedAppUsage;
 import android.graphics.fonts.FontVariationAxis;
 import android.os.Build;
@@ -974,10 +973,7 @@
      * @see Color for APIs that help manipulate a color long.
      *
      * @return the paint's color (and alpha).
-     *
-     * @hide pending API approval
      */
-    @TestApi
     @ColorLong
     public long getColorLong() {
         return mColor;
@@ -1006,10 +1002,7 @@
      *      to set in the paint.
      * @throws IllegalArgumentException if the color space encoded in the long
      *      is invalid or unknown.
-     *
-     * @hide pending API approval
      */
-    @TestApi
     public void setColor(@ColorLong long color) {
         ColorSpace cs = Color.colorSpace(color);
         float r = Color.red(color);
@@ -1445,10 +1438,7 @@
      *
      * @throws IllegalArgumentException if the color space encoded in the long
      *      is invalid or unknown.
-     *
-     * @hide pending API approval
      */
-    @TestApi
     public void setShadowLayer(float radius, float dx, float dy, @ColorLong long shadowColor) {
         ColorSpace cs = Color.colorSpace(shadowColor);
         float r = Color.red(shadowColor);
@@ -1517,9 +1507,7 @@
      * Returns the color of the shadow layer.
      * @see #setShadowLayer(float,float,float,int)
      * @see #setShadowLayer(float,float,float,long)
-     * @hide pending API approval
      */
-    @TestApi
     public @ColorLong long getShadowLayerColorLong() {
         return mShadowLayerColor;
     }
diff --git a/graphics/java/android/graphics/PixelFormat.java b/graphics/java/android/graphics/PixelFormat.java
index 96d6eee..dde757b 100644
--- a/graphics/java/android/graphics/PixelFormat.java
+++ b/graphics/java/android/graphics/PixelFormat.java
@@ -90,6 +90,9 @@
     public static final int RGBA_F16     = 0x16;
     public static final int RGBA_1010102 = 0x2B;
 
+    /** @hide */
+    public static final int HSV_888 = 0x37;
+
     /**
      * @deprecated use {@link android.graphics.ImageFormat#JPEG
      * ImageFormat.JPEG} instead.
@@ -109,6 +112,7 @@
                 info.bytesPerPixel = 4;
                 break;
             case RGB_888:
+            case HSV_888:
                 info.bitsPerPixel = 24;
                 info.bytesPerPixel = 3;
                 break;
@@ -227,6 +231,8 @@
                 return "RGBA_F16";
             case RGBA_1010102:
                 return "RGBA_1010102";
+            case HSV_888:
+                return "HSV_888";
             case JPEG:
                 return "JPEG";
             default:
diff --git a/graphics/java/android/graphics/RadialGradient.java b/graphics/java/android/graphics/RadialGradient.java
index 41d2628..acbe3da 100644
--- a/graphics/java/android/graphics/RadialGradient.java
+++ b/graphics/java/android/graphics/RadialGradient.java
@@ -16,22 +16,13 @@
 
 package android.graphics;
 
+import android.annotation.ColorInt;
+import android.annotation.ColorLong;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
-import android.annotation.ColorInt;
 import android.annotation.UnsupportedAppUsage;
 
 public class RadialGradient extends Shader {
-
-    private static final int TYPE_COLORS_AND_POSITIONS = 1;
-    private static final int TYPE_COLOR_CENTER_AND_COLOR_EDGE = 2;
-
-    /**
-     * Type of the RadialGradient: can be either TYPE_COLORS_AND_POSITIONS or
-     * TYPE_COLOR_CENTER_AND_COLOR_EDGE.
-     */
-    private int mType;
-
     @UnsupportedAppUsage
     private float mX;
     @UnsupportedAppUsage
@@ -39,16 +30,43 @@
     @UnsupportedAppUsage
     private float mRadius;
     @UnsupportedAppUsage
-    private int[] mColors;
-    @UnsupportedAppUsage
     private float[] mPositions;
     @UnsupportedAppUsage
+    private TileMode mTileMode;
+
+    // @ColorInts are replaced by @ColorLongs, but these remain due to @UnsupportedAppUsage.
+    @UnsupportedAppUsage
+    @ColorInt
+    private int[] mColors;
+    @UnsupportedAppUsage
+    @ColorInt
     private int mCenterColor;
     @UnsupportedAppUsage
+    @ColorInt
     private int mEdgeColor;
 
-    @UnsupportedAppUsage
-    private TileMode mTileMode;
+    @ColorLong
+    private final long[] mColorLongs;
+
+    /**
+     * Create a shader that draws a radial gradient given the center and radius.
+     *
+     * @param centerX  The x-coordinate of the center of the radius
+     * @param centerY  The y-coordinate of the center of the radius
+     * @param radius   Must be positive. The radius of the circle for this gradient.
+     * @param colors   The sRGB colors to be distributed between the center and edge of the circle
+     * @param stops    May be <code>null</code>. Valid values are between <code>0.0f</code> and
+     *                 <code>1.0f</code>. The relative position of each corresponding color in
+     *                 the colors array. If <code>null</code>, colors are distributed evenly
+     *                 between the center and edge of the circle.
+     * @param tileMode The Shader tiling mode
+     */
+    public RadialGradient(float centerX, float centerY, float radius,
+            @NonNull @ColorInt int[] colors, @Nullable float[] stops,
+            @NonNull TileMode tileMode) {
+        this(centerX, centerY, radius, convertColors(colors), stops, tileMode,
+                ColorSpace.get(ColorSpace.Named.SRGB));
+    }
 
     /**
      * Create a shader that draws a radial gradient given the center and radius.
@@ -62,24 +80,36 @@
      *                 the colors array. If <code>null</code>, colors are distributed evenly
      *                 between the center and edge of the circle.
      * @param tileMode The Shader tiling mode
+     *
+     * @throws IllegalArgumentException if there are less than two colors, the colors do
+     *      not share the same {@link ColorSpace} or do not use a valid one, or {@code stops}
+     *      is not {@code null} and has a different length from {@code colors}.
      */
     public RadialGradient(float centerX, float centerY, float radius,
-            @NonNull @ColorInt int colors[], @Nullable float stops[],
+            @NonNull @ColorLong long[] colors, @Nullable float[] stops,
             @NonNull TileMode tileMode) {
+        this(centerX, centerY, radius, colors.clone(), stops, tileMode, detectColorSpace(colors));
+    }
+
+    /**
+     * Base constructor. Assumes @param colors is a copy that this object can hold onto,
+     * and all colors share @param colorSpace.
+     */
+    private RadialGradient(float centerX, float centerY, float radius,
+            @NonNull @ColorLong long[] colors, @Nullable float[] stops,
+            @NonNull TileMode tileMode, ColorSpace colorSpace) {
+        super(colorSpace);
+
         if (radius <= 0) {
             throw new IllegalArgumentException("radius must be > 0");
         }
-        if (colors.length < 2) {
-            throw new IllegalArgumentException("needs >= 2 number of colors");
-        }
         if (stops != null && colors.length != stops.length) {
             throw new IllegalArgumentException("color and position arrays must be of equal length");
         }
-        mType = TYPE_COLORS_AND_POSITIONS;
         mX = centerX;
         mY = centerY;
         mRadius = radius;
-        mColors = colors.clone();
+        mColorLongs = colors;
         mPositions = stops != null ? stops.clone() : null;
         mTileMode = tileMode;
     }
@@ -90,54 +120,41 @@
      * @param centerX     The x-coordinate of the center of the radius
      * @param centerY     The y-coordinate of the center of the radius
      * @param radius      Must be positive. The radius of the circle for this gradient
+     * @param centerColor The sRGB color at the center of the circle.
+     * @param edgeColor   The sRGB color at the edge of the circle.
+     * @param tileMode    The Shader tiling mode
+     */
+    public RadialGradient(float centerX, float centerY, float radius,
+            @ColorInt int centerColor, @ColorInt int edgeColor, @NonNull TileMode tileMode) {
+        this(centerX, centerY, radius, Color.pack(centerColor), Color.pack(edgeColor), tileMode);
+    }
+
+    /**
+     * Create a shader that draws a radial gradient given the center and radius.
+     *
+     * @param centerX     The x-coordinate of the center of the radius
+     * @param centerY     The y-coordinate of the center of the radius
+     * @param radius      Must be positive. The radius of the circle for this gradient
      * @param centerColor The color at the center of the circle.
      * @param edgeColor   The color at the edge of the circle.
      * @param tileMode    The Shader tiling mode
+     *
+     * @throws IllegalArgumentException if the colors do
+     *      not share the same {@link ColorSpace} or do not use a valid one.
      */
     public RadialGradient(float centerX, float centerY, float radius,
-            @ColorInt int centerColor, @ColorInt int edgeColor, @NonNull TileMode tileMode) {
-        if (radius <= 0) {
-            throw new IllegalArgumentException("radius must be > 0");
-        }
-        mType = TYPE_COLOR_CENTER_AND_COLOR_EDGE;
-        mX = centerX;
-        mY = centerY;
-        mRadius = radius;
-        mCenterColor = centerColor;
-        mEdgeColor = edgeColor;
-        mTileMode = tileMode;
+            @ColorLong long centerColor, @ColorLong long edgeColor, @NonNull TileMode tileMode) {
+        this(centerX, centerY, radius, new long[] {centerColor, edgeColor}, null, tileMode);
     }
 
     @Override
     long createNativeInstance(long nativeMatrix) {
-        if (mType == TYPE_COLORS_AND_POSITIONS) {
-            return nativeCreate1(nativeMatrix, mX, mY, mRadius,
-                    mColors, mPositions, mTileMode.nativeInt);
-        } else { // TYPE_COLOR_CENTER_AND_COLOR_EDGE
-            return nativeCreate2(nativeMatrix, mX, mY, mRadius,
-                    mCenterColor, mEdgeColor, mTileMode.nativeInt);
-        }
+        return nativeCreate(nativeMatrix, mX, mY, mRadius,
+                mColorLongs, mPositions, mTileMode.nativeInt,
+                colorSpace().getNativeInstance());
     }
 
-    /**
-     * @hide
-     */
-    @Override
-    protected Shader copy() {
-        final RadialGradient copy;
-        if (mType == TYPE_COLORS_AND_POSITIONS) {
-            copy = new RadialGradient(mX, mY, mRadius, mColors.clone(),
-                    mPositions != null ? mPositions.clone() : null, mTileMode);
-        } else { // TYPE_COLOR_CENTER_AND_COLOR_EDGE
-            copy = new RadialGradient(mX, mY, mRadius, mCenterColor, mEdgeColor, mTileMode);
-        }
-        copyLocalMatrix(copy);
-        return copy;
-    }
-
-    private static native long nativeCreate1(long matrix, float x, float y, float radius,
-            int colors[], float positions[], int tileMode);
-    private static native long nativeCreate2(long matrix, float x, float y, float radius,
-            int color0, int color1, int tileMode);
+    private static native long nativeCreate(long matrix, float x, float y, float radius,
+            @ColorLong long[] colors, float[] positions, int tileMode, long colorSpaceHandle);
 }
 
diff --git a/graphics/java/android/graphics/Shader.java b/graphics/java/android/graphics/Shader.java
index 40bcc9e..d555128 100644
--- a/graphics/java/android/graphics/Shader.java
+++ b/graphics/java/android/graphics/Shader.java
@@ -16,6 +16,8 @@
 
 package android.graphics;
 
+import android.annotation.ColorInt;
+import android.annotation.ColorLong;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.UnsupportedAppUsage;
@@ -39,7 +41,32 @@
      * @deprecated Use subclass constructors directly instead.
      */
     @Deprecated
-    public Shader() {}
+    public Shader() {
+        mColorSpace = null;
+    }
+
+    /**
+     * @hide
+     */
+    public Shader(ColorSpace colorSpace) {
+        mColorSpace = colorSpace;
+        if (colorSpace == null) {
+            throw new IllegalArgumentException(
+                    "Use Shader() to create a Shader with no ColorSpace");
+        }
+
+        // This just ensures that if the ColorSpace is invalid, the Exception will be thrown now.
+        mColorSpace.getNativeInstance();
+    }
+
+    private final ColorSpace mColorSpace;
+
+    /**
+     * @hide
+     */
+    protected ColorSpace colorSpace() {
+        return mColorSpace;
+    }
 
     /**
      * Current native shader instance. Created and updated lazily when {@link #getNativeInstance()}
@@ -135,21 +162,6 @@
     protected void verifyNativeInstance() {
     }
 
-    /**
-     * @hide
-     */
-    protected Shader copy() {
-        final Shader copy = new Shader();
-        copyLocalMatrix(copy);
-        return copy;
-    }
-
-    /**
-     * @hide
-     */
-    protected void copyLocalMatrix(Shader dest) {
-        dest.mLocalMatrix.set(mLocalMatrix);
-    }
 
     /**
      * @hide
@@ -169,6 +181,43 @@
         return mNativeInstance;
     }
 
+    /**
+     * @hide
+     */
+    public static @ColorLong long[] convertColors(@NonNull @ColorInt int[] colors) {
+        if (colors.length < 2) {
+            throw new IllegalArgumentException("needs >= 2 number of colors");
+        }
+
+        long[] colorLongs = new long[colors.length];
+        for (int i = 0; i < colors.length; ++i) {
+            colorLongs[i] = Color.pack(colors[i]);
+        }
+
+        return colorLongs;
+    }
+
+    /**
+     * Detect the ColorSpace that the {@code colors} share.
+     *
+     * @throws IllegalArgumentException if the colors do not all share the same,
+     *      valid ColorSpace, or if there are less than 2 colors.
+     *
+     * @hide
+     */
+    public static ColorSpace detectColorSpace(@NonNull @ColorLong long[] colors) {
+        if (colors.length < 2) {
+            throw new IllegalArgumentException("needs >= 2 number of colors");
+        }
+        final ColorSpace colorSpace = Color.colorSpace(colors[0]);
+        for (int i = 1; i < colors.length; ++i) {
+            if (Color.colorSpace(colors[i]) != colorSpace) {
+                throw new IllegalArgumentException("All colors must be in the same ColorSpace!");
+            }
+        }
+        return colorSpace;
+    }
+
     private static native long nativeGetFinalizer();
 
 }
diff --git a/graphics/java/android/graphics/SweepGradient.java b/graphics/java/android/graphics/SweepGradient.java
index f944d85..667f45a 100644
--- a/graphics/java/android/graphics/SweepGradient.java
+++ b/graphics/java/android/graphics/SweepGradient.java
@@ -17,34 +17,52 @@
 package android.graphics;
 
 import android.annotation.ColorInt;
+import android.annotation.ColorLong;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.UnsupportedAppUsage;
 
 public class SweepGradient extends Shader {
-
-    private static final int TYPE_COLORS_AND_POSITIONS = 1;
-    private static final int TYPE_COLOR_START_AND_COLOR_END = 2;
-
-    /**
-     * Type of the LinearGradient: can be either TYPE_COLORS_AND_POSITIONS or
-     * TYPE_COLOR_START_AND_COLOR_END.
-     */
-    private int mType;
-
     @UnsupportedAppUsage
     private float mCx;
     @UnsupportedAppUsage
     private float mCy;
     @UnsupportedAppUsage
+    private float[] mPositions;
+
+    // @ColorInts are replaced by @ColorLongs, but these remain due to @UnsupportedAppUsage.
+    @UnsupportedAppUsage
+    @ColorInt
     private int[] mColors;
     @UnsupportedAppUsage
-    private float[] mPositions;
-    @UnsupportedAppUsage
+    @ColorInt
     private int mColor0;
     @UnsupportedAppUsage
+    @ColorInt
     private int mColor1;
 
+    @ColorLong
+    private final long[] mColorLongs;
+
+    /**
+     * A Shader that draws a sweep gradient around a center point.
+     *
+     * @param cx       The x-coordinate of the center
+     * @param cy       The y-coordinate of the center
+     * @param colors   The sRGB colors to be distributed between around the center.
+     *                 There must be at least 2 colors in the array.
+     * @param positions May be NULL. The relative position of
+     *                 each corresponding color in the colors array, beginning
+     *                 with 0 and ending with 1.0. If the values are not
+     *                 monotonic, the drawing may produce unexpected results.
+     *                 If positions is NULL, then the colors are automatically
+     *                 spaced evenly.
+     */
+    public SweepGradient(float cx, float cy, @NonNull @ColorInt int[] colors,
+            @Nullable float[] positions) {
+        this(cx, cy, convertColors(colors), positions, ColorSpace.get(ColorSpace.Named.SRGB));
+    }
+
     /**
      * A Shader that draws a sweep gradient around a center point.
      *
@@ -58,20 +76,30 @@
      *                 monotonic, the drawing may produce unexpected results.
      *                 If positions is NULL, then the colors are automatically
      *                 spaced evenly.
+     * @throws IllegalArgumentException if there are less than two colors, the colors do
+     *      not share the same {@link ColorSpace} or do not use a valid one, or {@code positions}
+     *      is not {@code null} and has a different length from {@code colors}.
      */
-    public SweepGradient(float cx, float cy,
-            @NonNull @ColorInt int colors[], @Nullable float positions[]) {
-        if (colors.length < 2) {
-            throw new IllegalArgumentException("needs >= 2 number of colors");
-        }
+    public SweepGradient(float cx, float cy, @NonNull @ColorLong long[] colors,
+            @Nullable float[] positions) {
+        this(cx, cy, colors.clone(), positions, detectColorSpace(colors));
+    }
+
+    /**
+     * Base constructor. Assumes @param colors is a copy that this object can hold onto,
+     * and all colors share @param colorSpace.
+     */
+    private SweepGradient(float cx, float cy, @NonNull @ColorLong long[] colors,
+            @Nullable float[] positions, ColorSpace colorSpace) {
+        super(colorSpace);
+
         if (positions != null && colors.length != positions.length) {
             throw new IllegalArgumentException(
                     "color and position arrays must be of equal length");
         }
-        mType = TYPE_COLORS_AND_POSITIONS;
         mCx = cx;
         mCy = cy;
-        mColors = colors.clone();
+        mColorLongs = colors;
         mPositions = positions != null ? positions.clone() : null;
     }
 
@@ -80,47 +108,35 @@
      *
      * @param cx       The x-coordinate of the center
      * @param cy       The y-coordinate of the center
+     * @param color0   The sRGB color to use at the start of the sweep
+     * @param color1   The sRGB color to use at the end of the sweep
+     */
+    public SweepGradient(float cx, float cy, @ColorInt int color0, @ColorInt int color1) {
+        this(cx, cy, Color.pack(color0), Color.pack(color1));
+    }
+
+    /**
+     * A Shader that draws a sweep gradient around a center point.
+     *
+     * @param cx       The x-coordinate of the center
+     * @param cy       The y-coordinate of the center
      * @param color0   The color to use at the start of the sweep
      * @param color1   The color to use at the end of the sweep
+     *
+     * @throws IllegalArgumentException if the colors do
+     *      not share the same {@link ColorSpace} or do not use a valid one.
      */
-    public SweepGradient(float cx, float cy, @ColorInt int color0, @ColorInt int color1) {
-        mType = TYPE_COLOR_START_AND_COLOR_END;
-        mCx = cx;
-        mCy = cy;
-        mColor0 = color0;
-        mColor1 = color1;
-        mColors = null;
-        mPositions = null;
+    public SweepGradient(float cx, float cy, @ColorLong long color0, @ColorLong long color1) {
+        this(cx, cy, new long[] {color0, color1}, null);
     }
 
     @Override
     long createNativeInstance(long nativeMatrix) {
-        if (mType == TYPE_COLORS_AND_POSITIONS) {
-            return nativeCreate1(nativeMatrix, mCx, mCy, mColors, mPositions);
-        } else { // TYPE_COLOR_START_AND_COLOR_END
-            return nativeCreate2(nativeMatrix, mCx, mCy, mColor0, mColor1);
-        }
+        return nativeCreate(nativeMatrix, mCx, mCy, mColorLongs, mPositions,
+                colorSpace().getNativeInstance());
     }
 
-    /**
-     * @hide
-     */
-    @Override
-    protected Shader copy() {
-        final SweepGradient copy;
-        if (mType == TYPE_COLORS_AND_POSITIONS) {
-            copy = new SweepGradient(mCx, mCy, mColors.clone(),
-                    mPositions != null ? mPositions.clone() : null);
-        } else { // TYPE_COLOR_START_AND_COLOR_END
-            copy = new SweepGradient(mCx, mCy, mColor0, mColor1);
-        }
-        copyLocalMatrix(copy);
-        return copy;
-    }
-
-    private static native long nativeCreate1(long matrix, float x, float y,
-            int colors[], float positions[]);
-    private static native long nativeCreate2(long matrix, float x, float y,
-            int color0, int color1);
+    private static native long nativeCreate(long matrix, float x, float y,
+            long[] colors, float[] positions, long colorSpaceHandle);
 }
 
diff --git a/graphics/java/android/graphics/Typeface.java b/graphics/java/android/graphics/Typeface.java
index 25f6775..cb1f69c 100644
--- a/graphics/java/android/graphics/Typeface.java
+++ b/graphics/java/android/graphics/Typeface.java
@@ -33,6 +33,7 @@
 import android.graphics.fonts.FontVariationAxis;
 import android.graphics.fonts.SystemFonts;
 import android.os.Build;
+import android.os.Build.VERSION_CODES;
 import android.provider.FontRequest;
 import android.provider.FontsContract;
 import android.text.FontConfig;
@@ -46,6 +47,7 @@
 import com.android.internal.util.Preconditions;
 
 import dalvik.annotation.optimization.CriticalNative;
+import dalvik.system.VMRuntime;
 
 import libcore.util.NativeAllocationRegistry;
 
@@ -243,7 +245,16 @@
                 if (familyBuilder == null) {
                     familyBuilder = new FontFamily.Builder(fontBuilder.build());
                 } else {
-                    familyBuilder.addFont(fontBuilder.build());
+                    try {
+                        familyBuilder.addFont(fontBuilder.build());
+                    } catch (IllegalArgumentException e) {
+                        if (VMRuntime.getRuntime().getTargetSdkVersion() <= VERSION_CODES.P) {
+                            // Surpress the IllegalArgumentException for keeping the backward
+                            // compatibility.
+                            continue;
+                        }
+                        throw e;
+                    }
                 }
             }
             if (familyBuilder == null) {
diff --git a/keystore/java/android/security/OWNERS b/keystore/java/android/security/OWNERS
new file mode 100644
index 0000000..ed30587
--- /dev/null
+++ b/keystore/java/android/security/OWNERS
@@ -0,0 +1 @@
+per-file *.java,*.aidl = eranm@google.com,pgrafov@google.com,rubinxu@google.com
diff --git a/keystore/tests/OWNERS b/keystore/tests/OWNERS
new file mode 100644
index 0000000..9e65f88
--- /dev/null
+++ b/keystore/tests/OWNERS
@@ -0,0 +1,5 @@
+# Android Enterprise security team
+eranm@google.com
+irinaid@google.com
+pgrafov@google.com
+rubinxu@google.com
diff --git a/libs/hwui/Android.bp b/libs/hwui/Android.bp
index 96798f9..0335a7c 100644
--- a/libs/hwui/Android.bp
+++ b/libs/hwui/Android.bp
@@ -28,10 +28,6 @@
 
         // clang's warning is broken, see: https://llvm.org/bugs/show_bug.cgi?id=21629
         "-Wno-missing-braces",
-
-        // TODO: Linear blending should be enabled by default, but we are
-        // TODO: making it an opt-in while it's a work in progress
-        //"-DANDROID_ENABLE_LINEAR_BLENDING",
     ],
 
     include_dirs: [
diff --git a/libs/hwui/HardwareBitmapUploader.cpp b/libs/hwui/HardwareBitmapUploader.cpp
index 39bfcdd..aeeb32c 100644
--- a/libs/hwui/HardwareBitmapUploader.cpp
+++ b/libs/hwui/HardwareBitmapUploader.cpp
@@ -86,7 +86,7 @@
     return sEglManager.eglDisplay();
 }
 
-static bool hasFP16Support() {
+bool HardwareBitmapUploader::hasFP16Support() {
     static std::once_flag sOnce;
     static bool hasFP16Support = false;
 
@@ -116,7 +116,6 @@
 
 static FormatInfo determineFormat(const SkBitmap& skBitmap) {
     FormatInfo formatInfo;
-    // TODO: add support for linear blending (when ANDROID_ENABLE_LINEAR_BLENDING is defined)
     switch (skBitmap.info().colorType()) {
         case kRGBA_8888_SkColorType:
             formatInfo.isSupported = true;
@@ -127,7 +126,7 @@
             formatInfo.type = GL_UNSIGNED_BYTE;
             break;
         case kRGBA_F16_SkColorType:
-            formatInfo.isSupported = hasFP16Support();
+            formatInfo.isSupported = HardwareBitmapUploader::hasFP16Support();
             if (formatInfo.isSupported) {
                 formatInfo.type = GL_HALF_FLOAT;
                 formatInfo.pixelFormat = PIXEL_FORMAT_RGBA_FP16;
diff --git a/libs/hwui/HardwareBitmapUploader.h b/libs/hwui/HardwareBitmapUploader.h
index 40f2b0c..6f41e6d 100644
--- a/libs/hwui/HardwareBitmapUploader.h
+++ b/libs/hwui/HardwareBitmapUploader.h
@@ -20,10 +20,12 @@
 
 namespace android::uirenderer {
 
-class HardwareBitmapUploader {
+class ANDROID_API HardwareBitmapUploader {
 public:
     static sk_sp<Bitmap> allocateHardwareBitmap(const SkBitmap& sourceBitmap);
     static void terminate();
+
+    static bool hasFP16Support();
 };
 
 }  // namespace android::uirenderer
diff --git a/libs/hwui/RecordingCanvas.cpp b/libs/hwui/RecordingCanvas.cpp
index 6dc9d34..8594766 100644
--- a/libs/hwui/RecordingCanvas.cpp
+++ b/libs/hwui/RecordingCanvas.cpp
@@ -759,6 +759,8 @@
 void RecordingCanvas::reset(DisplayListData* dl, const SkIRect& bounds) {
     this->resetCanvas(bounds.right(), bounds.bottom());
     fDL = dl;
+    mClipMayBeComplex = false;
+    mSaveCount = mComplexSaveCount = 0;
 }
 
 sk_sp<SkSurface> RecordingCanvas::onNewSurface(const SkImageInfo&, const SkSurfaceProps&) {
@@ -770,6 +772,7 @@
 }
 
 void RecordingCanvas::willSave() {
+    mSaveCount++;
     fDL->save();
 }
 SkCanvas::SaveLayerStrategy RecordingCanvas::getSaveLayerStrategy(const SaveLayerRec& rec) {
@@ -778,6 +781,11 @@
     return SkCanvas::kNoLayer_SaveLayerStrategy;
 }
 void RecordingCanvas::willRestore() {
+    mSaveCount--;
+    if (mSaveCount < mComplexSaveCount) {
+        mClipMayBeComplex = false;
+        mComplexSaveCount = 0;
+    }
     fDL->restore();
 }
 
@@ -798,17 +806,27 @@
 
 void RecordingCanvas::onClipRect(const SkRect& rect, SkClipOp op, ClipEdgeStyle style) {
     fDL->clipRect(rect, op, style == kSoft_ClipEdgeStyle);
+    if (!getTotalMatrix().isScaleTranslate()) {
+        setClipMayBeComplex();
+    }
     this->INHERITED::onClipRect(rect, op, style);
 }
 void RecordingCanvas::onClipRRect(const SkRRect& rrect, SkClipOp op, ClipEdgeStyle style) {
+    if (rrect.getType() > SkRRect::kRect_Type || !getTotalMatrix().isScaleTranslate()) {
+        setClipMayBeComplex();
+    }
     fDL->clipRRect(rrect, op, style == kSoft_ClipEdgeStyle);
     this->INHERITED::onClipRRect(rrect, op, style);
 }
 void RecordingCanvas::onClipPath(const SkPath& path, SkClipOp op, ClipEdgeStyle style) {
+    setClipMayBeComplex();
     fDL->clipPath(path, op, style == kSoft_ClipEdgeStyle);
     this->INHERITED::onClipPath(path, op, style);
 }
 void RecordingCanvas::onClipRegion(const SkRegion& region, SkClipOp op) {
+    if (region.isComplex() || !getTotalMatrix().isScaleTranslate()) {
+        setClipMayBeComplex();
+    }
     fDL->clipRegion(region, op);
     this->INHERITED::onClipRegion(region, op);
 }
diff --git a/libs/hwui/RecordingCanvas.h b/libs/hwui/RecordingCanvas.h
index caaef67..3a76ca1 100644
--- a/libs/hwui/RecordingCanvas.h
+++ b/libs/hwui/RecordingCanvas.h
@@ -203,10 +203,41 @@
 
     void drawVectorDrawable(VectorDrawableRoot* tree);
 
+    /**
+     * If "isClipMayBeComplex" returns false, it is guaranteed the current clip is a rectangle.
+     * If the return value is true, then clip may or may not be complex (there is no guarantee).
+     */
+    inline bool isClipMayBeComplex() { return mClipMayBeComplex; }
+
 private:
     typedef SkCanvasVirtualEnforcer<SkNoDrawCanvas> INHERITED;
 
+    inline void setClipMayBeComplex() {
+        if (!mClipMayBeComplex) {
+            mComplexSaveCount = mSaveCount;
+            mClipMayBeComplex = true;
+        }
+    }
+
     DisplayListData* fDL;
+
+    /**
+     * mClipMayBeComplex tracks if the current clip is a rectangle. This flag is used to promote
+     * FunctorDrawable to a layer, if it is clipped by a non-rect.
+     */
+    bool mClipMayBeComplex = false;
+
+    /**
+     * mSaveCount is the current level of our save tree.
+     */
+    int mSaveCount = 0;
+
+    /**
+     * mComplexSaveCount is the first save level, which has a complex clip. Every level below
+     * mComplexSaveCount is assumed to have a complex clip and every level above mComplexSaveCount
+     * is guaranteed to not be complex.
+     */
+    int mComplexSaveCount = 0;
 };
 
 }  // namespace uirenderer
diff --git a/libs/hwui/RenderProperties.h b/libs/hwui/RenderProperties.h
index ddb7e4e..e6710cc 100644
--- a/libs/hwui/RenderProperties.h
+++ b/libs/hwui/RenderProperties.h
@@ -151,6 +151,7 @@
         // parent may have already dictated that a descendant layer is needed
         bool functorsNeedLayer =
                 ancestorDictatesFunctorsNeedLayer
+                || CC_UNLIKELY(isClipMayBeComplex())
 
                 // Round rect clipping forces layer for functors
                 || CC_UNLIKELY(getOutline().willRoundRectClip()) ||
@@ -193,6 +194,12 @@
 
     bool isProjectionReceiver() const { return mPrimitiveFields.mProjectionReceiver; }
 
+    bool setClipMayBeComplex(bool isClipMayBeComplex) {
+        return RP_SET(mPrimitiveFields.mClipMayBeComplex, isClipMayBeComplex);
+    }
+
+    bool isClipMayBeComplex() const { return mPrimitiveFields.mClipMayBeComplex; }
+
     bool setStaticMatrix(const SkMatrix* matrix) {
         delete mStaticMatrix;
         if (matrix) {
@@ -563,6 +570,7 @@
         bool mProjectBackwards = false;
         bool mProjectionReceiver = false;
         bool mAllowForceDark = true;
+        bool mClipMayBeComplex = false;
         Rect mClipBounds;
         Outline mOutline;
         RevealClip mRevealClip;
diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp
index 54a91f4..f328a53 100644
--- a/libs/hwui/SkiaCanvas.cpp
+++ b/libs/hwui/SkiaCanvas.cpp
@@ -694,11 +694,8 @@
         paintCopy.setStyle(SkPaint::kFill_Style);
     }
 
-    SkRect bounds =
-            SkRect::MakeLTRB(boundsLeft + x, boundsTop + y, boundsRight + x, boundsBottom + y);
-
     SkTextBlobBuilder builder;
-    const SkTextBlobBuilder::RunBuffer& buffer = builder.allocRunPos(font, count, &bounds);
+    const SkTextBlobBuilder::RunBuffer& buffer = builder.allocRunPos(font, count);
     glyphFunc(buffer.glyphs, buffer.pos);
 
     sk_sp<SkTextBlob> textBlob(builder.make());
diff --git a/libs/hwui/VectorDrawable.cpp b/libs/hwui/VectorDrawable.cpp
index 7265692..da905cf 100644
--- a/libs/hwui/VectorDrawable.cpp
+++ b/libs/hwui/VectorDrawable.cpp
@@ -606,12 +606,7 @@
 
 bool Tree::allocateBitmapIfNeeded(Cache& cache, int width, int height) {
     if (!canReuseBitmap(cache.bitmap.get(), width, height)) {
-#ifndef ANDROID_ENABLE_LINEAR_BLENDING
-        sk_sp<SkColorSpace> colorSpace = nullptr;
-#else
-        sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeSRGB();
-#endif
-        SkImageInfo info = SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType, colorSpace);
+        SkImageInfo info = SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType);
         cache.bitmap = Bitmap::allocateHeapBitmap(info);
         return true;
     }
diff --git a/libs/hwui/pipeline/skia/SkiaDisplayList.cpp b/libs/hwui/pipeline/skia/SkiaDisplayList.cpp
index 230065c..29d5ef2 100644
--- a/libs/hwui/pipeline/skia/SkiaDisplayList.cpp
+++ b/libs/hwui/pipeline/skia/SkiaDisplayList.cpp
@@ -73,7 +73,6 @@
         RenderNode* childNode = child.getRenderNode();
         Matrix4 mat4(child.getRecordedMatrix());
         info.damageAccumulator->pushTransform(&mat4);
-        // TODO: a layer is needed if the canvas is rotated or has a non-rect clip
         info.hasBackwardProjectedNodes = false;
         childFn(childNode, observer, info, functorsNeedLayer);
         hasBackwardProjectedNodesSubtree |= info.hasBackwardProjectedNodes;
diff --git a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp
index d54275f..d945635 100644
--- a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp
+++ b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp
@@ -113,6 +113,10 @@
     // Record the child node. Drawable dtor will be invoked when mChildNodes deque is cleared.
     mDisplayList->mChildNodes.emplace_back(renderNode, asSkCanvas(), true, mCurrentBarrier);
     auto& renderNodeDrawable = mDisplayList->mChildNodes.back();
+    if (Properties::getRenderPipelineType() == RenderPipelineType::SkiaVulkan) {
+        // Put Vulkan WebViews with non-rectangular clips in a HW layer
+        renderNode->mutateStagingProperties().setClipMayBeComplex(mRecorder.isClipMayBeComplex());
+    }
     drawDrawable(&renderNodeDrawable);
 
     // use staging property, since recording on UI thread
@@ -138,10 +142,8 @@
 void SkiaRecordingCanvas::drawWebViewFunctor(int functor) {
     FunctorDrawable* functorDrawable;
     if (Properties::getRenderPipelineType() == RenderPipelineType::SkiaVulkan) {
-        // TODO(cblume) use VkFunctorDrawable instead of VkInteropFunctorDrawable here when the
-        // interop is disabled.
         functorDrawable =
-                mDisplayList->allocateDrawable<VkInteropFunctorDrawable>(functor, asSkCanvas());
+                mDisplayList->allocateDrawable<VkFunctorDrawable>(functor, asSkCanvas());
     } else {
         functorDrawable = mDisplayList->allocateDrawable<GLFunctorDrawable>(functor, asSkCanvas());
     }
diff --git a/libs/hwui/pipeline/skia/VectorDrawableAtlas.cpp b/libs/hwui/pipeline/skia/VectorDrawableAtlas.cpp
index 8fb621d..e783f38 100644
--- a/libs/hwui/pipeline/skia/VectorDrawableAtlas.cpp
+++ b/libs/hwui/pipeline/skia/VectorDrawableAtlas.cpp
@@ -262,12 +262,7 @@
 }
 
 sk_sp<SkSurface> VectorDrawableAtlas::createSurface(int width, int height, GrContext* context) {
-#ifndef ANDROID_ENABLE_LINEAR_BLENDING
-    sk_sp<SkColorSpace> colorSpace = nullptr;
-#else
-    sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeSRGB();
-#endif
-    SkImageInfo info = SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType, colorSpace);
+    SkImageInfo info = SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType);
     // This must have a top-left origin so that calls to surface->canvas->writePixels
     // performs a basic texture upload instead of a more complex drawing operation
     return SkSurface::MakeRenderTarget(context, SkBudgeted::kYes, info, 0, kTopLeft_GrSurfaceOrigin,
diff --git a/libs/hwui/private/hwui/DrawVkInfo.h b/libs/hwui/private/hwui/DrawVkInfo.h
index abc4dbf..fb55f5c 100644
--- a/libs/hwui/private/hwui/DrawVkInfo.h
+++ b/libs/hwui/private/hwui/DrawVkInfo.h
@@ -29,7 +29,7 @@
   VkDevice device;
   VkQueue queue;
   uint32_t graphics_queue_index;
-  uint32_t instance_version;
+  uint32_t api_version;
   const char* const* enabled_instance_extension_names;
   uint32_t enabled_instance_extension_names_length;
   const char* const* enabled_device_extension_names;
diff --git a/libs/hwui/renderthread/VulkanManager.cpp b/libs/hwui/renderthread/VulkanManager.cpp
index 1e75202..582d51e 100644
--- a/libs/hwui/renderthread/VulkanManager.cpp
+++ b/libs/hwui/renderthread/VulkanManager.cpp
@@ -83,7 +83,6 @@
     mDevice = VK_NULL_HANDLE;
     mPhysicalDevice = VK_NULL_HANDLE;
     mInstance = VK_NULL_HANDLE;
-    mInstanceVersion = 0u;
     mInstanceExtensions.clear();
     mDeviceExtensions.clear();
     free_features_extensions_structs(mPhysicalDeviceFeatures2);
@@ -100,7 +99,7 @@
         0,                                  // applicationVersion
         "android framework",                // pEngineName
         0,                                  // engineVerison
-        VK_MAKE_VERSION(1, 1, 0),           // apiVersion
+        mAPIVersion,                        // apiVersion
     };
 
     {
@@ -377,8 +376,9 @@
     }
 
     GET_PROC(EnumerateInstanceVersion);
-    LOG_ALWAYS_FATAL_IF(mEnumerateInstanceVersion(&mInstanceVersion));
-    LOG_ALWAYS_FATAL_IF(mInstanceVersion < VK_MAKE_VERSION(1, 1, 0));
+    uint32_t instanceVersion;
+    LOG_ALWAYS_FATAL_IF(mEnumerateInstanceVersion(&instanceVersion));
+    LOG_ALWAYS_FATAL_IF(instanceVersion < VK_MAKE_VERSION(1, 1, 0));
 
     GrVkExtensions extensions;
     LOG_ALWAYS_FATAL_IF(!this->setupDevice(extensions, mPhysicalDeviceFeatures2));
@@ -398,7 +398,7 @@
     backendContext.fDevice = mDevice;
     backendContext.fQueue = mGraphicsQueue;
     backendContext.fGraphicsQueueIndex = mGraphicsQueueIndex;
-    backendContext.fInstanceVersion = mInstanceVersion;
+    backendContext.fMaxAPIVersion = mAPIVersion;
     backendContext.fVkExtensions = &extensions;
     backendContext.fDeviceFeatures2 = &mPhysicalDeviceFeatures2;
     backendContext.fGetProc = std::move(getProc);
@@ -446,7 +446,7 @@
             .device = mDevice,
             .queue = mGraphicsQueue,
             .graphics_queue_index = mGraphicsQueueIndex,
-            .instance_version = mInstanceVersion,
+            .api_version = mAPIVersion,
             .enabled_instance_extension_names = mInstanceExtensions.data(),
             .enabled_instance_extension_names_length =
                     static_cast<uint32_t>(mInstanceExtensions.size()),
diff --git a/libs/hwui/renderthread/VulkanManager.h b/libs/hwui/renderthread/VulkanManager.h
index abe78ef..6426fe2 100644
--- a/libs/hwui/renderthread/VulkanManager.h
+++ b/libs/hwui/renderthread/VulkanManager.h
@@ -246,7 +246,7 @@
     VkCommandBuffer mDummyCB = VK_NULL_HANDLE;
 
     // Variables saved to populate VkFunctorInitParams.
-    uint32_t mInstanceVersion = 0u;
+    static const uint32_t mAPIVersion = VK_MAKE_VERSION(1, 1, 0);
     std::vector<const char*> mInstanceExtensions;
     std::vector<const char*> mDeviceExtensions;
     VkPhysicalDeviceFeatures2 mPhysicalDeviceFeatures2{};
diff --git a/libs/hwui/surfacetexture/ImageConsumer.cpp b/libs/hwui/surfacetexture/ImageConsumer.cpp
index 4a2f57e..624c290 100644
--- a/libs/hwui/surfacetexture/ImageConsumer.cpp
+++ b/libs/hwui/surfacetexture/ImageConsumer.cpp
@@ -46,8 +46,8 @@
 }
 
 void ImageConsumer::ImageSlot::createIfNeeded(sp<GraphicBuffer> graphicBuffer,
-                                              android_dataspace dataspace) {
-    if (!mImage.get() || dataspace != mDataspace) {
+                                              android_dataspace dataspace, bool forceCreate) {
+    if (!mImage.get() || dataspace != mDataspace || forceCreate) {
         mImage = graphicBuffer.get()
                          ? SkImage::MakeFromAHardwareBuffer(
                                    reinterpret_cast<AHardwareBuffer*>(graphicBuffer.get()),
@@ -71,7 +71,7 @@
             if (slot != BufferItem::INVALID_BUFFER_SLOT) {
                 *queueEmpty = true;
                 mImageSlots[slot].createIfNeeded(st.mSlots[slot].mGraphicBuffer,
-                        st.mCurrentDataSpace);
+                        st.mCurrentDataSpace, false);
                 return mImageSlots[slot].mImage;
             }
         }
@@ -150,7 +150,7 @@
     st.computeCurrentTransformMatrixLocked();
 
     *queueEmpty = false;
-    mImageSlots[slot].createIfNeeded(st.mSlots[slot].mGraphicBuffer, item.mDataSpace);
+    mImageSlots[slot].createIfNeeded(st.mSlots[slot].mGraphicBuffer, item.mDataSpace, true);
     return mImageSlots[slot].mImage;
 }
 
diff --git a/libs/hwui/surfacetexture/ImageConsumer.h b/libs/hwui/surfacetexture/ImageConsumer.h
index f0e55bb..5c41903 100644
--- a/libs/hwui/surfacetexture/ImageConsumer.h
+++ b/libs/hwui/surfacetexture/ImageConsumer.h
@@ -82,7 +82,8 @@
          */
         EGLSyncKHR mEglFence;
 
-        void createIfNeeded(sp<GraphicBuffer> graphicBuffer, android_dataspace dataspace);
+        void createIfNeeded(sp<GraphicBuffer> graphicBuffer, android_dataspace dataspace,
+                            bool forceCreate);
     };
 
     /**
diff --git a/libs/hwui/utils/Color.h b/libs/hwui/utils/Color.h
index b67d10d..79400de 100644
--- a/libs/hwui/utils/Color.h
+++ b/libs/hwui/utils/Color.h
@@ -82,17 +82,6 @@
     return linear <= 0.0031308f ? linear * 12.92f : (powf(linear, 1.0f / 2.4f) * 1.055f) - 0.055f;
 }
 
-// Opto-electronic conversion function for the sRGB color space
-// Takes a linear sRGB value and converts it to a gamma-encoded sRGB value
-// This function returns the input unmodified if linear blending is not enabled
-static constexpr float OECF(float linear) {
-#ifdef ANDROID_ENABLE_LINEAR_BLENDING
-    return OECF_sRGB(linear);
-#else
-    return linear;
-#endif
-}
-
 // Electro-optical conversion function for the sRGB color space
 // Takes a gamma-encoded sRGB value and converts it to a linear sRGB value
 static constexpr float EOCF_sRGB(float srgb) {
@@ -100,17 +89,6 @@
     return srgb <= 0.04045f ? srgb / 12.92f : powf((srgb + 0.055f) / 1.055f, 2.4f);
 }
 
-// Electro-optical conversion function for the sRGB color space
-// Takes a gamma-encoded sRGB value and converts it to a linear sRGB value
-// This function returns the input unmodified if linear blending is not enabled
-static constexpr float EOCF(float srgb) {
-#ifdef ANDROID_ENABLE_LINEAR_BLENDING
-    return EOCF_sRGB(srgb);
-#else
-    return srgb;
-#endif
-}
-
 android::PixelFormat ColorTypeToPixelFormat(SkColorType colorType);
 ANDROID_API SkColorType PixelFormatToColorType(android::PixelFormat format);
 
diff --git a/location/java/android/location/GnssMeasurementCorrections.java b/location/java/android/location/GnssMeasurementCorrections.java
index b81bf90..3ce48b4 100644
--- a/location/java/android/location/GnssMeasurementCorrections.java
+++ b/location/java/android/location/GnssMeasurementCorrections.java
@@ -43,13 +43,27 @@
      * are computed.
      */
     private double mAltitudeMeters;
+    /**
+     * Represents the horizontal uncertainty (68% confidence) in meters on the device position at
+     * which the corrections are provided.
+     *
+     * <p> This value is useful for example to judge how accurate the provided corrections are.
+     */
+    private double mHorizontalPositionUncertaintyMeters;
+    /**
+     * Represents the vertical uncertainty (68% confidence) in meters on the device position at
+     * which the corrections are provided.
+     *
+     * <p> This value is useful for example to judge how accurate the provided corrections are.
+     */
+    private double mVerticalPositionUncertaintyMeters;
 
-    /** Time Of Applicability, GPS time of week */
+    /** Time Of Applicability, GPS time of week in nanoseconds. */
     private long mToaGpsNanosecondsOfWeek;
 
     /**
      * A set of {@link GnssSingleSatCorrection} each containing measurement corrections for a
-     * satellite in view
+     * satellite in view.
      */
     private @Nullable List<GnssSingleSatCorrection> mSingleSatCorrectionList;
 
@@ -57,6 +71,8 @@
         mLatitudeDegrees = builder.mLatitudeDegrees;
         mLongitudeDegrees = builder.mLongitudeDegrees;
         mAltitudeMeters = builder.mAltitudeMeters;
+        mHorizontalPositionUncertaintyMeters = builder.mHorizontalPositionUncertaintyMeters;
+        mVerticalPositionUncertaintyMeters = builder.mVerticalPositionUncertaintyMeters;
         mToaGpsNanosecondsOfWeek = builder.mToaGpsNanosecondsOfWeek;
         mSingleSatCorrectionList =
                 builder.mSingleSatCorrectionList == null
@@ -83,6 +99,22 @@
         return mAltitudeMeters;
     }
 
+    /**
+     * Gets the horizontal uncertainty (68% confidence) in meters on the device position at
+     * which the corrections are provided.
+     */
+    public double getHorizontalPositionUncertaintyMeters() {
+        return mHorizontalPositionUncertaintyMeters;
+    }
+
+    /**
+     * Gets the vertical uncertainty (68% confidence) in meters on the device position at
+     * which the corrections are provided.
+     */
+    public double getVerticalPositionUncertaintyMeters() {
+        return mVerticalPositionUncertaintyMeters;
+    }
+
     /** Gets the time of applicability, GPS time of week in nanoseconds. */
     public long getToaGpsNanosecondsOfWeek() {
         return mToaGpsNanosecondsOfWeek;
@@ -110,6 +142,8 @@
                                     .setLatitudeDegrees(parcel.readDouble())
                                     .setLongitudeDegrees(parcel.readDouble())
                                     .setAltitudeMeters(parcel.readDouble())
+                                    .setHorizontalPositionUncertaintyMeters(parcel.readDouble())
+                                    .setVerticalPositionUncertaintyMeters(parcel.readDouble())
                                     .setToaGpsNanosecondsOfWeek(parcel.readLong());
                     List<GnssSingleSatCorrection> singleSatCorrectionList = new ArrayList<>();
                     parcel.readTypedList(singleSatCorrectionList, GnssSingleSatCorrection.CREATOR);
@@ -131,6 +165,10 @@
         builder.append(String.format(format, "LatitudeDegrees = ", mLatitudeDegrees));
         builder.append(String.format(format, "LongitudeDegrees = ", mLongitudeDegrees));
         builder.append(String.format(format, "AltitudeMeters = ", mAltitudeMeters));
+        builder.append(String.format(format, "HorizontalPositionUncertaintyMeters = ",
+                mHorizontalPositionUncertaintyMeters));
+        builder.append(String.format(format, "VerticalPositionUncertaintyMeters = ",
+                mVerticalPositionUncertaintyMeters));
         builder.append(
                 String.format(format, "ToaGpsNanosecondsOfWeek = ", mToaGpsNanosecondsOfWeek));
         builder.append(
@@ -143,6 +181,8 @@
         parcel.writeDouble(mLatitudeDegrees);
         parcel.writeDouble(mLongitudeDegrees);
         parcel.writeDouble(mAltitudeMeters);
+        parcel.writeDouble(mHorizontalPositionUncertaintyMeters);
+        parcel.writeDouble(mVerticalPositionUncertaintyMeters);
         parcel.writeLong(mToaGpsNanosecondsOfWeek);
         parcel.writeTypedList(mSingleSatCorrectionList);
     }
@@ -154,9 +194,10 @@
          * GnssMeasurementCorrections}.
          */
         private double mLatitudeDegrees;
-
         private double mLongitudeDegrees;
         private double mAltitudeMeters;
+        private double mHorizontalPositionUncertaintyMeters;
+        private double mVerticalPositionUncertaintyMeters;
         private long mToaGpsNanosecondsOfWeek;
         private List<GnssSingleSatCorrection> mSingleSatCorrectionList;
 
@@ -181,6 +222,27 @@
             return this;
         }
 
+
+        /**
+         * Sets the horizontal uncertainty (68% confidence) in meters on the device position at
+         * which the corrections are provided.
+         */
+        public Builder setHorizontalPositionUncertaintyMeters(
+                double horizontalPositionUncertaintyMeters) {
+            mHorizontalPositionUncertaintyMeters = horizontalPositionUncertaintyMeters;
+            return this;
+        }
+
+        /**
+         * Sets the vertical uncertainty (68% confidence) in meters on the device position at which
+         * the corrections are provided.
+         */
+        public Builder setVerticalPositionUncertaintyMeters(
+                double verticalPositionUncertaintyMeters) {
+            mVerticalPositionUncertaintyMeters = verticalPositionUncertaintyMeters;
+            return this;
+        }
+
         /** Sets the time of applicability, GPS time of week in nanoseconds. */
         public Builder setToaGpsNanosecondsOfWeek(long toaGpsNanosecondsOfWeek) {
             mToaGpsNanosecondsOfWeek = toaGpsNanosecondsOfWeek;
diff --git a/location/java/android/location/GnssSingleSatCorrection.java b/location/java/android/location/GnssSingleSatCorrection.java
index 3922d2f..4d5303f 100644
--- a/location/java/android/location/GnssSingleSatCorrection.java
+++ b/location/java/android/location/GnssSingleSatCorrection.java
@@ -317,8 +317,8 @@
          * between 0 and 1.
          */
         public Builder setProbSatIsLos(@FloatRange(from = 0f, to = 1f) float probSatIsLos) {
-            Preconditions.checkArgumentInRange(probSatIsLos, 0, 1,
-                    "probSatIsLos should be between 0 and 1.");
+            Preconditions.checkArgumentInRange(
+                    probSatIsLos, 0, 1, "probSatIsLos should be between 0 and 1.");
             mProbSatIsLos = probSatIsLos;
             mSingleSatCorrectionFlags =
                     (byte) (mSingleSatCorrectionFlags | HAS_PROB_SAT_IS_LOS_MASK);
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index 59c6a0a..63b57d1 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -181,22 +181,14 @@
         "android.location.GPS_ENABLED_CHANGE";
 
     /**
-     * Broadcast intent action when the configured location providers
-     * change. For use with {@link #isProviderEnabled(String)}. If you're interacting with the
-     * {@link android.provider.Settings.Secure#LOCATION_MODE} API, use {@link #MODE_CHANGED_ACTION}
-     * instead.
+     * Broadcast intent action when the set of enabled location providers changes. To check the
+     * status of a provider, use {@link #isProviderEnabled(String)}.
      */
-    public static final String PROVIDERS_CHANGED_ACTION =
-        "android.location.PROVIDERS_CHANGED";
+    public static final String PROVIDERS_CHANGED_ACTION = "android.location.PROVIDERS_CHANGED";
 
     /**
-     * Broadcast intent action when {@link android.provider.Settings.Secure#LOCATION_MODE} changes.
-     * For use with the {@link android.provider.Settings.Secure#LOCATION_MODE} API.
-     * If you're interacting with {@link #isProviderEnabled(String)}, use
-     * {@link #PROVIDERS_CHANGED_ACTION} instead.
-     *
-     * In the future, there may be mode changes that do not result in
-     * {@link #PROVIDERS_CHANGED_ACTION} broadcasts.
+     * Broadcast intent action when the device location mode changes. To check the location mode,
+     * use {@link #isLocationEnabled()}.
      */
     public static final String MODE_CHANGED_ACTION = "android.location.MODE_CHANGED";
 
@@ -207,8 +199,10 @@
      * If you're interacting with {@link #isProviderEnabled(String)}, use
      * {@link #PROVIDERS_CHANGED_ACTION} instead.
      *
+     * @deprecated Do not use.
      * @hide
      */
+    @Deprecated
     public static final String MODE_CHANGING_ACTION = "com.android.settings.location.MODE_CHANGING";
 
     /**
@@ -299,7 +293,7 @@
             "com.android.settings.location.FOOTER_STRING";
 
     // Map from LocationListeners to their associated ListenerTransport objects
-    private HashMap<LocationListener,ListenerTransport> mListeners =
+    private final HashMap<LocationListener, ListenerTransport> mListeners =
         new HashMap<LocationListener,ListenerTransport>();
 
     private class ListenerTransport extends ILocationListener.Stub {
@@ -1264,39 +1258,20 @@
     }
 
     /**
-     * Returns the current enabled/disabled status of location
+     * Returns the current enabled/disabled state of location. To listen for changes, see
+     * {@link #MODE_CHANGED_ACTION}.
      *
-     * @return true if location is enabled. false if location is disabled.
+     * @return true if location is enabled and false if location is disabled.
      */
     public boolean isLocationEnabled() {
         return isLocationEnabledForUser(Process.myUserHandle());
     }
 
     /**
-     * Method for enabling or disabling location.
-     *
-     * @param enabled true to enable location. false to disable location
-     * @param userHandle the user to set
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(WRITE_SECURE_SETTINGS)
-    public void setLocationEnabledForUser(boolean enabled, UserHandle userHandle) {
-        Settings.Secure.putIntForUser(
-                mContext.getContentResolver(),
-                Settings.Secure.LOCATION_MODE,
-                enabled
-                        ? Settings.Secure.LOCATION_MODE_HIGH_ACCURACY
-                        : Settings.Secure.LOCATION_MODE_OFF,
-                userHandle.getIdentifier());
-    }
-
-    /**
-     * Returns the current enabled/disabled status of location
+     * Returns the current enabled/disabled state of location.
      *
      * @param userHandle the user to query
-     * @return true location is enabled. false if location is disabled.
+     * @return true if location is enabled and false if location is disabled.
      *
      * @hide
      */
@@ -1310,19 +1285,32 @@
     }
 
     /**
-     * Returns the current enabled/disabled status of the given provider.
+     * Enables or disables the location setting.
      *
-     * <p>If the user has enabled this provider in the Settings menu, true
-     * is returned otherwise false is returned
+     * @param enabled true to enable location and false to disable location.
+     * @param userHandle the user to set
      *
-     * <p>Callers should instead use {@link #isLocationEnabled()}
-     * unless they depend on provider-specific APIs such as
-     * {@link #requestLocationUpdates(String, long, float, LocationListener)}.
+     * @hide
+     */
+    @SystemApi
+    @RequiresPermission(WRITE_SECURE_SETTINGS)
+    public void setLocationEnabledForUser(boolean enabled, UserHandle userHandle) {
+        Settings.Secure.putIntForUser(
+                mContext.getContentResolver(),
+                Settings.Secure.LOCATION_MODE,
+                enabled
+                        ? Settings.Secure.LOCATION_MODE_ON
+                        : Settings.Secure.LOCATION_MODE_OFF,
+                userHandle.getIdentifier());
+    }
+
+    /**
+     * Returns the current enabled/disabled status of the given provider. To listen for changes, see
+     * {@link #PROVIDERS_CHANGED_ACTION}.
      *
-     * <p>
-     * Before API version {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this
-     * method would throw {@link SecurityException} if the location permissions
-     * were not sufficient to use the specified provider.
+     * Before API version {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method would throw
+     * {@link SecurityException} if the location permissions were not sufficient to use the
+     * specified provider.
      *
      * @param provider the name of the provider
      * @return true if the provider exists and is enabled
@@ -1334,19 +1322,13 @@
     }
 
     /**
-     * Returns the current enabled/disabled status of the given provider and user.
+     * Returns the current enabled/disabled status of the given provider and user. Callers should
+     * prefer {@link #isLocationEnabledForUser(UserHandle)} unless they depend on provider-specific
+     * APIs.
      *
-     * <p>If the user has enabled this provider in the Settings menu, true
-     * is returned otherwise false is returned
-     *
-     * <p>Callers should instead use {@link #isLocationEnabled()}
-     * unless they depend on provider-specific APIs such as
-     * {@link #requestLocationUpdates(String, long, float, LocationListener)}.
-     *
-     * <p>
-     * Before API version {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this
-     * method would throw {@link SecurityException} if the location permissions
-     * were not sufficient to use the specified provider.
+     * Before API version {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method would throw
+     * {@link SecurityException} if the location permissions were not sufficient to use the
+     * specified provider.
      *
      * @param provider the name of the provider
      * @param userHandle the user to query
@@ -1367,12 +1349,14 @@
     }
 
     /**
-     * Method for enabling or disabling a single location provider.
+     * Method for enabling or disabling a single location provider. This method is deprecated and
+     * functions as a best effort. It should not be relied on in any meaningful sense as providers
+     * may no longer be enabled or disabled by clients.
      *
      * @param provider the name of the provider
      * @param enabled true to enable the provider. false to disable the provider
      * @param userHandle the user to set
-     * @return true if the value was set, false on database errors
+     * @return true if the value was set, false otherwise
      *
      * @throws IllegalArgumentException if provider is null
      * @deprecated Do not manipulate providers individually, use
diff --git a/location/java/android/location/LocationRequest.java b/location/java/android/location/LocationRequest.java
index 3d0afb09..0480eab 100644
--- a/location/java/android/location/LocationRequest.java
+++ b/location/java/android/location/LocationRequest.java
@@ -683,6 +683,7 @@
                     request.setSmallestDisplacement(in.readFloat());
                     request.setHideFromAppOps(in.readInt() != 0);
                     request.setLowPowerMode(in.readInt() != 0);
+                    request.setLocationSettingsIgnored(in.readInt() != 0);
                     String provider = in.readString();
                     if (provider != null) request.setProvider(provider);
                     WorkSource workSource = in.readParcelable(null);
@@ -711,6 +712,7 @@
         parcel.writeFloat(mSmallestDisplacement);
         parcel.writeInt(mHideFromAppOps ? 1 : 0);
         parcel.writeInt(mLowPowerMode ? 1 : 0);
+        parcel.writeInt(mLocationSettingsIgnored ? 1 : 0);
         parcel.writeString(mProvider);
         parcel.writeParcelable(mWorkSource, 0);
     }
@@ -755,6 +757,9 @@
             s.append(" num=").append(mNumUpdates);
         }
         s.append(" lowPowerMode=").append(mLowPowerMode);
+        if (mLocationSettingsIgnored) {
+            s.append(" ignoreSettings");
+        }
         s.append(']');
         return s.toString();
     }
diff --git a/location/tests/locationtests/src/android/location/GnssMeasurementCorrectionsTest.java b/location/tests/locationtests/src/android/location/GnssMeasurementCorrectionsTest.java
index d6227bb..8f46e84 100644
--- a/location/tests/locationtests/src/android/location/GnssMeasurementCorrectionsTest.java
+++ b/location/tests/locationtests/src/android/location/GnssMeasurementCorrectionsTest.java
@@ -48,6 +48,8 @@
         assertEquals(37.386051, measurementCorrections.getLatitudeDegrees());
         assertEquals(-122.083855, measurementCorrections.getLongitudeDegrees());
         assertEquals(32.0, measurementCorrections.getAltitudeMeters());
+        assertEquals(9.25, measurementCorrections.getHorizontalPositionUncertaintyMeters());
+        assertEquals(2.3, measurementCorrections.getVerticalPositionUncertaintyMeters());
         assertEquals(604000000000000L, measurementCorrections.getToaGpsNanosecondsOfWeek());
 
         GnssSingleSatCorrection singleSatCorrection =
@@ -74,6 +76,8 @@
                 .setLatitudeDegrees(37.386051)
                 .setLongitudeDegrees(-122.083855)
                 .setAltitudeMeters(32)
+                .setHorizontalPositionUncertaintyMeters(9.25)
+                .setVerticalPositionUncertaintyMeters(2.3)
                 .setToaGpsNanosecondsOfWeek(604000000000000L);
         List<GnssSingleSatCorrection> singleSatCorrectionList = new ArrayList<>();
         singleSatCorrectionList.add(GnssSingleSatCorrectionsTest.generateTestSingleSatCorrection());
diff --git a/media/Android.bp b/media/Android.bp
index 0675a36..1aefebe 100644
--- a/media/Android.bp
+++ b/media/Android.bp
@@ -1,62 +1,26 @@
 java_library {
-    name: "updatable-media1",
-
-    srcs: [
-        ":media1-srcs",
-        ":framework-media-annotation-srcs",
-    ],
-
-    aidl: {
-        export_include_dirs: [
-            "apex/java",
-        ],
-
-        // TODO: find out a way to include only the necessary aidl files instead of dirs.
-        include_dirs: [
-            "frameworks/base/core/java",
-            "frameworks/base/media/java",
-        ],
-    },
-
-    installable: true,
-
-    // Make sure that the implementaion only relies on SDK or system APIs.
-    sdk_version: "system_current",
-}
-
-java_library {
-    name: "updatable-mediasession2",
-
-    srcs: [
-        ":mediasession2-srcs",
-        ":framework-media-annotation-srcs",
-    ],
-
-    aidl: {
-        export_include_dirs: [
-            "apex/java",
-        ],
-
-        // TODO: find out a way to include only the necessary aidl files instead of dirs.
-        include_dirs: [
-            "frameworks/base/core/java",
-        ],
-    },
-
-    installable: true,
-
-    // Make sure that the implementaion only relies on SDK or system APIs.
-    sdk_version: "system_current",
-}
-
-java_library {
     name: "updatable-media",
 
     srcs: [
-        ":mediaplayer2-srcs",
+        ":updatable-media-srcs",
         ":framework-media-annotation-srcs",
     ],
 
+    aidl: {
+        export_include_dirs: [
+            "apex/java",
+        ],
+
+        // It would be great if we don't need to add include_dirs for public
+        // parcelable classes. Find a better way.
+        include_dirs: [
+            // To refer:
+            // android.os.Bundle
+            // android.os.ResultReceiver
+            "frameworks/base/core/java",
+        ],
+    },
+
     static_libs: [
         "mediaplayer2-protos",
     ],
@@ -68,52 +32,18 @@
 }
 
 filegroup {
-    name: "media-srcs-without-aidls",
-    srcs : [
-        ":media1-srcs-without-aidls",
-        ":mediasession2-srcs-without-aidls",
+    name: "updatable-media-srcs",
+    srcs: [
+        ":mediasession2-srcs",
         ":mediaplayer2-srcs",
     ],
 }
 
 filegroup {
-    name: "media1-srcs",
-    srcs: [
-        "apex/java/android/media/MediaMetadata.java",
-        "apex/java/android/media/MediaParceledListSlice.java",
-        "apex/java/android/media/VolumeProvider.java",
-        "apex/java/android/media/browse/MediaBrowser.java",
-        "apex/java/android/media/browse/MediaBrowserUtils.java",
-        "apex/java/android/media/session/ControllerCallbackLink.java",
-        "apex/java/android/media/session/ControllerLink.java",
-        "apex/java/android/media/session/ISession.aidl",
-        "apex/java/android/media/session/ISessionCallback.aidl",
-        "apex/java/android/media/session/ISessionController.aidl",
-        "apex/java/android/media/session/ISessionControllerCallback.aidl",
-        "apex/java/android/media/session/MediaController.java",
-        "apex/java/android/media/session/MediaSessionEngine.java",
-        "apex/java/android/media/session/MediaSessionProviderService.java",
-        "apex/java/android/media/session/PlaybackState.java",
-        "apex/java/android/media/session/SessionCallbackLink.java",
-        "apex/java/android/media/session/SessionLink.java",
-        "apex/java/android/service/media/IMediaBrowserService.aidl",
-        "apex/java/android/service/media/IMediaBrowserServiceCallbacks.aidl",
-        "apex/java/android/service/media/MediaBrowserService.java",
-    ],
-}
-
-filegroup {
-    name: "media1-srcs-without-aidls",
-    srcs: [
-        ":media1-srcs",
-    ],
-    exclude_srcs: [
-        "apex/java/android/media/session/ISession.aidl",
-        "apex/java/android/media/session/ISessionCallback.aidl",
-        "apex/java/android/media/session/ISessionController.aidl",
-        "apex/java/android/media/session/ISessionControllerCallback.aidl",
-        "apex/java/android/service/media/IMediaBrowserService.aidl",
-        "apex/java/android/service/media/IMediaBrowserServiceCallbacks.aidl",
+    name: "updatable-media-srcs-without-aidls",
+    srcs : [
+        ":mediasession2-srcs-without-aidls",
+        ":mediaplayer2-srcs",
     ],
 }
 
@@ -132,6 +62,7 @@
         "apex/java/android/media/Session2Command.java",
         "apex/java/android/media/Session2CommandGroup.java",
         "apex/java/android/media/Session2Link.java",
+        "apex/java/android/media/Session2Token.java",
     ],
 }
 
@@ -156,7 +87,6 @@
         "apex/java/android/media/UriDataSourceDesc.java",
         "apex/java/android/media/FileDataSourceDesc.java",
         "apex/java/android/media/CallbackDataSourceDesc.java",
-        "apex/java/android/media/VideoSize.java",
         "apex/java/android/media/Media2Utils.java",
         "apex/java/android/media/MediaPlayer2Utils.java",
         "apex/java/android/media/MediaPlayer2.java",
@@ -166,3 +96,32 @@
         "apex/java/android/media/BufferingParams.java",
     ],
 }
+
+metalava_updatable_media_args = " --error UnhiddenSystemApi " +
+    "--hide RequiresPermission " +
+    "--hide MissingPermission --hide BroadcastBehavior " +
+    "--hide HiddenSuperclass --hide DeprecationMismatch --hide UnavailableSymbol " +
+    "--hide SdkConstant --hide HiddenTypeParameter --hide Todo --hide Typo " +
+    "--hide HiddenTypedefConstant "
+
+droidstubs {
+    name: "updatable-media-stubs",
+    srcs: [
+        ":updatable-media-srcs-without-aidls",
+        ":framework-media-annotation-srcs",
+    ],
+    args: metalava_updatable_media_args + " --show-annotation android.annotation.SystemApi " +
+        " --show-annotation android.annotation.TestApi ",
+    // Ideally, sdk_version here should be "current_system", but "current - 1" is used
+    // to avoid dependency cycle with framework.
+    sdk_version: "28",
+}
+
+java_library {
+    name: "updatable_media_stubs",
+    srcs: [":updatable-media-stubs"],
+    // Ideally, sdk_version here should be "current_system", but "current - 1" is used
+    // to avoid dependency cycle with framework.
+    sdk_version: "28",
+}
+
diff --git a/media/apex/java/android/media/MediaConstants.java b/media/apex/java/android/media/MediaConstants.java
index 45ea826..65b6f55 100644
--- a/media/apex/java/android/media/MediaConstants.java
+++ b/media/apex/java/android/media/MediaConstants.java
@@ -24,8 +24,7 @@
     static final String KEY_PACKAGE_NAME = "android.media.key.PACKAGE_NAME";
 
     // Bundle key for Parcelable
-    static final String KEY_SESSION2_TOKEN = "android.media.key.SESSION2_TOKEN";
-    static final String KEY_SESSION2_LINK = "android.media.key.SESSION2_LINK";
+    static final String KEY_SESSION2LINK = "android.media.key.SESSION2LINK";
     static final String KEY_ALLOWED_COMMANDS = "android.media.key.ALLOWED_COMMANDS";
     static final String KEY_PLAYBACK_ACTIVE = "android.media.key.PLAYBACK_ACTIVE";
 
diff --git a/media/apex/java/android/media/MediaController2.java b/media/apex/java/android/media/MediaController2.java
index 41721f3..887b447 100644
--- a/media/apex/java/android/media/MediaController2.java
+++ b/media/apex/java/android/media/MediaController2.java
@@ -20,11 +20,9 @@
 import static android.media.MediaConstants.KEY_PACKAGE_NAME;
 import static android.media.MediaConstants.KEY_PID;
 import static android.media.MediaConstants.KEY_PLAYBACK_ACTIVE;
-import static android.media.MediaConstants.KEY_SESSION2_LINK;
-import static android.media.MediaConstants.KEY_SESSION2_TOKEN;
+import static android.media.MediaConstants.KEY_SESSION2LINK;
 import static android.media.Session2Command.RESULT_ERROR_UNKNOWN_ERROR;
 import static android.media.Session2Command.RESULT_INFO_SKIPPED;
-import static android.media.Session2Token.SESSION_SERVICE_INTERFACE;
 import static android.media.Session2Token.TYPE_SESSION;
 
 import android.annotation.NonNull;
@@ -262,8 +260,7 @@
 
     // Called by Controller2Link.onConnected
     void onConnected(int seq, Bundle connectionResult) {
-        Session2Token token = connectionResult.getParcelable(KEY_SESSION2_TOKEN);
-        Session2Link sessionBinder = token.getExtras().getParcelable(KEY_SESSION2_LINK);
+        Session2Link sessionBinder = connectionResult.getParcelable(KEY_SESSION2LINK);
         Session2CommandGroup allowedCommands =
                 connectionResult.getParcelable(KEY_ALLOWED_COMMANDS);
         boolean playbackActive = connectionResult.getBoolean(KEY_PLAYBACK_ACTIVE);
@@ -284,7 +281,8 @@
             // Implementation for the local binder is no-op,
             // so can be used without worrying about deadlock.
             sessionBinder.linkToDeath(mDeathRecipient, 0);
-            mConnectedToken = token;
+            mConnectedToken = new Session2Token(mSessionToken.getUid(), TYPE_SESSION,
+                    mSessionToken.getPackageName(), sessionBinder);
         }
         mCallbackExecutor.execute(() -> {
             mCallback.onConnected(MediaController2.this, allowedCommands);
@@ -355,7 +353,7 @@
     }
 
     private boolean requestConnectToSession() {
-        Session2Link sessionBinder = mSessionToken.getExtras().getParcelable(KEY_SESSION2_LINK);
+        Session2Link sessionBinder = mSessionToken.getSessionLink();
         Bundle connectionRequest = createConnectionRequest();
         try {
             sessionBinder.connect(mControllerStub, getNextSeqNumber(), connectionRequest);
@@ -368,7 +366,7 @@
 
     private boolean requestConnectToService() {
         // Service. Needs to get fresh binder whenever connection is needed.
-        final Intent intent = new Intent(SESSION_SERVICE_INTERFACE);
+        final Intent intent = new Intent(MediaSession2Service.SERVICE_INTERFACE);
         intent.setClassName(mSessionToken.getPackageName(), mSessionToken.getServiceName());
 
         // Use bindService() instead of startForegroundService() to start session service for three
diff --git a/media/apex/java/android/media/MediaPlayer2.java b/media/apex/java/android/media/MediaPlayer2.java
index a2feec2..925ca0d 100644
--- a/media/apex/java/android/media/MediaPlayer2.java
+++ b/media/apex/java/android/media/MediaPlayer2.java
@@ -21,6 +21,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.StringDef;
+import android.annotation.TestApi;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.res.AssetFileDescriptor;
@@ -40,6 +41,7 @@
 import android.os.PowerManager;
 import android.util.Log;
 import android.util.Pair;
+import android.util.Size;
 import android.view.Surface;
 import android.view.SurfaceHolder;
 
@@ -61,7 +63,6 @@
 import java.nio.ByteOrder;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -299,7 +300,7 @@
     private final AtomicLong mSrcIdGenerator = new AtomicLong(0);
 
     private volatile float mVolume = 1.0f;
-    private VideoSize mVideoSize = new VideoSize(0, 0);
+    private Size mVideoSize = new Size(0, 0);
 
     private static ExecutorService sDrmThreadPool = Executors.newCachedThreadPool();
 
@@ -1526,7 +1527,7 @@
      * notification {@code EventCallback.onVideoSizeChanged} when the size
      * is available.
      */
-    public VideoSize getVideoSize() {
+    public Size getVideoSize() {
         return mVideoSize;
     }
 
@@ -2526,7 +2527,7 @@
                     final int width = msg.arg1;
                     final int height = msg.arg2;
 
-                    mVideoSize = new VideoSize(width, height);
+                    mVideoSize = new Size(width, height);
                     sendEvent(new EventNotifier() {
                         @Override
                         public void notify(EventCallback callback) {
@@ -2765,7 +2766,7 @@
          * @param size the size of the video
          */
         public void onVideoSizeChanged(
-                @NonNull MediaPlayer2 mp, @NonNull DataSourceDesc dsd, @NonNull VideoSize size) { }
+                @NonNull MediaPlayer2 mp, @NonNull DataSourceDesc dsd, @NonNull Size size) { }
 
         /**
          * Called to indicate an avaliable timed text
@@ -3667,53 +3668,66 @@
     }
 
     /**
-     * The status codes for {@link DrmEventCallback#onDrmPrepared} listener.
+     * A status code for {@link DrmEventCallback#onDrmPrepared} listener.
      * <p>
      *
      * DRM preparation has succeeded.
-     * @hide
      */
     public static final int PREPARE_DRM_STATUS_SUCCESS = 0;
 
     /**
+     * A status code for {@link DrmEventCallback#onDrmPrepared} listener.
+     * <p>
+     *
      * The device required DRM provisioning but couldn't reach the provisioning server.
-     * @hide
      */
     public static final int PREPARE_DRM_STATUS_PROVISIONING_NETWORK_ERROR = 1;
 
     /**
+     * A status code for {@link DrmEventCallback#onDrmPrepared} listener.
+     * <p>
+     *
      * The device required DRM provisioning but the provisioning server denied the request.
-     * @hide
      */
     public static final int PREPARE_DRM_STATUS_PROVISIONING_SERVER_ERROR = 2;
 
     /**
+     * A status code for {@link DrmEventCallback#onDrmPrepared} listener.
+     * <p>
+     *
      * The DRM preparation has failed .
-     * @hide
      */
     public static final int PREPARE_DRM_STATUS_PREPARATION_ERROR = 3;
 
     /**
+     * A status code for {@link DrmEventCallback#onDrmPrepared} listener.
+     * <p>
+     *
      * The crypto scheme UUID is not supported by the device.
-     * @hide
      */
     public static final int PREPARE_DRM_STATUS_UNSUPPORTED_SCHEME = 4;
 
     /**
+     * A status code for {@link DrmEventCallback#onDrmPrepared} listener.
+     * <p>
+     *
      * The hardware resources are not available, due to being in use.
-     * @hide
      */
     public static final int PREPARE_DRM_STATUS_RESOURCE_BUSY = 5;
 
     /**
+     * A status code for {@link DrmEventCallback#onDrmPrepared} listener.
+     * <p>
+     *
      * Restoring persisted offline keys failed.
-     * @hide
      */
     public static final int PREPARE_DRM_STATUS_RESTORE_ERROR = 6;
 
     /**
+     * A status code for {@link DrmEventCallback#onDrmPrepared} listener.
+     * <p>
+     *
      * Error during key request/response exchange with license server.
-     * @hide
      */
     public static final int PREPARE_DRM_STATUS_KEY_EXCHANGE_ERROR = 7;
 
@@ -3758,6 +3772,7 @@
      * @throws IllegalStateException if called before being prepared
      * @hide
      */
+    @TestApi
     public DrmInfo getDrmInfo(@NonNull DataSourceDesc dsd) {
         final SourceInfo sourceInfo = getSourceInfo(dsd);
         if (sourceInfo != null) {
@@ -3814,6 +3829,7 @@
      * @hide
      */
     // This is an asynchronous call.
+    @TestApi
     public Object prepareDrm(@NonNull DataSourceDesc dsd, @NonNull UUID uuid) {
         return addTask(newPrepareDrmTask(dsd, uuid));
     }
@@ -3905,6 +3921,7 @@
      * @hide
      */
     // This is a synchronous call.
+    @TestApi
     public void releaseDrm(@NonNull DataSourceDesc dsd)
             throws NoDrmSchemeException {
         final SourceInfo sourceInfo = getSourceInfo(dsd);
@@ -3955,6 +3972,7 @@
      * @throws NoDrmSchemeException if there is no active DRM session
      * @hide
      */
+    @TestApi
     public MediaDrm.KeyRequest getDrmKeyRequest(
             @NonNull DataSourceDesc dsd,
             @Nullable byte[] keySetId, @Nullable byte[] initData,
@@ -3997,6 +4015,7 @@
      * @hide
      */
     // This is a synchronous call.
+    @TestApi
     public byte[] provideDrmKeyResponse(
             @NonNull DataSourceDesc dsd,
             @Nullable byte[] keySetId, @NonNull byte[] response)
@@ -4023,6 +4042,7 @@
      * @hide
      */
     // This is a synchronous call.
+    @TestApi
     public void restoreDrmKeys(
             @NonNull DataSourceDesc dsd,
             @NonNull byte[] keySetId)
@@ -4050,6 +4070,7 @@
      * @throws NoDrmSchemeException if there is no active DRM session
      * @hide
      */
+    @TestApi
     public String getDrmPropertyString(
             @NonNull DataSourceDesc dsd,
             @NonNull @MediaDrmStringProperty String propertyName)
@@ -4078,6 +4099,7 @@
      * @hide
      */
     // This is a synchronous call.
+    @TestApi
     public void setDrmPropertyString(
             @NonNull DataSourceDesc dsd,
             @NonNull @MediaDrmStringProperty String propertyName, @NonNull String value)
@@ -4482,6 +4504,7 @@
     };
 
     // Modular DRM
+    private final Map<UUID, MediaDrm> mDrmObjs = new HashMap<>();
     private class DrmHandle {
 
         static final int PROVISION_TIMEOUT_MS = 60000;
@@ -4594,7 +4617,13 @@
             Log.v(TAG, "prepareDrm_createDrmStep: UUID: " + uuid);
 
             try {
-                mDrmObj = new MediaDrm(uuid);
+                mDrmObj = mDrmObjs.computeIfAbsent(uuid, scheme -> {
+                    try {
+                        return new MediaDrm(scheme);
+                    } catch (UnsupportedSchemeException e) {
+                        throw new IllegalArgumentException(e);
+                    }
+                });
                 Log.v(TAG, "prepareDrm_createDrmStep: Created mDrmObj=" + mDrmObj);
             } catch (Exception e) { // UnsupportedSchemeException
                 Log.e(TAG, "prepareDrm_createDrmStep: MediaDrm failed with " + e);
@@ -4837,7 +4866,12 @@
                 msg = mTaskHandler.obtainMessage(
                         MEDIA_ERROR, status, MEDIA_ERROR_UNKNOWN, null);
             }
-            mTaskHandler.sendMessage(msg);
+            mTaskHandler.post(new Runnable() {
+                @Override
+                public void run() {
+                    mTaskHandler.handleMessage(msg, mSrcId);
+                }
+            });
 
             sendDrmEvent(new DrmEventNotifier() {
                 @Override
diff --git a/media/apex/java/android/media/MediaSession2.java b/media/apex/java/android/media/MediaSession2.java
index 80c91cc..fdd07fd 100644
--- a/media/apex/java/android/media/MediaSession2.java
+++ b/media/apex/java/android/media/MediaSession2.java
@@ -20,10 +20,10 @@
 import static android.media.MediaConstants.KEY_PACKAGE_NAME;
 import static android.media.MediaConstants.KEY_PID;
 import static android.media.MediaConstants.KEY_PLAYBACK_ACTIVE;
-import static android.media.MediaConstants.KEY_SESSION2_LINK;
-import static android.media.MediaConstants.KEY_SESSION2_TOKEN;
+import static android.media.MediaConstants.KEY_SESSION2LINK;
 import static android.media.Session2Command.RESULT_ERROR_UNKNOWN_ERROR;
 import static android.media.Session2Command.RESULT_INFO_SKIPPED;
+import static android.media.Session2Token.TYPE_SESSION;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -34,6 +34,7 @@
 import android.media.session.MediaSessionManager.RemoteUserInfo;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.Process;
 import android.os.ResultReceiver;
 import android.util.ArrayMap;
 import android.util.ArraySet;
@@ -107,10 +108,8 @@
         mCallbackExecutor = callbackExecutor;
         mCallback = callback;
         mSessionStub = new Session2Link(this);
-
-        Bundle extras = new Bundle();
-        extras.putParcelable(KEY_SESSION2_LINK, mSessionStub);
-        mSessionToken = new Session2Token(context, id, extras);
+        mSessionToken = new Session2Token(Process.myUid(), TYPE_SESSION, context.getPackageName(),
+                mSessionStub);
         mSessionManager = (MediaSessionManager) mContext.getSystemService(
                 Context.MEDIA_SESSION_SERVICE);
         // NOTE: mResultHandler uses main looper, so this MUST NOT be blocked.
@@ -142,8 +141,6 @@
             for (ControllerInfo info : controllerInfos) {
                 info.notifyDisconnected();
             }
-            mSessionToken.destroy();
-            mSessionManager.notifySession2Destroyed(mSessionToken);
         } catch (Exception e) {
             // Should not be here.
         }
@@ -331,7 +328,7 @@
                 // It's needed because we cannot call synchronous calls between
                 // session/controller.
                 Bundle connectionResult = new Bundle();
-                connectionResult.putParcelable(KEY_SESSION2_TOKEN, mSessionToken);
+                connectionResult.putParcelable(KEY_SESSION2LINK, mSessionStub);
                 connectionResult.putParcelable(KEY_ALLOWED_COMMANDS,
                         controllerInfo.mAllowedCommands);
                 connectionResult.putBoolean(KEY_PLAYBACK_ACTIVE, isPlaybackActive());
diff --git a/media/apex/java/android/media/MediaSession2Service.java b/media/apex/java/android/media/MediaSession2Service.java
index f18cd31..5bb746a 100644
--- a/media/apex/java/android/media/MediaSession2Service.java
+++ b/media/apex/java/android/media/MediaSession2Service.java
@@ -16,8 +16,6 @@
 
 package android.media;
 
-import static android.media.Session2Token.SESSION_SERVICE_INTERFACE;
-
 import android.annotation.CallSuper;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -47,6 +45,10 @@
  * for consistent behavior across all devices.
  */
 public abstract class MediaSession2Service extends Service {
+    /**
+     * The {@link Intent} that must be declared as handled by the service.
+     */
+    public static final String SERVICE_INTERFACE = "android.media.MediaSession2Service";
 
     private static final String TAG = "MediaSession2Service";
     private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
@@ -98,7 +100,7 @@
     @Override
     @Nullable
     public IBinder onBind(@NonNull Intent intent) {
-        if (SESSION_SERVICE_INTERFACE.equals(intent.getAction())) {
+        if (SERVICE_INTERFACE.equals(intent.getAction())) {
             synchronized (mLock) {
                 return mStub;
             }
diff --git a/media/java/android/media/Session2Token.java b/media/apex/java/android/media/Session2Token.java
similarity index 70%
rename from media/java/android/media/Session2Token.java
rename to media/apex/java/android/media/Session2Token.java
index 80494ad..238cc2b 100644
--- a/media/java/android/media/Session2Token.java
+++ b/media/apex/java/android/media/Session2Token.java
@@ -19,17 +19,13 @@
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
-import android.annotation.SystemApi;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
-import android.media.session.MediaSessionManager;
-import android.os.Bundle;
 import android.os.Parcel;
 import android.os.Parcelable;
-import android.os.Process;
 import android.text.TextUtils;
 import android.util.Log;
 
@@ -39,7 +35,7 @@
 import java.util.Objects;
 
 /**
- * Represents an ongoing MediaSession2 or a MediaSession2Service.
+ * Represents an ongoing {@link MediaSession2} or a {@link MediaSession2Service}.
  * If it's representing a session service, it may not be ongoing.
  * <p>
  * This API is not generally intended for third party application developers.
@@ -48,7 +44,7 @@
  * for consistent behavior across all devices.
  * <p>
  * This may be passed to apps by the session owner to allow them to create a
- * MediaController2 to communicate with the session.
+ * {@link MediaController2} to communicate with the session.
  * <p>
  * It can be also obtained by {@link android.media.session.MediaSessionManager}.
  */
@@ -68,13 +64,6 @@
     };
 
     /**
-     * The {@link Intent} that must be declared for the session service.
-     * @hide
-     */
-    @SystemApi
-    public static final String SESSION_SERVICE_INTERFACE = "android.media.MediaSession2Service";
-
-    /**
      * @hide
      */
     @Retention(RetentionPolicy.SOURCE)
@@ -83,26 +72,22 @@
     }
 
     /**
-     * Type for MediaSession2.
+     * Type for {@link MediaSession2}.
      */
     public static final int TYPE_SESSION = 0;
 
     /**
-     * Type for MediaSession2Service.
+     * Type for {@link MediaSession2Service}.
      */
     public static final int TYPE_SESSION_SERVICE = 1;
 
-    private final String mSessionId;
-    private final int mPid;
     private final int mUid;
     @TokenType
     private final int mType;
     private final String mPackageName;
     private final String mServiceName;
+    private final Session2Link mSessionLink;
     private final ComponentName mComponentName;
-    private final Bundle mExtras;
-
-    private boolean mDestroyed = false;
 
     /**
      * Constructor for the token with type {@link #TYPE_SESSION_SERVICE}.
@@ -121,67 +106,44 @@
         final PackageManager manager = context.getPackageManager();
         final int uid = getUid(manager, serviceComponent.getPackageName());
 
-        if (!isInterfaceDeclared(manager, SESSION_SERVICE_INTERFACE, serviceComponent)) {
+        if (!isInterfaceDeclared(manager, MediaSession2Service.SERVICE_INTERFACE,
+                serviceComponent)) {
             Log.w(TAG, serviceComponent + " doesn't implement MediaSession2Service.");
         }
-        mSessionId = null;
         mComponentName = serviceComponent;
         mPackageName = serviceComponent.getPackageName();
         mServiceName = serviceComponent.getClassName();
-        mPid = -1;
         mUid = uid;
         mType = TYPE_SESSION_SERVICE;
-        mExtras = null;
+        mSessionLink = null;
     }
 
-    /**
-     * Constructor for the token with type {@link #TYPE_SESSION}.
-     *
-     * @param context The context.
-     * @param sessionId The ID of the session. Should be unique.
-     * @param extras The extras.
-     * @hide
-     */
-    @SystemApi
-    public Session2Token(@NonNull Context context, @NonNull String sessionId,
-            @Nullable Bundle extras) {
-        if (sessionId == null) {
-            throw new IllegalArgumentException("sessionId shouldn't be null");
-        }
-        if (context == null) {
-            throw new IllegalArgumentException("context shouldn't be null");
-        }
-        mSessionId = sessionId;
-        mPid = Process.myPid();
-        mUid = Process.myUid();
-        mType = TYPE_SESSION;
-        mPackageName = context.getPackageName();
-        mExtras = extras;
+    Session2Token(int uid, int type, String packageName, Session2Link sessionLink) {
+        mUid = uid;
+        mType = type;
+        mPackageName = packageName;
         mServiceName = null;
         mComponentName = null;
+        mSessionLink = sessionLink;
     }
 
     Session2Token(Parcel in) {
-        mSessionId = in.readString();
-        mPid = in.readInt();
         mUid = in.readInt();
         mType = in.readInt();
         mPackageName = in.readString();
         mServiceName = in.readString();
+        mSessionLink = in.readParcelable(null);
         mComponentName = ComponentName.unflattenFromString(in.readString());
-        mExtras = in.readParcelable(null);
     }
 
     @Override
     public void writeToParcel(Parcel dest, int flags) {
-        dest.writeString(mSessionId);
-        dest.writeInt(mPid);
         dest.writeInt(mUid);
         dest.writeInt(mType);
         dest.writeString(mPackageName);
         dest.writeString(mServiceName);
+        dest.writeParcelable(mSessionLink, flags);
         dest.writeString(mComponentName == null ? "" : mComponentName.flattenToString());
-        dest.writeParcelable(mExtras, flags);
     }
 
     @Override
@@ -191,7 +153,7 @@
 
     @Override
     public int hashCode() {
-        return Objects.hash(mSessionId, mPid, mUid, mType, mPackageName, mServiceName);
+        return Objects.hash(mType, mUid, mPackageName, mServiceName, mSessionLink);
     }
 
     @Override
@@ -200,27 +162,17 @@
             return false;
         }
         Session2Token other = (Session2Token) obj;
-        return TextUtils.equals(mSessionId, other.mSessionId)
-                && mPid == other.mPid
-                && mUid == other.mUid
-                && mType == other.mType
+        return mUid == other.mUid
                 && TextUtils.equals(mPackageName, other.mPackageName)
-                && TextUtils.equals(mServiceName, other.mServiceName);
+                && TextUtils.equals(mServiceName, other.mServiceName)
+                && mType == other.mType
+                && Objects.equals(mSessionLink, other.mSessionLink);
     }
 
     @Override
     public String toString() {
         return "Session2Token {pkg=" + mPackageName + " type=" + mType
-                + " service=" + mServiceName + "}";
-    }
-
-    /**
-     * @return pid of the session
-     * @hide
-     */
-    @SystemApi
-    public int getPid() {
-        return mPid;
+                + " service=" + mServiceName + " Session2Link=" + mSessionLink + "}";
     }
 
     /**
@@ -255,36 +207,8 @@
         return mType;
     }
 
-    /**
-     * @return extras
-     * @hide
-     */
-    @SystemApi
-    @NonNull
-    public Bundle getExtras() {
-        return mExtras == null ? new Bundle() : new Bundle(mExtras);
-    }
-
-    /**
-     * Destroys this session token. After this method is called,
-     * {@link MediaSessionManager#notifySession2Created(Session2Token)} should not be called
-     * with this token.
-     *
-     * @see MediaSessionManager#notifySession2Created(Session2Token)
-     * @hide
-     */
-    @SystemApi
-    public void destroy() {
-        mDestroyed = true;
-    }
-
-    /**
-     * @return whether this token is destroyed
-     * @hide
-     */
-    @SystemApi
-    public boolean isDestroyed() {
-        return mDestroyed;
+    Session2Link getSessionLink() {
+        return mSessionLink;
     }
 
     private static boolean isInterfaceDeclared(PackageManager manager, String serviceInterface,
diff --git a/media/apex/java/android/media/VideoSize.java b/media/apex/java/android/media/VideoSize.java
deleted file mode 100644
index 19631e0..0000000
--- a/media/apex/java/android/media/VideoSize.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media;
-
-/**
- * Immutable class for describing width and height dimensions.
- */
-public final class VideoSize {
-    /**
-     * Create a new immutable VideoSize instance.
-     *
-     * @param width The width of the video size
-     * @param height The height of the video size
-     */
-    VideoSize(int width, int height) {
-        mWidth = width;
-        mHeight = height;
-    }
-
-    /**
-     * Get the width of the video size
-     * @return width
-     */
-    public int getWidth() {
-        return mWidth;
-    }
-
-    /**
-     * Get the height of the video size
-     * @return height
-     */
-    public int getHeight() {
-        return mHeight;
-    }
-
-    /**
-     * Check if this video size is equal to another video size.
-     * <p>
-     * Two video sizes are equal if and only if both their widths and heights are
-     * equal.
-     * </p>
-     * <p>
-     * A video size object is never equal to any other type of object.
-     * </p>
-     *
-     * @return {@code true} if the objects were equal, {@code false} otherwise
-     */
-    @Override
-    public boolean equals(final Object obj) {
-        if (obj == null) {
-            return false;
-        }
-        if (this == obj) {
-            return true;
-        }
-        if (obj instanceof VideoSize) {
-            VideoSize other = (VideoSize) obj;
-            return mWidth == other.mWidth && mHeight == other.mHeight;
-        }
-        return false;
-    }
-
-    /**
-     * Return the video size represented as a string with the format {@code "WxH"}
-     *
-     * @return string representation of the video size
-     */
-    @Override
-    public String toString() {
-        return mWidth + "x" + mHeight;
-    }
-
-    private final int mWidth;
-    private final int mHeight;
-}
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index ffa3b24..9218e92 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -17,6 +17,7 @@
 package android.media;
 
 import android.annotation.NonNull;
+import android.annotation.TestApi;
 import android.annotation.UnsupportedAppUsage;
 import android.bluetooth.BluetoothCodecConfig;
 import android.content.Context;
@@ -933,6 +934,13 @@
     /** @hide enables or disables the master mono mode. */
     public static native int setMasterMono(boolean mono);
 
+    /** @hide returns master balance value in range -1.f -> 1.f, where 0.f is dead center. */
+    @TestApi
+    public static native float getMasterBalance();
+    /** @hide changes the audio balance of the device. */
+    @TestApi
+    public static native int setMasterBalance(float balance);
+
     // helpers for android.media.AudioManager.getProperty(), see description there for meaning
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 112561552)
     public static native int getPrimaryOutputSamplingRate();
diff --git a/media/java/android/media/ImageReader.java b/media/java/android/media/ImageReader.java
index a4818a36..60ef1d9 100644
--- a/media/java/android/media/ImageReader.java
+++ b/media/java/android/media/ImageReader.java
@@ -820,6 +820,7 @@
                 case ImageFormat.JPEG:
                 case ImageFormat.DEPTH_POINT_CLOUD:
                 case ImageFormat.RAW_PRIVATE:
+                case ImageFormat.DEPTH_JPEG:
                     width = ImageReader.this.getWidth();
                     break;
                 default:
@@ -836,6 +837,7 @@
                 case ImageFormat.JPEG:
                 case ImageFormat.DEPTH_POINT_CLOUD:
                 case ImageFormat.RAW_PRIVATE:
+                case ImageFormat.DEPTH_JPEG:
                     height = ImageReader.this.getHeight();
                     break;
                 default:
diff --git a/media/java/android/media/ImageUtils.java b/media/java/android/media/ImageUtils.java
index 2a0e04e..b77a884 100644
--- a/media/java/android/media/ImageUtils.java
+++ b/media/java/android/media/ImageUtils.java
@@ -63,6 +63,7 @@
             case ImageFormat.DEPTH16:
             case ImageFormat.DEPTH_POINT_CLOUD:
             case ImageFormat.RAW_DEPTH:
+            case ImageFormat.DEPTH_JPEG:
                 return 1;
             case ImageFormat.PRIVATE:
                 return 0;
@@ -192,6 +193,7 @@
             // 10x compression from RGB_888
             case ImageFormat.JPEG:
             case ImageFormat.DEPTH_POINT_CLOUD:
+            case ImageFormat.DEPTH_JPEG:
                 estimatedBytePerPixel = 0.3;
                 break;
             case ImageFormat.Y8:
diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java
index f756658..0c3d625 100644
--- a/media/java/android/media/MediaCodec.java
+++ b/media/java/android/media/MediaCodec.java
@@ -3314,7 +3314,7 @@
      */
     public void setAudioPresentation(@NonNull AudioPresentation presentation) {
         if (presentation == null) {
-            throw new IllegalArgumentException("audio presentation is null");
+            throw new NullPointerException("audio presentation is null");
         }
         native_setAudioPresentation(presentation.getPresentationId(), presentation.getProgramId());
     }
diff --git a/media/java/android/media/MediaDescription.java b/media/java/android/media/MediaDescription.java
index 31079e5..39eeb3e 100644
--- a/media/java/android/media/MediaDescription.java
+++ b/media/java/android/media/MediaDescription.java
@@ -1,3 +1,19 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 package android.media;
 
 import android.annotation.Nullable;
@@ -226,7 +242,7 @@
             return false;
         }
 
-        if (!(o instanceof MediaDescription)){
+        if (!(o instanceof MediaDescription)) {
             return false;
         }
 
@@ -375,6 +391,11 @@
             return this;
         }
 
+        /**
+         * Build {@link MediaDescription}.
+         *
+         * @return a new media description.
+         */
         public MediaDescription build() {
             return new MediaDescription(mMediaId, mTitle, mSubtitle, mDescription, mIcon, mIconUri,
                     mExtras, mMediaUri);
diff --git a/media/java/android/media/MediaDrm.java b/media/java/android/media/MediaDrm.java
index 2d2c4a8..9258b85 100644
--- a/media/java/android/media/MediaDrm.java
+++ b/media/java/android/media/MediaDrm.java
@@ -1186,22 +1186,22 @@
     public static final int OFFLINE_LICENSE_STATE_UNKNOWN = 0;
 
     /**
-     * Offline license state is usable, the keys may be used for decryption.
+     * Offline license is usable, the keys may be used for decryption.
      */
-    public static final int OFFLINE_LICENSE_USABLE = 1;
+    public static final int OFFLINE_LICENSE_STATE_USABLE = 1;
 
     /**
-     * Offline license state is inactive, the keys have been marked for
-     * release using {@link #getKeyRequest} with KEY_TYPE_RELEASE but the
-     * key response has not been received.
+     * Offline license is released, the keys have been marked for
+     * release using {@link #getKeyRequest} with KEY_TYPE_RELEASE but
+     * the key response has not been received.
      */
-    public static final int OFFLINE_LICENSE_INACTIVE = 2;
+    public static final int OFFLINE_LICENSE_STATE_RELEASED = 2;
 
     /** @hide */
     @IntDef({
         OFFLINE_LICENSE_STATE_UNKNOWN,
-        OFFLINE_LICENSE_USABLE,
-        OFFLINE_LICENSE_INACTIVE,
+        OFFLINE_LICENSE_STATE_USABLE,
+        OFFLINE_LICENSE_STATE_RELEASED,
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface OfflineLicenseState {}
diff --git a/media/apex/java/android/media/MediaMetadata.aidl b/media/java/android/media/MediaMetadata.aidl
similarity index 100%
rename from media/apex/java/android/media/MediaMetadata.aidl
rename to media/java/android/media/MediaMetadata.aidl
diff --git a/media/apex/java/android/media/MediaMetadata.java b/media/java/android/media/MediaMetadata.java
similarity index 100%
rename from media/apex/java/android/media/MediaMetadata.java
rename to media/java/android/media/MediaMetadata.java
diff --git a/media/java/android/media/MediaMetadataRetriever.java b/media/java/android/media/MediaMetadataRetriever.java
index 33b8c42..112ce1d 100644
--- a/media/java/android/media/MediaMetadataRetriever.java
+++ b/media/java/android/media/MediaMetadataRetriever.java
@@ -920,12 +920,14 @@
     public static final int METADATA_KEY_VIDEO_FRAME_COUNT = 32;
 
     /**
-     * @hide
+     * If the media contains EXIF data, this key retrieves the offset value
+     * of the data.
      */
     public static final int METADATA_KEY_EXIF_OFFSET = 33;
 
     /**
-     * @hide
+     * If the media contains EXIF data, this key retrieves the length of the
+     * data.
      */
     public static final int METADATA_KEY_EXIF_LENGTH = 34;
 
diff --git a/media/apex/java/android/media/MediaParceledListSlice.aidl b/media/java/android/media/MediaParceledListSlice.aidl
similarity index 100%
rename from media/apex/java/android/media/MediaParceledListSlice.aidl
rename to media/java/android/media/MediaParceledListSlice.aidl
diff --git a/media/apex/java/android/media/MediaParceledListSlice.java b/media/java/android/media/MediaParceledListSlice.java
similarity index 100%
rename from media/apex/java/android/media/MediaParceledListSlice.java
rename to media/java/android/media/MediaParceledListSlice.java
diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java
index ffeff4d..3444e92 100644
--- a/media/java/android/media/MediaRouter.java
+++ b/media/java/android/media/MediaRouter.java
@@ -2357,8 +2357,7 @@
                 return;
             }
             if (mPlaybackType == RemoteControlClient.PLAYBACK_TYPE_REMOTE) {
-                @VolumeProvider.ControlType int volumeControl =
-                        VolumeProvider.VOLUME_CONTROL_FIXED;
+                int volumeControl = VolumeProvider.VOLUME_CONTROL_FIXED;
                 switch (mVolumeHandling) {
                     case RemoteControlClient.PLAYBACK_VOLUME_VARIABLE:
                         volumeControl = VolumeProvider.VOLUME_CONTROL_ABSOLUTE;
@@ -2384,8 +2383,7 @@
 
         class SessionVolumeProvider extends VolumeProvider {
 
-            public SessionVolumeProvider(@VolumeProvider.ControlType int volumeControl,
-                    int maxVolume, int currentVolume) {
+            SessionVolumeProvider(int volumeControl, int maxVolume, int currentVolume) {
                 super(volumeControl, maxVolume, currentVolume);
             }
 
diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java
index 33e7d8e..30719fd 100644
--- a/media/java/android/media/MediaScanner.java
+++ b/media/java/android/media/MediaScanner.java
@@ -1277,7 +1277,8 @@
                 // we need to query the database in small batches, to avoid problems
                 // with CursorWindow positioning.
                 long lastId = Long.MIN_VALUE;
-                Uri limitUri = mFilesUri.buildUpon().appendQueryParameter("limit", "1000").build();
+                Uri limitUri = mFilesUri.buildUpon()
+                        .appendQueryParameter(MediaStore.PARAM_LIMIT, "1000").build();
 
                 while (true) {
                     selectionArgs[0] = "" + lastId;
diff --git a/media/java/android/media/Rating.java b/media/java/android/media/Rating.java
index 04d5364f..ffe7e48 100644
--- a/media/java/android/media/Rating.java
+++ b/media/java/android/media/Rating.java
@@ -33,7 +33,7 @@
  * through one of the factory methods.
  */
 public final class Rating implements Parcelable {
-    private final static String TAG = "Rating";
+    private static final String TAG = "Rating";
 
     /**
      * @hide
@@ -55,40 +55,40 @@
      * type, but can be used by other classes to indicate they do not support
      * Rating.
      */
-    public final static int RATING_NONE = 0;
+    public static final int RATING_NONE = 0;
 
     /**
      * A rating style with a single degree of rating, "heart" vs "no heart". Can be used to
      * indicate the content referred to is a favorite (or not).
      */
-    public final static int RATING_HEART = 1;
+    public static final int RATING_HEART = 1;
 
     /**
      * A rating style for "thumb up" vs "thumb down".
      */
-    public final static int RATING_THUMB_UP_DOWN = 2;
+    public static final int RATING_THUMB_UP_DOWN = 2;
 
     /**
      * A rating style with 0 to 3 stars.
      */
-    public final static int RATING_3_STARS = 3;
+    public static final int RATING_3_STARS = 3;
 
     /**
      * A rating style with 0 to 4 stars.
      */
-    public final static int RATING_4_STARS = 4;
+    public static final int RATING_4_STARS = 4;
 
     /**
      * A rating style with 0 to 5 stars.
      */
-    public final static int RATING_5_STARS = 5;
+    public static final int RATING_5_STARS = 5;
 
     /**
      * A rating style expressed as a percentage.
      */
-    public final static int RATING_PERCENTAGE = 6;
+    public static final int RATING_PERCENTAGE = 6;
 
-    private final static float RATING_NOT_RATED = -1.0f;
+    private static final float RATING_NOT_RATED = -1.0f;
 
     private final int mRatingStyle;
 
@@ -116,8 +116,7 @@
         dest.writeFloat(mRatingValue);
     }
 
-    public static final Parcelable.Creator<Rating> CREATOR
-            = new Parcelable.Creator<Rating>() {
+    public static final Parcelable.Creator<Rating> CREATOR = new Parcelable.Creator<Rating>() {
         /**
          * Rebuilds a Rating previously stored with writeToParcel().
          * @param p    Parcel object to read the Rating from
@@ -205,7 +204,7 @@
                 break;
             default:
                 Log.e(TAG, "Invalid rating style (" + starRatingStyle + ") for a star rating");
-                        return null;
+                return null;
         }
         if ((starRating < 0.0f) || (starRating > maxRating)) {
             Log.e(TAG, "Trying to set out of range star-based rating");
@@ -281,16 +280,16 @@
      *    not star-based, or if it is unrated.
      */
     public float getStarRating() {
+        float ratingValue = -1.0f;
         switch (mRatingStyle) {
             case RATING_3_STARS:
             case RATING_4_STARS:
             case RATING_5_STARS:
                 if (isRated()) {
-                    return mRatingValue;
+                    ratingValue = mRatingValue;
                 }
-            default:
-                return -1.0f;
         }
+        return ratingValue;
     }
 
     /**
diff --git a/media/apex/java/android/media/VolumeProvider.java b/media/java/android/media/VolumeProvider.java
similarity index 98%
rename from media/apex/java/android/media/VolumeProvider.java
rename to media/java/android/media/VolumeProvider.java
index 49202ee..8f68cbd 100644
--- a/media/apex/java/android/media/VolumeProvider.java
+++ b/media/java/android/media/VolumeProvider.java
@@ -16,7 +16,6 @@
 package android.media;
 
 import android.annotation.IntDef;
-import android.annotation.SystemApi;
 import android.media.session.MediaSession;
 
 import java.lang.annotation.Retention;
@@ -148,7 +147,6 @@
      * Sets a callback to receive volume changes.
      * @hide
      */
-    @SystemApi
     public void setCallback(Callback callback) {
         mCallback = callback;
     }
@@ -157,7 +155,6 @@
      * Listens for changes to the volume.
      * @hide
      */
-    @SystemApi
     public abstract static class Callback {
         /**
          * Called when volume changed.
diff --git a/media/apex/java/android/media/browse/MediaBrowser.aidl b/media/java/android/media/browse/MediaBrowser.aidl
similarity index 100%
rename from media/apex/java/android/media/browse/MediaBrowser.aidl
rename to media/java/android/media/browse/MediaBrowser.aidl
diff --git a/media/apex/java/android/media/browse/MediaBrowser.java b/media/java/android/media/browse/MediaBrowser.java
similarity index 100%
rename from media/apex/java/android/media/browse/MediaBrowser.java
rename to media/java/android/media/browse/MediaBrowser.java
diff --git a/media/apex/java/android/media/browse/MediaBrowserUtils.java b/media/java/android/media/browse/MediaBrowserUtils.java
similarity index 100%
rename from media/apex/java/android/media/browse/MediaBrowserUtils.java
rename to media/java/android/media/browse/MediaBrowserUtils.java
diff --git a/media/apex/java/android/media/session/ControllerCallbackLink.aidl b/media/java/android/media/session/ControllerCallbackLink.aidl
similarity index 100%
rename from media/apex/java/android/media/session/ControllerCallbackLink.aidl
rename to media/java/android/media/session/ControllerCallbackLink.aidl
diff --git a/media/apex/java/android/media/session/ControllerCallbackLink.java b/media/java/android/media/session/ControllerCallbackLink.java
similarity index 99%
rename from media/apex/java/android/media/session/ControllerCallbackLink.java
rename to media/java/android/media/session/ControllerCallbackLink.java
index adc14a5..428be0d 100644
--- a/media/apex/java/android/media/session/ControllerCallbackLink.java
+++ b/media/java/android/media/session/ControllerCallbackLink.java
@@ -20,7 +20,6 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.RequiresPermission;
-import android.annotation.SystemApi;
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.media.MediaMetadata;
@@ -41,7 +40,6 @@
  * Handles incoming commands to {@link MediaController.Callback}.
  * @hide
  */
-@SystemApi
 public final class ControllerCallbackLink implements Parcelable {
     final Context mContext;
     final CallbackStub mCallbackStub;
diff --git a/media/apex/java/android/media/session/ControllerLink.aidl b/media/java/android/media/session/ControllerLink.aidl
similarity index 100%
rename from media/apex/java/android/media/session/ControllerLink.aidl
rename to media/java/android/media/session/ControllerLink.aidl
diff --git a/media/apex/java/android/media/session/ControllerLink.java b/media/java/android/media/session/ControllerLink.java
similarity index 96%
rename from media/apex/java/android/media/session/ControllerLink.java
rename to media/java/android/media/session/ControllerLink.java
index 937df20..64d283f 100644
--- a/media/apex/java/android/media/session/ControllerLink.java
+++ b/media/java/android/media/session/ControllerLink.java
@@ -18,7 +18,6 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
-import android.annotation.SystemApi;
 import android.app.PendingIntent;
 import android.media.MediaMetadata;
 import android.media.MediaParceledListSlice;
@@ -34,12 +33,12 @@
 import android.view.KeyEvent;
 
 import java.util.List;
+import java.util.Objects;
 
 /**
  * Handles incoming commands from {@link MediaController}.
  * @hide
  */
-@SystemApi
 public final class ControllerLink implements Parcelable {
     public static final Parcelable.Creator<ControllerLink> CREATOR =
             new Parcelable.Creator<ControllerLink>() {
@@ -96,15 +95,12 @@
      *
      * @param packageName the package name of the controller
      * @param caller the {@link ControllerCallbackLink} of the controller
-     * @param asSystemService whether this event should be considered as from system service
      * @param mediaButton the media button key event
      */
     boolean sendMediaButton(@NonNull String packageName,
-            @NonNull ControllerCallbackLink caller, boolean asSystemService,
-            @NonNull KeyEvent mediaButton) {
+            @NonNull ControllerCallbackLink caller, @NonNull KeyEvent mediaButton) {
         try {
-            return mISessionController.sendMediaButton(packageName, caller, asSystemService,
-                    mediaButton);
+            return mISessionController.sendMediaButton(packageName, caller, mediaButton);
         } catch (RemoteException e) {
             throw new RuntimeException(e);
         }
@@ -202,16 +198,14 @@
      * @param packageName the package name of the controller
      * @param opPackageName the op package name of this request
      * @param caller the {@link ControllerCallbackLink} of the controller
-     * @param asSystemService whether this event should be considered as from system service
      * @param direction the direction to adjust the volume in
      * @param flags the flags with this volume change request
      */
     void adjustVolume(@NonNull String packageName, @NonNull String opPackageName,
-            @NonNull ControllerCallbackLink caller, boolean asSystemService, int direction,
+            @NonNull ControllerCallbackLink caller, int direction,
             int flags) {
         try {
-            mISessionController.adjustVolume(packageName, opPackageName, caller, asSystemService,
-                    direction, flags);
+            mISessionController.adjustVolume(packageName, opPackageName, caller, direction, flags);
         } catch (RemoteException e) {
             throw new RuntimeException(e);
         }
@@ -603,6 +597,23 @@
         dest.writeStrongBinder(mISessionController.asBinder());
     }
 
+    @Override
+    public int hashCode() {
+        return mISessionController.asBinder().hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!(obj instanceof ControllerLink)) {
+            return false;
+        }
+        ControllerLink other = (ControllerLink) obj;
+        return Objects.equals(getBinder(), other.getBinder());
+    }
+
     /**
      * Class for Stub implementation
      */
@@ -614,8 +625,7 @@
 
         /** Stub method for ISessionController.sendMediaButton */
         public boolean sendMediaButton(@NonNull String packageName,
-                @NonNull ControllerCallbackLink caller, boolean asSystemService,
-                @NonNull KeyEvent mediaButton) {
+                @NonNull ControllerCallbackLink caller, @NonNull KeyEvent mediaButton) {
             return false;
         }
 
@@ -659,8 +669,7 @@
 
         /** Stub method for ISessionController.adjustVolume */
         public void adjustVolume(@NonNull String packageName, @NonNull String opPackageName,
-                @NonNull ControllerCallbackLink caller, boolean asSystemService, int direction,
-                int flags) {
+                @NonNull ControllerCallbackLink caller, int direction, int flags) {
         }
 
         /** Stub method for ISessionController.setVolumeTo */
@@ -801,9 +810,8 @@
 
         @Override
         public boolean sendMediaButton(String packageName, ControllerCallbackLink caller,
-                boolean asSystemService, KeyEvent mediaButton) {
-            return mControllerStub.sendMediaButton(packageName, caller, asSystemService,
-                    mediaButton);
+                KeyEvent mediaButton) {
+            return mControllerStub.sendMediaButton(packageName, caller, mediaButton);
         }
 
         @Override
@@ -843,10 +851,8 @@
 
         @Override
         public void adjustVolume(String packageName, String opPackageName,
-                ControllerCallbackLink caller, boolean asSystemService, int direction,
-                int flags) {
-            mControllerStub.adjustVolume(packageName, opPackageName, caller, asSystemService,
-                    direction, flags);
+                ControllerCallbackLink caller, int direction, int flags) {
+            mControllerStub.adjustVolume(packageName, opPackageName, caller, direction, flags);
         }
 
         @Override
diff --git a/media/apex/java/android/media/session/ISession.aidl b/media/java/android/media/session/ISession.aidl
similarity index 100%
rename from media/apex/java/android/media/session/ISession.aidl
rename to media/java/android/media/session/ISession.aidl
diff --git a/media/apex/java/android/media/session/ISessionCallback.aidl b/media/java/android/media/session/ISessionCallback.aidl
similarity index 100%
rename from media/apex/java/android/media/session/ISessionCallback.aidl
rename to media/java/android/media/session/ISessionCallback.aidl
diff --git a/media/apex/java/android/media/session/ISessionController.aidl b/media/java/android/media/session/ISessionController.aidl
similarity index 95%
rename from media/apex/java/android/media/session/ISessionController.aidl
rename to media/java/android/media/session/ISessionController.aidl
index a3439a1..e697c65 100644
--- a/media/apex/java/android/media/session/ISessionController.aidl
+++ b/media/java/android/media/session/ISessionController.aidl
@@ -39,7 +39,7 @@
     void sendCommand(String packageName, in ControllerCallbackLink caller,
             String command, in Bundle args, in ResultReceiver cb);
     boolean sendMediaButton(String packageName, in ControllerCallbackLink caller,
-            boolean asSystemService, in KeyEvent mediaButton);
+            in KeyEvent mediaButton);
     void registerCallback(String packageName, in ControllerCallbackLink cb);
     void unregisterCallback(in ControllerCallbackLink cb);
     String getPackageName();
@@ -48,8 +48,7 @@
     long getFlags();
     MediaController.PlaybackInfo getVolumeAttributes();
     void adjustVolume(String packageName, String opPackageName,
-            in ControllerCallbackLink caller, boolean asSystemService, int direction,
-            int flags);
+            in ControllerCallbackLink caller, int direction, int flags);
     void setVolumeTo(String packageName, String opPackageName, in ControllerCallbackLink caller,
             int value, int flags);
 
diff --git a/media/apex/java/android/media/session/ISessionControllerCallback.aidl b/media/java/android/media/session/ISessionControllerCallback.aidl
similarity index 100%
rename from media/apex/java/android/media/session/ISessionControllerCallback.aidl
rename to media/java/android/media/session/ISessionControllerCallback.aidl
diff --git a/media/java/android/media/session/ISessionManager.aidl b/media/java/android/media/session/ISessionManager.aidl
index fa6e034..8143bfa 100644
--- a/media/java/android/media/session/ISessionManager.aidl
+++ b/media/java/android/media/session/ISessionManager.aidl
@@ -18,12 +18,12 @@
 import android.content.ComponentName;
 import android.media.IRemoteVolumeController;
 import android.media.Session2Token;
-import android.media.session.ControllerLink;
 import android.media.session.IActiveSessionsListener;
 import android.media.session.ICallback;
 import android.media.session.IOnMediaKeyListener;
 import android.media.session.IOnVolumeKeyLongPressListener;
 import android.media.session.ISession2TokensListener;
+import android.media.session.MediaSession;
 import android.media.session.SessionCallbackLink;
 import android.media.session.SessionLink;
 import android.os.Bundle;
@@ -37,13 +37,16 @@
     SessionLink createSession(String packageName, in SessionCallbackLink sessionCb, String tag,
             int userId);
     void notifySession2Created(in Session2Token sessionToken);
-    void notifySession2Destroyed(in Session2Token sessionToken);
-    List<ControllerLink> getSessions(in ComponentName compName, int userId);
+    List<MediaSession.Token> getSessions(in ComponentName compName, int userId);
     List<Session2Token> getSession2Tokens(int userId);
     void dispatchMediaKeyEvent(String packageName, boolean asSystemService, in KeyEvent keyEvent,
             boolean needWakeLock);
+    boolean dispatchMediaKeyEventToSessionAsSystemService(String packageName,
+            in MediaSession.Token sessionToken, in KeyEvent keyEvent);
     void dispatchVolumeKeyEvent(String packageName, String opPackageName, boolean asSystemService,
             in KeyEvent keyEvent, int stream, boolean musicOnly);
+    void dispatchVolumeKeyEventToSessionAsSystemService(String packageName, String opPackageName,
+            in MediaSession.Token sessionToken, in KeyEvent keyEvent);
     void dispatchAdjustVolume(String packageName, String opPackageName, int suggestedStream,
             int delta, int flags);
     void addSessionsListener(in IActiveSessionsListener listener, in ComponentName compName,
diff --git a/media/apex/java/android/media/session/MediaController.aidl b/media/java/android/media/session/MediaController.aidl
similarity index 100%
rename from media/apex/java/android/media/session/MediaController.aidl
rename to media/java/android/media/session/MediaController.aidl
diff --git a/media/apex/java/android/media/session/MediaController.java b/media/java/android/media/session/MediaController.java
similarity index 90%
rename from media/apex/java/android/media/session/MediaController.java
rename to media/java/android/media/session/MediaController.java
index d43acf4..6e2c8c5 100644
--- a/media/apex/java/android/media/session/MediaController.java
+++ b/media/java/android/media/session/MediaController.java
@@ -18,6 +18,7 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.SystemApi;
 import android.annotation.UnsupportedAppUsage;
 import android.app.PendingIntent;
 import android.content.Context;
@@ -82,42 +83,26 @@
     private final TransportControls mTransportControls;
 
     /**
-     * Call for creating a MediaController directly from a controller link. Should only
-     * be used by framework code.
-     * @hide
-     */
-    public MediaController(Context context, ControllerLink sessionBinder) {
-        if (sessionBinder == null) {
-            throw new IllegalArgumentException("Session token cannot be null");
-        }
-        if (context == null) {
-            throw new IllegalArgumentException("Context cannot be null");
-        }
-        mSessionBinder = sessionBinder;
-        mTransportControls = new TransportControls();
-        mToken = new MediaSession.Token(sessionBinder);
-        mContext = context;
-        mCbStub = new ControllerCallbackLink(context, new CallbackStub(this));
-    }
-
-    /**
-     * Call for creating a MediaController directly from a binder. Should only
-     * be used by framework code.
-     * @hide
-     * TODO: remove this constructor
-     */
-    public MediaController(Context context, ISessionController sessionBinder) {
-        this(context, new ControllerLink(sessionBinder.asBinder()));
-    }
-
-    /**
      * Create a new MediaController from a session's token.
      *
      * @param context The caller's context.
      * @param token The token for the session.
      */
     public MediaController(@NonNull Context context, @NonNull MediaSession.Token token) {
-        this(context, token.getControllerLink());
+        if (context == null) {
+            throw new IllegalArgumentException("context shouldn't be null");
+        }
+        if (token == null) {
+            throw new IllegalArgumentException("token shouldn't be null");
+        }
+        if (token.getControllerLink() == null) {
+            throw new IllegalArgumentException("token.getControllerLink() shouldn't be null");
+        }
+        mSessionBinder = token.getControllerLink();
+        mTransportControls = new TransportControls();
+        mToken = token;
+        mContext = context;
+        mCbStub = new ControllerCallbackLink(context, new CallbackStub(this));
     }
 
     /**
@@ -138,25 +123,6 @@
      * @return true if the event was sent to the session, false otherwise.
      */
     public boolean dispatchMediaButtonEvent(@NonNull KeyEvent keyEvent) {
-        return dispatchMediaButtonEventInternal(false, keyEvent);
-    }
-
-    /**
-     * Dispatches the media button event as system service to the session.
-     * <p>
-     * Should be only called by the {@link com.android.internal.policy.PhoneWindow} when the
-     * foreground activity didn't consume the key from the hardware devices.
-     *
-     * @param keyEvent media key event
-     * @return {@code true} if the event was sent to the session, {@code false} otherwise
-     * @hide
-     */
-    public boolean dispatchMediaButtonEventAsSystemService(@NonNull KeyEvent keyEvent) {
-        return dispatchMediaButtonEventInternal(true, keyEvent);
-    }
-
-    private boolean dispatchMediaButtonEventInternal(boolean asSystemService,
-            @NonNull KeyEvent keyEvent) {
         if (keyEvent == null) {
             throw new IllegalArgumentException("KeyEvent may not be null");
         }
@@ -164,8 +130,7 @@
             return false;
         }
         try {
-            return mSessionBinder.sendMediaButton(mContext.getPackageName(), mCbStub,
-                    asSystemService, keyEvent);
+            return mSessionBinder.sendMediaButton(mContext.getPackageName(), mCbStub, keyEvent);
         } catch (RuntimeException e) {
             // System is dead. =(
         }
@@ -173,59 +138,6 @@
     }
 
     /**
-     * Dispatches the volume button event as system service to the session.
-     * <p>
-     * Should be only called by the {@link com.android.internal.policy.PhoneWindow} when the
-     * foreground activity didn't consume the key from the hardware devices.
-     *
-     * @param keyEvent volume key event
-     * @hide
-     */
-    public void dispatchVolumeButtonEventAsSystemService(@NonNull KeyEvent keyEvent) {
-        switch (keyEvent.getAction()) {
-            case KeyEvent.ACTION_DOWN: {
-                int direction = 0;
-                switch (keyEvent.getKeyCode()) {
-                    case KeyEvent.KEYCODE_VOLUME_UP:
-                        direction = AudioManager.ADJUST_RAISE;
-                        break;
-                    case KeyEvent.KEYCODE_VOLUME_DOWN:
-                        direction = AudioManager.ADJUST_LOWER;
-                        break;
-                    case KeyEvent.KEYCODE_VOLUME_MUTE:
-                        direction = AudioManager.ADJUST_TOGGLE_MUTE;
-                        break;
-                }
-                try {
-                    // Note: Need both package name and OP package name. Package name is used for
-                    //       RemoteUserInfo, and OP package name is used for AudioService's internal
-                    //       AppOpsManager usages.
-                    mSessionBinder.adjustVolume(mContext.getPackageName(),
-                            mContext.getOpPackageName(), mCbStub, true, direction,
-                            AudioManager.FLAG_SHOW_UI);
-                } catch (RuntimeException e) {
-                    Log.wtf(TAG, "Error calling adjustVolumeBy", e);
-                }
-                break;
-            }
-
-            case KeyEvent.ACTION_UP: {
-                final int flags = AudioManager.FLAG_PLAY_SOUND | AudioManager.FLAG_VIBRATE
-                        | AudioManager.FLAG_FROM_KEY;
-                try {
-                    // Note: Need both package name and OP package name. Package name is used for
-                    //       RemoteUserInfo, and OP package name is used for AudioService's internal
-                    //       AppOpsManager usages.
-                    mSessionBinder.adjustVolume(mContext.getPackageName(),
-                            mContext.getOpPackageName(), mCbStub, true, 0, flags);
-                } catch (RuntimeException e) {
-                    Log.wtf(TAG, "Error calling adjustVolumeBy", e);
-                }
-            }
-        }
-    }
-
-    /**
      * Get the current playback state for this session.
      *
      * @return The current PlaybackState or null
@@ -409,7 +321,7 @@
             //       RemoteUserInfo, and OP package name is used for AudioService's internal
             //       AppOpsManager usages.
             mSessionBinder.adjustVolume(mContext.getPackageName(), mContext.getOpPackageName(),
-                    mCbStub, false, direction, flags);
+                    mCbStub, direction, flags);
         } catch (RuntimeException e) {
             Log.wtf(TAG, "Error calling adjustVolumeBy.", e);
         }
@@ -1011,6 +923,7 @@
         /**
          * @hide
          */
+        @SystemApi
         public PlaybackInfo(int type, int control, int max, int current, AudioAttributes attrs) {
             mVolumeType = type;
             mVolumeControl = control;
diff --git a/media/java/android/media/session/MediaSession.java b/media/java/android/media/session/MediaSession.java
index 1a185e9..1b9ebda 100644
--- a/media/java/android/media/session/MediaSession.java
+++ b/media/java/android/media/session/MediaSession.java
@@ -19,7 +19,6 @@
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
-import android.annotation.SystemApi;
 import android.annotation.UnsupportedAppUsage;
 import android.app.Activity;
 import android.app.PendingIntent;
@@ -36,6 +35,7 @@
 import android.os.Handler;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.os.Process;
 import android.os.ResultReceiver;
 import android.service.media.MediaBrowserService;
 import android.text.TextUtils;
@@ -43,6 +43,7 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * Allows interaction with media controllers, volume keys, media buttons, and
@@ -115,6 +116,7 @@
     public @interface SessionFlags { }
 
     private final MediaSessionEngine mImpl;
+    private final int mMaxBitmapSize;
 
     // Do not change the name of mCallback. Support lib accesses this by using reflection.
     @UnsupportedAppUsage
@@ -139,12 +141,11 @@
         MediaSessionManager manager = (MediaSessionManager) context
                 .getSystemService(Context.MEDIA_SESSION_SERVICE);
         try {
-            MediaSessionEngine.CallbackStub cbStub = new MediaSessionEngine.CallbackStub();
-            SessionCallbackLink cbLink = new SessionCallbackLink(context, cbStub);
+            SessionCallbackLink cbLink = new SessionCallbackLink(context);
             SessionLink sessionLink = manager.createSession(cbLink, tag);
-            mImpl = new MediaSessionEngine(context, sessionLink, cbLink, cbStub,
-                    context.getResources().getDimensionPixelSize(
-                            android.R.dimen.config_mediaMetadataBitmapMaxSize));
+            mImpl = new MediaSessionEngine(context, sessionLink, cbLink);
+            mMaxBitmapSize = context.getResources().getDimensionPixelSize(
+                    android.R.dimen.config_mediaMetadataBitmapMaxSize);
         } catch (RuntimeException e) {
             throw new RuntimeException("Remote error creating session.", e);
         }
@@ -322,6 +323,9 @@
      * @see android.media.MediaMetadata.Builder#putBitmap
      */
     public void setMetadata(@Nullable MediaMetadata metadata) {
+        if (metadata != null) {
+            metadata = new MediaMetadata.Builder(metadata, mMaxBitmapSize).build();
+        }
         mImpl.setMetadata(metadata);
     }
 
@@ -392,16 +396,6 @@
     }
 
     /**
-     * Notify the system that the remote volume changed.
-     *
-     * @param provider The provider that is handling volume changes.
-     * @hide
-     */
-    public void notifyRemoteVolumeChanged(VolumeProvider provider) {
-        mImpl.notifyRemoteVolumeChanged(provider);
-    }
-
-    /**
      * Returns the name of the package that sent the last media button, transport control, or
      * command from controllers and the system. This is only valid while in a request callback, such
      * as {@link Callback#onPlay}.
@@ -429,15 +423,22 @@
      */
     public static final class Token implements Parcelable {
 
-        private ControllerLink mControllerLink;
+        private final int mUid;
+        private final ControllerLink mControllerLink;
 
         /**
          * @hide
          */
         public Token(ControllerLink controllerLink) {
+            mUid = Process.myUid();
             mControllerLink = controllerLink;
         }
 
+        Token(Parcel in) {
+            mUid = in.readInt();
+            mControllerLink = in.readParcelable(null);
+        }
+
         @Override
         public int describeContents() {
             return 0;
@@ -445,13 +446,14 @@
 
         @Override
         public void writeToParcel(Parcel dest, int flags) {
+            dest.writeInt(mUid);
             dest.writeParcelable(mControllerLink, flags);
         }
 
         @Override
         public int hashCode() {
             final int prime = 31;
-            int result = 1;
+            int result = mUid;
             result = prime * result + ((mControllerLink == null)
                     ? 0 : mControllerLink.getBinder().hashCode());
             return result;
@@ -466,21 +468,24 @@
             if (getClass() != obj.getClass())
                 return false;
             Token other = (Token) obj;
-            if (mControllerLink == null) {
-                if (other.mControllerLink != null) {
-                    return false;
-                }
-            } else if (!mControllerLink.getBinder().equals(other.mControllerLink.getBinder())) {
+            if (mUid != other.mUid) {
                 return false;
             }
-            return true;
+            return Objects.equals(mControllerLink, other.mControllerLink);
+        }
+
+        /**
+         * Gets the UID of this token.
+         * @hide
+         */
+        public int getUid() {
+            return mUid;
         }
 
         /**
          * Gets the controller link in this token.
          * @hide
          */
-        @SystemApi
         public ControllerLink getControllerLink() {
             return mControllerLink;
         }
@@ -489,8 +494,7 @@
                 new Parcelable.Creator<Token>() {
             @Override
             public Token createFromParcel(Parcel in) {
-                ControllerLink link = in.readParcelable(null);
-                return new Token(link);
+                return new Token(in);
             }
 
             @Override
@@ -690,7 +694,6 @@
         /**
          * @hide
          */
-        @SystemApi
         public void onSetMediaButtonEventDelegate(
                 @NonNull MediaSessionEngine.MediaButtonEventDelegate delegate) {
             mMediaButtonEventDelegate = delegate;
diff --git a/media/apex/java/android/media/session/MediaSessionEngine.java b/media/java/android/media/session/MediaSessionEngine.java
similarity index 77%
rename from media/apex/java/android/media/session/MediaSessionEngine.java
rename to media/java/android/media/session/MediaSessionEngine.java
index 1f5fa5f..e19bdbc 100644
--- a/media/apex/java/android/media/session/MediaSessionEngine.java
+++ b/media/java/android/media/session/MediaSessionEngine.java
@@ -18,8 +18,6 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.annotation.UnsupportedAppUsage;
 import android.app.Activity;
 import android.app.PendingIntent;
 import android.content.Context;
@@ -44,27 +42,21 @@
 import android.view.KeyEvent;
 import android.view.ViewConfiguration;
 
-import java.lang.ref.WeakReference;
 import java.util.List;
 import java.util.Objects;
 
 /**
  * @hide
  */
-@SystemApi
 public final class MediaSessionEngine implements AutoCloseable {
     private static final String TAG = "MediaSession";
 
     private final Object mLock = new Object();
-    private final int mMaxBitmapSize;
 
     private final MediaSession.Token mSessionToken;
     private final MediaController mController;
     private final SessionLink mSessionLink;
-    private final SessionCallbackLink mCbLink;
 
-    // Do not change the name of mCallbackWrapper. Support lib accesses this by using reflection.
-    @UnsupportedAppUsage
     private CallbackMessageHandler mCallbackHandler;
     private VolumeProvider mVolumeProvider;
     private PlaybackState mPlaybackState;
@@ -79,15 +71,12 @@
      *
      * @param context The context to use to create the session.
      * @param sessionLink A session link for the binder of MediaSessionRecord
-     * @param cbStub A callback link that handles incoming command to {@link MediaSession.Callback}.
      */
     public MediaSessionEngine(@NonNull Context context, @NonNull SessionLink sessionLink,
-            @NonNull SessionCallbackLink cbLink, @NonNull CallbackStub cbStub, int maxBitmapSize) {
+            @NonNull SessionCallbackLink cbLink) {
         mSessionLink = sessionLink;
-        mCbLink = cbLink;
-        mMaxBitmapSize = maxBitmapSize;
 
-        cbStub.setSessionImpl(this);
+        cbLink.setSessionEngine(this);
         mSessionToken = new MediaSession.Token(mSessionLink.getController());
         mController = new MediaController(context, mSessionToken);
     }
@@ -346,7 +335,6 @@
         int fields = 0;
         MediaDescription description = null;
         if (metadata != null) {
-            metadata = (new MediaMetadata.Builder(metadata, mMaxBitmapSize)).build();
             if (metadata.containsKey(MediaMetadata.METADATA_KEY_DURATION)) {
                 duration = metadata.getLong(MediaMetadata.METADATA_KEY_DURATION);
             }
@@ -451,12 +439,24 @@
     }
 
     /**
+     * Returns the name of the package that sent the last media button, transport control, or
+     * command from controllers and the system. This is only valid while in a request callback, such
+     * as {@link MediaSession.Callback#onPlay}.
+     */
+    public String getCallingPackage() {
+        if (mCallbackHandler != null && mCallbackHandler.mCurrentControllerInfo != null) {
+            return mCallbackHandler.mCurrentControllerInfo.getPackageName();
+        }
+        return null;
+    }
+
+
+    /**
      * Notify the system that the remote volume changed.
      *
      * @param provider The provider that is handling volume changes.
-     * @hide
      */
-    public void notifyRemoteVolumeChanged(VolumeProvider provider) {
+    private void notifyRemoteVolumeChanged(VolumeProvider provider) {
         synchronized (mLock) {
             if (provider == null || provider != mVolumeProvider) {
                 Log.w(TAG, "Received update from stale volume provider");
@@ -470,109 +470,97 @@
         }
     }
 
-    /**
-     * Returns the name of the package that sent the last media button, transport control, or
-     * command from controllers and the system. This is only valid while in a request callback, such
-     * as {@link MediaSession.Callback#onPlay}.
-     */
-    public String getCallingPackage() {
-        if (mCallbackHandler != null && mCallbackHandler.mCurrentControllerInfo != null) {
-            return mCallbackHandler.mCurrentControllerInfo.getPackageName();
-        }
-        return null;
-    }
-
-    private void dispatchPrepare(RemoteUserInfo caller) {
+    void dispatchPrepare(RemoteUserInfo caller) {
         postToCallback(caller, CallbackMessageHandler.MSG_PREPARE, null, null);
     }
 
-    private void dispatchPrepareFromMediaId(RemoteUserInfo caller, String mediaId, Bundle extras) {
+    void dispatchPrepareFromMediaId(RemoteUserInfo caller, String mediaId, Bundle extras) {
         postToCallback(caller, CallbackMessageHandler.MSG_PREPARE_MEDIA_ID, mediaId, extras);
     }
 
-    private void dispatchPrepareFromSearch(RemoteUserInfo caller, String query, Bundle extras) {
+    void dispatchPrepareFromSearch(RemoteUserInfo caller, String query, Bundle extras) {
         postToCallback(caller, CallbackMessageHandler.MSG_PREPARE_SEARCH, query, extras);
     }
 
-    private void dispatchPrepareFromUri(RemoteUserInfo caller, Uri uri, Bundle extras) {
+    void dispatchPrepareFromUri(RemoteUserInfo caller, Uri uri, Bundle extras) {
         postToCallback(caller, CallbackMessageHandler.MSG_PREPARE_URI, uri, extras);
     }
 
-    private void dispatchPlay(RemoteUserInfo caller) {
+    void dispatchPlay(RemoteUserInfo caller) {
         postToCallback(caller, CallbackMessageHandler.MSG_PLAY, null, null);
     }
 
-    private void dispatchPlayFromMediaId(RemoteUserInfo caller, String mediaId, Bundle extras) {
+    void dispatchPlayFromMediaId(RemoteUserInfo caller, String mediaId, Bundle extras) {
         postToCallback(caller, CallbackMessageHandler.MSG_PLAY_MEDIA_ID, mediaId, extras);
     }
 
-    private void dispatchPlayFromSearch(RemoteUserInfo caller, String query, Bundle extras) {
+    void dispatchPlayFromSearch(RemoteUserInfo caller, String query, Bundle extras) {
         postToCallback(caller, CallbackMessageHandler.MSG_PLAY_SEARCH, query, extras);
     }
 
-    private void dispatchPlayFromUri(RemoteUserInfo caller, Uri uri, Bundle extras) {
+    void dispatchPlayFromUri(RemoteUserInfo caller, Uri uri, Bundle extras) {
         postToCallback(caller, CallbackMessageHandler.MSG_PLAY_URI, uri, extras);
     }
 
-    private void dispatchSkipToItem(RemoteUserInfo caller, long id) {
+    void dispatchSkipToItem(RemoteUserInfo caller, long id) {
         postToCallback(caller, CallbackMessageHandler.MSG_SKIP_TO_ITEM, id, null);
     }
 
-    private void dispatchPause(RemoteUserInfo caller) {
+    void dispatchPause(RemoteUserInfo caller) {
         postToCallback(caller, CallbackMessageHandler.MSG_PAUSE, null, null);
     }
 
-    private void dispatchStop(RemoteUserInfo caller) {
+    void dispatchStop(RemoteUserInfo caller) {
         postToCallback(caller, CallbackMessageHandler.MSG_STOP, null, null);
     }
 
-    private void dispatchNext(RemoteUserInfo caller) {
+    void dispatchNext(RemoteUserInfo caller) {
         postToCallback(caller, CallbackMessageHandler.MSG_NEXT, null, null);
     }
 
-    private void dispatchPrevious(RemoteUserInfo caller) {
+    void dispatchPrevious(RemoteUserInfo caller) {
         postToCallback(caller, CallbackMessageHandler.MSG_PREVIOUS, null, null);
     }
 
-    private void dispatchFastForward(RemoteUserInfo caller) {
+    void dispatchFastForward(RemoteUserInfo caller) {
         postToCallback(caller, CallbackMessageHandler.MSG_FAST_FORWARD, null, null);
     }
 
-    private void dispatchRewind(RemoteUserInfo caller) {
+    void dispatchRewind(RemoteUserInfo caller) {
         postToCallback(caller, CallbackMessageHandler.MSG_REWIND, null, null);
     }
 
-    private void dispatchSeekTo(RemoteUserInfo caller, long pos) {
+    void dispatchSeekTo(RemoteUserInfo caller, long pos) {
         postToCallback(caller, CallbackMessageHandler.MSG_SEEK_TO, pos, null);
     }
 
-    private void dispatchRate(RemoteUserInfo caller, Rating rating) {
+    void dispatchRate(RemoteUserInfo caller, Rating rating) {
         postToCallback(caller, CallbackMessageHandler.MSG_RATE, rating, null);
     }
 
-    private void dispatchCustomAction(RemoteUserInfo caller, String action, Bundle args) {
+    void dispatchCustomAction(RemoteUserInfo caller, String action, Bundle args) {
         postToCallback(caller, CallbackMessageHandler.MSG_CUSTOM_ACTION, action, args);
     }
 
-    private void dispatchMediaButton(RemoteUserInfo caller, Intent mediaButtonIntent) {
+    void dispatchMediaButton(RemoteUserInfo caller, Intent mediaButtonIntent) {
         postToCallback(caller, CallbackMessageHandler.MSG_MEDIA_BUTTON, mediaButtonIntent, null);
     }
 
-    private void dispatchMediaButtonDelayed(RemoteUserInfo info, Intent mediaButtonIntent,
+    void dispatchMediaButtonDelayed(RemoteUserInfo info, Intent mediaButtonIntent,
             long delay) {
         postToCallbackDelayed(info, CallbackMessageHandler.MSG_PLAY_PAUSE_KEY_DOUBLE_TAP_TIMEOUT,
                 mediaButtonIntent, null, delay);
     }
 
-    private void dispatchAdjustVolume(RemoteUserInfo caller, int direction) {
+    void dispatchAdjustVolume(RemoteUserInfo caller, int direction) {
         postToCallback(caller, CallbackMessageHandler.MSG_ADJUST_VOLUME, direction, null);
     }
 
-    private void dispatchSetVolumeTo(RemoteUserInfo caller, int volume) {
+    void dispatchSetVolumeTo(RemoteUserInfo caller, int volume) {
         postToCallback(caller, CallbackMessageHandler.MSG_SET_VOLUME, volume, null);
     }
 
-    private void dispatchCommand(RemoteUserInfo caller, String command, Bundle args,
+    void dispatchCommand(RemoteUserInfo caller, String command, Bundle args,
             ResultReceiver resultCb) {
         Command cmd = new Command(command, args, resultCb);
         postToCallback(caller, CallbackMessageHandler.MSG_COMMAND, cmd, null);
@@ -982,259 +970,7 @@
         }
     }
 
-    /**
-     * @hide
-     */
-    @SystemApi
-    public static final class CallbackStub extends SessionCallbackLink.CallbackStub {
-        private WeakReference<MediaSessionEngine> mSessionImpl;
-
-        private static RemoteUserInfo createRemoteUserInfo(String packageName, int pid, int uid) {
-            return new RemoteUserInfo(packageName, pid, uid);
-        }
-
-        public CallbackStub() {
-        }
-
-        @Override
-        public void onCommand(String packageName, int pid, int uid,
-                ControllerCallbackLink caller, String command, Bundle args, ResultReceiver cb) {
-            MediaSessionEngine sessionImpl = mSessionImpl.get();
-            if (sessionImpl != null) {
-                sessionImpl.dispatchCommand(createRemoteUserInfo(packageName, pid, uid),
-                        command, args, cb);
-            }
-        }
-
-        @Override
-        public void onMediaButton(String packageName, int pid, int uid, Intent mediaButtonIntent,
-                int sequenceNumber, ResultReceiver cb) {
-            MediaSessionEngine sessionImpl = mSessionImpl.get();
-            try {
-                if (sessionImpl != null) {
-                    sessionImpl.dispatchMediaButton(
-                            createRemoteUserInfo(packageName, pid, uid), mediaButtonIntent);
-                }
-            } finally {
-                if (cb != null) {
-                    cb.send(sequenceNumber, null);
-                }
-            }
-        }
-
-        @Override
-        public void onMediaButtonFromController(String packageName, int pid, int uid,
-                ControllerCallbackLink caller, Intent mediaButtonIntent) {
-            MediaSessionEngine sessionImpl = mSessionImpl.get();
-            if (sessionImpl != null) {
-                sessionImpl.dispatchMediaButton(createRemoteUserInfo(packageName, pid, uid),
-                        mediaButtonIntent);
-            }
-        }
-
-        @Override
-        public void onPrepare(String packageName, int pid, int uid,
-                ControllerCallbackLink caller) {
-            MediaSessionEngine sessionImpl = mSessionImpl.get();
-            if (sessionImpl != null) {
-                sessionImpl.dispatchPrepare(createRemoteUserInfo(packageName, pid, uid));
-            }
-        }
-
-        @Override
-        public void onPrepareFromMediaId(String packageName, int pid, int uid,
-                ControllerCallbackLink caller, String mediaId,
-                Bundle extras) {
-            MediaSessionEngine sessionImpl = mSessionImpl.get();
-            if (sessionImpl != null) {
-                sessionImpl.dispatchPrepareFromMediaId(
-                        createRemoteUserInfo(packageName, pid, uid), mediaId, extras);
-            }
-        }
-
-        @Override
-        public void onPrepareFromSearch(String packageName, int pid, int uid,
-                ControllerCallbackLink caller, String query,
-                Bundle extras) {
-            MediaSessionEngine sessionImpl = mSessionImpl.get();
-            if (sessionImpl != null) {
-                sessionImpl.dispatchPrepareFromSearch(
-                        createRemoteUserInfo(packageName, pid, uid), query, extras);
-            }
-        }
-
-        @Override
-        public void onPrepareFromUri(String packageName, int pid, int uid,
-                ControllerCallbackLink caller, Uri uri, Bundle extras) {
-            MediaSessionEngine sessionImpl = mSessionImpl.get();
-            if (sessionImpl != null) {
-                sessionImpl.dispatchPrepareFromUri(
-                        createRemoteUserInfo(packageName, pid, uid), uri, extras);
-            }
-        }
-
-        @Override
-        public void onPlay(String packageName, int pid, int uid,
-                ControllerCallbackLink caller) {
-            MediaSessionEngine sessionImpl = mSessionImpl.get();
-            if (sessionImpl != null) {
-                sessionImpl.dispatchPlay(createRemoteUserInfo(packageName, pid, uid));
-            }
-        }
-
-        @Override
-        public void onPlayFromMediaId(String packageName, int pid, int uid,
-                ControllerCallbackLink caller, String mediaId,
-                Bundle extras) {
-            MediaSessionEngine sessionImpl = mSessionImpl.get();
-            if (sessionImpl != null) {
-                sessionImpl.dispatchPlayFromMediaId(
-                        createRemoteUserInfo(packageName, pid, uid), mediaId, extras);
-            }
-        }
-
-        @Override
-        public void onPlayFromSearch(String packageName, int pid, int uid,
-                ControllerCallbackLink caller, String query,
-                Bundle extras) {
-            MediaSessionEngine sessionImpl = mSessionImpl.get();
-            if (sessionImpl != null) {
-                sessionImpl.dispatchPlayFromSearch(
-                        createRemoteUserInfo(packageName, pid, uid), query, extras);
-            }
-        }
-
-        @Override
-        public void onPlayFromUri(String packageName, int pid, int uid,
-                ControllerCallbackLink caller, Uri uri, Bundle extras) {
-            MediaSessionEngine sessionImpl = mSessionImpl.get();
-            if (sessionImpl != null) {
-                sessionImpl.dispatchPlayFromUri(
-                        createRemoteUserInfo(packageName, pid, uid), uri, extras);
-            }
-        }
-
-        @Override
-        public void onSkipToTrack(String packageName, int pid, int uid,
-                ControllerCallbackLink caller, long id) {
-            MediaSessionEngine sessionImpl = mSessionImpl.get();
-            if (sessionImpl != null) {
-                sessionImpl.dispatchSkipToItem(
-                        createRemoteUserInfo(packageName, pid, uid), id);
-            }
-        }
-
-        @Override
-        public void onPause(String packageName, int pid, int uid,
-                ControllerCallbackLink caller) {
-            MediaSessionEngine sessionImpl = mSessionImpl.get();
-            if (sessionImpl != null) {
-                sessionImpl.dispatchPause(createRemoteUserInfo(packageName, pid, uid));
-            }
-        }
-
-        @Override
-        public void onStop(String packageName, int pid, int uid,
-                ControllerCallbackLink caller) {
-            MediaSessionEngine sessionImpl = mSessionImpl.get();
-            if (sessionImpl != null) {
-                sessionImpl.dispatchStop(createRemoteUserInfo(packageName, pid, uid));
-            }
-        }
-
-        @Override
-        public void onNext(String packageName, int pid, int uid,
-                ControllerCallbackLink caller) {
-            MediaSessionEngine sessionImpl = mSessionImpl.get();
-            if (sessionImpl != null) {
-                sessionImpl.dispatchNext(createRemoteUserInfo(packageName, pid, uid));
-            }
-        }
-
-        @Override
-        public void onPrevious(String packageName, int pid, int uid,
-                ControllerCallbackLink caller) {
-            MediaSessionEngine sessionImpl = mSessionImpl.get();
-            if (sessionImpl != null) {
-                sessionImpl.dispatchPrevious(createRemoteUserInfo(packageName, pid, uid));
-            }
-        }
-
-        @Override
-        public void onFastForward(String packageName, int pid, int uid,
-                ControllerCallbackLink caller) {
-            MediaSessionEngine sessionImpl = mSessionImpl.get();
-            if (sessionImpl != null) {
-                sessionImpl.dispatchFastForward(
-                        createRemoteUserInfo(packageName, pid, uid));
-            }
-        }
-
-        @Override
-        public void onRewind(String packageName, int pid, int uid,
-                ControllerCallbackLink caller) {
-            MediaSessionEngine sessionImpl = mSessionImpl.get();
-            if (sessionImpl != null) {
-                sessionImpl.dispatchRewind(createRemoteUserInfo(packageName, pid, uid));
-            }
-        }
-
-        @Override
-        public void onSeekTo(String packageName, int pid, int uid,
-                ControllerCallbackLink caller, long pos) {
-            MediaSessionEngine sessionImpl = mSessionImpl.get();
-            if (sessionImpl != null) {
-                sessionImpl.dispatchSeekTo(
-                        createRemoteUserInfo(packageName, pid, uid), pos);
-            }
-        }
-
-        @Override
-        public void onRate(String packageName, int pid, int uid, ControllerCallbackLink caller,
-                Rating rating) {
-            MediaSessionEngine sessionImpl = mSessionImpl.get();
-            if (sessionImpl != null) {
-                sessionImpl.dispatchRate(
-                        createRemoteUserInfo(packageName, pid, uid), rating);
-            }
-        }
-
-        @Override
-        public void onCustomAction(String packageName, int pid, int uid,
-                ControllerCallbackLink caller, String action, Bundle args) {
-            MediaSessionEngine sessionImpl = mSessionImpl.get();
-            if (sessionImpl != null) {
-                sessionImpl.dispatchCustomAction(
-                        createRemoteUserInfo(packageName, pid, uid), action, args);
-            }
-        }
-
-        @Override
-        public void onAdjustVolume(String packageName, int pid, int uid,
-                ControllerCallbackLink caller, int direction) {
-            MediaSessionEngine sessionImpl = mSessionImpl.get();
-            if (sessionImpl != null) {
-                sessionImpl.dispatchAdjustVolume(
-                        createRemoteUserInfo(packageName, pid, uid), direction);
-            }
-        }
-
-        @Override
-        public void onSetVolumeTo(String packageName, int pid, int uid,
-                ControllerCallbackLink caller, int value) {
-            MediaSessionEngine sessionImpl = mSessionImpl.get();
-            if (sessionImpl != null) {
-                sessionImpl.dispatchSetVolumeTo(
-                        createRemoteUserInfo(packageName, pid, uid), value);
-            }
-        }
-
-        void setSessionImpl(MediaSessionEngine sessionImpl) {
-            mSessionImpl = new WeakReference<>(sessionImpl);
-        }
-    }
-
-    /**
+     /**
      * A single item that is part of the play queue. It contains a description
      * of the item and its id in the queue.
      */
diff --git a/media/java/android/media/session/MediaSessionManager.java b/media/java/android/media/session/MediaSessionManager.java
index cae4d17..46f6c71 100644
--- a/media/java/android/media/session/MediaSessionManager.java
+++ b/media/java/android/media/session/MediaSessionManager.java
@@ -26,6 +26,7 @@
 import android.content.Context;
 import android.media.AudioManager;
 import android.media.IRemoteVolumeController;
+import android.media.MediaSession2;
 import android.media.Session2Token;
 import android.os.Handler;
 import android.os.IBinder;
@@ -114,11 +115,11 @@
     }
 
     /**
-     * Notifies that a new MediaSession2 with type {@link Session2Token#TYPE_SESSION} is
+     * Notifies that a new {@link MediaSession2} with type {@link Session2Token#TYPE_SESSION} is
      * created.
      * <p>
      * Do not use this API directly, but create a new instance through the
-     * MediaSession2.Builder instead.
+     * {@link MediaSession2.Builder} instead.
      *
      * @param token newly created session2 token
      */
@@ -129,9 +130,6 @@
         if (token.getType() != Session2Token.TYPE_SESSION) {
             throw new IllegalArgumentException("token's type should be TYPE_SESSION");
         }
-        if (token.isDestroyed()) {
-            throw new IllegalArgumentException("token is already destroyed");
-        }
         try {
             mService.notifySession2Created(token);
         } catch (RemoteException e) {
@@ -140,31 +138,6 @@
     }
 
     /**
-     * Notifies that a new MediaSession2 with type {@link Session2Token#TYPE_SESSION} is
-     * destroyed.
-     * <p>
-     * Do not use this API directly, but close a session with MediaSession2#close() instead.
-     *
-     * @param token destroyed session2 token
-     */
-    public void notifySession2Destroyed(@NonNull Session2Token token) {
-        if (token == null) {
-            throw new IllegalArgumentException("token shouldn't be null");
-        }
-        if (token.getType() != Session2Token.TYPE_SESSION) {
-            throw new IllegalArgumentException("token's type should be TYPE_SESSION");
-        }
-        if (!token.isDestroyed()) {
-            throw new IllegalArgumentException("token should have been destroyed");
-        }
-        try {
-            mService.notifySession2Destroyed(token);
-        } catch (RemoteException e) {
-            e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
      * Get a list of controllers for all ongoing sessions. The controllers will
      * be provided in priority order with the most important controller at index
      * 0.
@@ -202,10 +175,10 @@
             @Nullable ComponentName notificationListener, int userId) {
         ArrayList<MediaController> controllers = new ArrayList<MediaController>();
         try {
-            List<ControllerLink> binders = mService.getSessions(notificationListener, userId);
-            int size = binders.size();
+            List<MediaSession.Token> tokens = mService.getSessions(notificationListener, userId);
+            int size = tokens.size();
             for (int i = 0; i < size; i++) {
-                MediaController controller = new MediaController(mContext, binders.get(i));
+                MediaController controller = new MediaController(mContext, tokens.get(i));
                 controllers.add(controller);
             }
         } catch (RemoteException e) {
@@ -219,7 +192,7 @@
      * current user.
      * <p>
      * Although this API can be used without any restriction, each session owners can accept or
-     * reject your uses of MediaSession2.
+     * reject your uses of {@link MediaSession2}.
      *
      * @return A list of {@link Session2Token}.
      */
@@ -508,6 +481,37 @@
     }
 
     /**
+     * Dispatches the media button event as system service to the session.
+     * <p>
+     * Should be only called by the {@link com.android.internal.policy.PhoneWindow} when the
+     * foreground activity didn't consume the key from the hardware devices.
+     *
+     * @param sessionToken session token
+     * @param keyEvent media key event
+     * @return {@code true} if the event was sent to the session, {@code false} otherwise
+     * @hide
+     */
+    public boolean dispatchMediaKeyEventAsSystemService(@NonNull MediaSession.Token sessionToken,
+            @NonNull KeyEvent keyEvent) {
+        if (sessionToken == null) {
+            throw new IllegalArgumentException("sessionToken shouldn't be null");
+        }
+        if (keyEvent == null) {
+            throw new IllegalArgumentException("keyEvent shouldn't be null");
+        }
+        if (!KeyEvent.isMediaSessionKey(keyEvent.getKeyCode())) {
+            return false;
+        }
+        try {
+            return mService.dispatchMediaKeyEventToSessionAsSystemService(mContext.getPackageName(),
+                    sessionToken, keyEvent);
+        } catch (RemoteException e) {
+            Log.e(TAG, "Failed to send key event.", e);
+        }
+        return false;
+    }
+
+    /**
      * Send a volume key event. The receiver will be selected automatically.
      *
      * @param keyEvent The volume KeyEvent to send.
@@ -544,6 +548,32 @@
     }
 
     /**
+     * Dispatches the volume key event as system service to the session.
+     * <p>
+     * Should be only called by the {@link com.android.internal.policy.PhoneWindow} when the
+     * foreground activity didn't consume the key from the hardware devices.
+     *
+     * @param sessionToken sessionToken
+     * @param keyEvent volume key event
+     * @hide
+     */
+    public void dispatchVolumeKeyEventAsSystemService(@NonNull MediaSession.Token sessionToken,
+            @NonNull KeyEvent keyEvent) {
+        if (sessionToken == null) {
+            throw new IllegalArgumentException("sessionToken shouldn't be null");
+        }
+        if (keyEvent == null) {
+            throw new IllegalArgumentException("keyEvent shouldn't be null");
+        }
+        try {
+            mService.dispatchVolumeKeyEventToSessionAsSystemService(mContext.getPackageName(),
+                    mContext.getOpPackageName(), sessionToken, keyEvent);
+        } catch (RemoteException e) {
+            Log.wtf(TAG, "Error calling dispatchVolumeKeyEventAsSystemService", e);
+        }
+    }
+
+    /**
      * Dispatch an adjust volume request to the system. It will be sent to the
      * most relevant audio stream or media session. The direction must be one of
      * {@link AudioManager#ADJUST_LOWER}, {@link AudioManager#ADJUST_RAISE},
diff --git a/media/apex/java/android/media/session/MediaSessionProviderService.java b/media/java/android/media/session/MediaSessionProviderService.java
similarity index 100%
rename from media/apex/java/android/media/session/MediaSessionProviderService.java
rename to media/java/android/media/session/MediaSessionProviderService.java
diff --git a/media/apex/java/android/media/session/PlaybackState.aidl b/media/java/android/media/session/PlaybackState.aidl
similarity index 100%
rename from media/apex/java/android/media/session/PlaybackState.aidl
rename to media/java/android/media/session/PlaybackState.aidl
diff --git a/media/apex/java/android/media/session/PlaybackState.java b/media/java/android/media/session/PlaybackState.java
similarity index 100%
rename from media/apex/java/android/media/session/PlaybackState.java
rename to media/java/android/media/session/PlaybackState.java
diff --git a/media/apex/java/android/media/session/SessionCallbackLink.aidl b/media/java/android/media/session/SessionCallbackLink.aidl
similarity index 100%
rename from media/apex/java/android/media/session/SessionCallbackLink.aidl
rename to media/java/android/media/session/SessionCallbackLink.aidl
diff --git a/media/apex/java/android/media/session/SessionCallbackLink.java b/media/java/android/media/session/SessionCallbackLink.java
similarity index 79%
rename from media/apex/java/android/media/session/SessionCallbackLink.java
rename to media/java/android/media/session/SessionCallbackLink.java
index 3bcb65c..f59a69d 100644
--- a/media/apex/java/android/media/session/SessionCallbackLink.java
+++ b/media/java/android/media/session/SessionCallbackLink.java
@@ -20,11 +20,11 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.RequiresPermission;
-import android.annotation.SystemApi;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.media.Rating;
+import android.media.session.MediaSessionManager.RemoteUserInfo;
 import android.net.Uri;
 import android.os.Binder;
 import android.os.Bundle;
@@ -35,23 +35,23 @@
 import android.os.RemoteException;
 import android.os.ResultReceiver;
 
+import java.lang.ref.WeakReference;
+
 /**
  * Handles incoming commands to {@link MediaSession.Callback}.
  * @hide
  */
-@SystemApi
 public final class SessionCallbackLink implements Parcelable {
     final Context mContext;
-    final CallbackStub mCallbackStub;
     final ISessionCallback mISessionCallback;
 
     /**
      * Constructor for stub (Callee)
+     * @hide
      */
-    SessionCallbackLink(@NonNull Context context, @NonNull CallbackStub callbackStub) {
+    public SessionCallbackLink(@NonNull Context context) {
         mContext = context;
-        mCallbackStub = callbackStub;
-        mISessionCallback = new CallbackStubProxy();
+        mISessionCallback = new CallbackStub();
     }
 
     /**
@@ -59,11 +59,19 @@
      */
     public SessionCallbackLink(IBinder binder) {
         mContext = null;
-        mCallbackStub = null;
         mISessionCallback = ISessionCallback.Stub.asInterface(binder);
     }
 
     /**
+     * Set {@link MediaSessionEngine} which will be used by {@link CallbackStub}.
+     */
+    void setSessionEngine(@Nullable MediaSessionEngine sessionImpl) {
+        if (mISessionCallback instanceof CallbackStub) {
+            ((CallbackStub) mISessionCallback).mSessionImpl = new WeakReference<>(sessionImpl);
+        }
+    }
+
+    /**
      * Notify session that a controller sends a command.
      *
      * @param packageName the package name of the controller
@@ -540,139 +548,24 @@
                 }
             };
 
-    /**
-     * Class for Stub implementation
-     */
-    abstract static class CallbackStub {
-        /** Stub method for ISessionCallback.notifyCommand */
-        public void onCommand(@NonNull String packageName, int pid, int uid,
-                @NonNull ControllerCallbackLink caller, @NonNull String command,
-                @Nullable Bundle args, @Nullable ResultReceiver cb) {
+    private class CallbackStub extends ISessionCallback.Stub {
+        private WeakReference<MediaSessionEngine> mSessionImpl;
+
+        private RemoteUserInfo createRemoteUserInfo(String packageName, int pid, int uid) {
+            return new RemoteUserInfo(packageName, pid, uid);
         }
 
-        /** Stub method for ISessionCallback.notifyMediaButton */
-        public void onMediaButton(@NonNull String packageName, int pid, int uid,
-                @NonNull Intent mediaButtonIntent, int sequenceNumber,
-                @Nullable ResultReceiver cb) {
-        }
-
-        /** Stub method for ISessionCallback.notifyMediaButtonFromController */
-        public void onMediaButtonFromController(@NonNull String packageName, int pid, int uid,
-                @NonNull ControllerCallbackLink caller, @NonNull Intent mediaButtonIntent) {
-        }
-
-        /** Stub method for ISessionCallback.notifyPrepare */
-        public void onPrepare(@NonNull String packageName, int pid, int uid,
-                @NonNull ControllerCallbackLink caller) {
-        }
-
-        /** Stub method for ISessionCallback.notifyPrepareFromMediaId */
-        public void onPrepareFromMediaId(@NonNull String packageName, int pid, int uid,
-                @NonNull ControllerCallbackLink caller, @NonNull String mediaId,
-                @Nullable Bundle extras) {
-        }
-
-        /** Stub method for ISessionCallback.notifyPrepareFromSearch */
-        public void onPrepareFromSearch(@NonNull String packageName, int pid, int uid,
-                @NonNull ControllerCallbackLink caller, String query, @Nullable Bundle extras) {
-        }
-
-        /** Stub method for ISessionCallback.notifyPrepareFromUri */
-        public void onPrepareFromUri(@NonNull String packageName, int pid, int uid,
-                @NonNull ControllerCallbackLink caller, @NonNull Uri uri, @Nullable Bundle extras) {
-        }
-
-        /** Stub method for ISessionCallback.notifyPlay */
-        public void onPlay(@NonNull String packageName, int pid, int uid,
-                @NonNull ControllerCallbackLink caller) {
-        }
-
-        /** Stub method for ISessionCallback.notifyPlayFromMediaId */
-        public void onPlayFromMediaId(@NonNull String packageName, int pid, int uid,
-                @NonNull ControllerCallbackLink caller, @NonNull String mediaId,
-                @Nullable Bundle extras) {
-        }
-
-        /** Stub method for ISessionCallback.notifyPlayFromSearch */
-        public void onPlayFromSearch(@NonNull String packageName, int pid, int uid,
-                @NonNull ControllerCallbackLink caller, String query, @Nullable Bundle extras) {
-        }
-
-        /** Stub method for ISessionCallback.notifyPlayFromUri */
-        public void onPlayFromUri(@NonNull String packageName, int pid, int uid,
-                @NonNull ControllerCallbackLink caller, @NonNull Uri uri, @Nullable Bundle extras) {
-        }
-
-        /** Stub method for ISessionCallback.notifySkipToTrack */
-        public void onSkipToTrack(@NonNull String packageName, int pid, int uid,
-                @NonNull ControllerCallbackLink caller, long id) {
-        }
-
-        /** Stub method for ISessionCallback.notifyPause */
-        public void onPause(@NonNull String packageName, int pid, int uid,
-                @NonNull ControllerCallbackLink caller) {
-        }
-
-        /** Stub method for ISessionCallback.notifyStop */
-        public void onStop(@NonNull String packageName, int pid, int uid,
-                @NonNull ControllerCallbackLink caller) {
-        }
-
-        /** Stub method for ISessionCallback.notifyNext */
-        public void onNext(@NonNull String packageName, int pid, int uid,
-                @NonNull ControllerCallbackLink caller) {
-        }
-
-        /** Stub method for ISessionCallback.notifyPrevious */
-        public void onPrevious(@NonNull String packageName, int pid, int uid,
-                @NonNull ControllerCallbackLink caller) {
-        }
-
-        /** Stub method for ISessionCallback.notifyFastForward */
-        public void onFastForward(@NonNull String packageName, int pid, int uid,
-                @NonNull ControllerCallbackLink caller) {
-        }
-
-        /** Stub method for ISessionCallback.notifyRewind */
-        public void onRewind(@NonNull String packageName, int pid, int uid,
-                @NonNull ControllerCallbackLink caller) {
-        }
-
-        /** Stub method for ISessionCallback.notifySeekTo */
-        public void onSeekTo(@NonNull String packageName, int pid, int uid,
-                @NonNull ControllerCallbackLink caller, long pos) {
-        }
-
-        /** Stub method for ISessionCallback.notifyRate */
-        public void onRate(@NonNull String packageName, int pid, int uid,
-                @NonNull ControllerCallbackLink caller, @NonNull Rating rating) {
-        }
-
-        /** Stub method for ISessionCallback.notifyCustomAction */
-        public void onCustomAction(@NonNull String packageName, int pid, int uid,
-                @NonNull ControllerCallbackLink caller, @NonNull String action,
-                @Nullable Bundle args) {
-        }
-
-        /** Stub method for ISessionCallback.notifyAdjustVolume */
-        public void onAdjustVolume(@NonNull String packageName, int pid, int uid,
-                @NonNull ControllerCallbackLink caller, int direction) {
-        }
-
-        /** Stub method for ISessionCallback.notifySetVolumeTo */
-        public void onSetVolumeTo(@NonNull String packageName, int pid, int uid,
-                @NonNull ControllerCallbackLink caller, int value) {
-        }
-    }
-
-    private class CallbackStubProxy extends ISessionCallback.Stub {
         @Override
         public void notifyCommand(String packageName, int pid, int uid,
                 ControllerCallbackLink caller, String command, Bundle args, ResultReceiver cb) {
             ensureMediaControlPermission();
             final long token = Binder.clearCallingIdentity();
             try {
-                mCallbackStub.onCommand(packageName, pid, uid, caller, command, args, cb);
+                MediaSessionEngine sessionImpl = mSessionImpl.get();
+                if (sessionImpl != null) {
+                    sessionImpl.dispatchCommand(createRemoteUserInfo(packageName, pid, uid),
+                            command, args, cb);
+                }
             } finally {
                 Binder.restoreCallingIdentity(token);
             }
@@ -684,9 +577,15 @@
             ensureMediaControlPermission();
             final long token = Binder.clearCallingIdentity();
             try {
-                mCallbackStub.onMediaButton(packageName, pid, uid, mediaButtonIntent,
-                        sequenceNumber, cb);
+                MediaSessionEngine sessionImpl = mSessionImpl.get();
+                if (sessionImpl != null) {
+                    sessionImpl.dispatchMediaButton(
+                            createRemoteUserInfo(packageName, pid, uid), mediaButtonIntent);
+                }
             } finally {
+                if (cb != null) {
+                    cb.send(sequenceNumber, null);
+                }
                 Binder.restoreCallingIdentity(token);
             }
         }
@@ -697,8 +596,11 @@
             ensureMediaControlPermission();
             final long token = Binder.clearCallingIdentity();
             try {
-                mCallbackStub.onMediaButtonFromController(packageName, pid, uid, caller,
-                        mediaButtonIntent);
+                MediaSessionEngine sessionImpl = mSessionImpl.get();
+                if (sessionImpl != null) {
+                    sessionImpl.dispatchMediaButton(createRemoteUserInfo(packageName, pid, uid),
+                            mediaButtonIntent);
+                }
             } finally {
                 Binder.restoreCallingIdentity(token);
             }
@@ -710,7 +612,10 @@
             ensureMediaControlPermission();
             final long token = Binder.clearCallingIdentity();
             try {
-                mCallbackStub.onPrepare(packageName, pid, uid, caller);
+                MediaSessionEngine sessionImpl = mSessionImpl.get();
+                if (sessionImpl != null) {
+                    sessionImpl.dispatchPrepare(createRemoteUserInfo(packageName, pid, uid));
+                }
             } finally {
                 Binder.restoreCallingIdentity(token);
             }
@@ -722,7 +627,11 @@
             ensureMediaControlPermission();
             final long token = Binder.clearCallingIdentity();
             try {
-                mCallbackStub.onPrepareFromMediaId(packageName, pid, uid, caller, mediaId, extras);
+                MediaSessionEngine sessionImpl = mSessionImpl.get();
+                if (sessionImpl != null) {
+                    sessionImpl.dispatchPrepareFromMediaId(
+                            createRemoteUserInfo(packageName, pid, uid), mediaId, extras);
+                }
             } finally {
                 Binder.restoreCallingIdentity(token);
             }
@@ -734,7 +643,11 @@
             ensureMediaControlPermission();
             final long token = Binder.clearCallingIdentity();
             try {
-                mCallbackStub.onPrepareFromSearch(packageName, pid, uid, caller, query, extras);
+                MediaSessionEngine sessionImpl = mSessionImpl.get();
+                if (sessionImpl != null) {
+                    sessionImpl.dispatchPrepareFromSearch(
+                            createRemoteUserInfo(packageName, pid, uid), query, extras);
+                }
             } finally {
                 Binder.restoreCallingIdentity(token);
             }
@@ -746,7 +659,11 @@
             ensureMediaControlPermission();
             final long token = Binder.clearCallingIdentity();
             try {
-                mCallbackStub.onPrepareFromUri(packageName, pid, uid, caller, uri, extras);
+                MediaSessionEngine sessionImpl = mSessionImpl.get();
+                if (sessionImpl != null) {
+                    sessionImpl.dispatchPrepareFromUri(
+                            createRemoteUserInfo(packageName, pid, uid), uri, extras);
+                }
             } finally {
                 Binder.restoreCallingIdentity(token);
             }
@@ -758,7 +675,10 @@
             ensureMediaControlPermission();
             final long token = Binder.clearCallingIdentity();
             try {
-                mCallbackStub.onPlay(packageName, pid, uid, caller);
+                MediaSessionEngine sessionImpl = mSessionImpl.get();
+                if (sessionImpl != null) {
+                    sessionImpl.dispatchPlay(createRemoteUserInfo(packageName, pid, uid));
+                }
             } finally {
                 Binder.restoreCallingIdentity(token);
             }
@@ -770,7 +690,11 @@
             ensureMediaControlPermission();
             final long token = Binder.clearCallingIdentity();
             try {
-                mCallbackStub.onPlayFromMediaId(packageName, pid, uid, caller, mediaId, extras);
+                MediaSessionEngine sessionImpl = mSessionImpl.get();
+                if (sessionImpl != null) {
+                    sessionImpl.dispatchPlayFromMediaId(
+                            createRemoteUserInfo(packageName, pid, uid), mediaId, extras);
+                }
             } finally {
                 Binder.restoreCallingIdentity(token);
             }
@@ -782,7 +706,11 @@
             ensureMediaControlPermission();
             final long token = Binder.clearCallingIdentity();
             try {
-                mCallbackStub.onPlayFromSearch(packageName, pid, uid, caller, query, extras);
+                MediaSessionEngine sessionImpl = mSessionImpl.get();
+                if (sessionImpl != null) {
+                    sessionImpl.dispatchPlayFromSearch(
+                            createRemoteUserInfo(packageName, pid, uid), query, extras);
+                }
             } finally {
                 Binder.restoreCallingIdentity(token);
             }
@@ -794,7 +722,11 @@
             ensureMediaControlPermission();
             final long token = Binder.clearCallingIdentity();
             try {
-                mCallbackStub.onPlayFromUri(packageName, pid, uid, caller, uri, extras);
+                MediaSessionEngine sessionImpl = mSessionImpl.get();
+                if (sessionImpl != null) {
+                    sessionImpl.dispatchPlayFromUri(
+                            createRemoteUserInfo(packageName, pid, uid), uri, extras);
+                }
             } finally {
                 Binder.restoreCallingIdentity(token);
             }
@@ -806,7 +738,11 @@
             ensureMediaControlPermission();
             final long token = Binder.clearCallingIdentity();
             try {
-                mCallbackStub.onSkipToTrack(packageName, pid, uid, caller, id);
+                MediaSessionEngine sessionImpl = mSessionImpl.get();
+                if (sessionImpl != null) {
+                    sessionImpl.dispatchSkipToItem(
+                            createRemoteUserInfo(packageName, pid, uid), id);
+                }
             } finally {
                 Binder.restoreCallingIdentity(token);
             }
@@ -818,7 +754,10 @@
             ensureMediaControlPermission();
             final long token = Binder.clearCallingIdentity();
             try {
-                mCallbackStub.onPause(packageName, pid, uid, caller);
+                MediaSessionEngine sessionImpl = mSessionImpl.get();
+                if (sessionImpl != null) {
+                    sessionImpl.dispatchPause(createRemoteUserInfo(packageName, pid, uid));
+                }
             } finally {
                 Binder.restoreCallingIdentity(token);
             }
@@ -830,7 +769,10 @@
             ensureMediaControlPermission();
             final long token = Binder.clearCallingIdentity();
             try {
-                mCallbackStub.onStop(packageName, pid, uid, caller);
+                MediaSessionEngine sessionImpl = mSessionImpl.get();
+                if (sessionImpl != null) {
+                    sessionImpl.dispatchStop(createRemoteUserInfo(packageName, pid, uid));
+                }
             } finally {
                 Binder.restoreCallingIdentity(token);
             }
@@ -842,7 +784,10 @@
             ensureMediaControlPermission();
             final long token = Binder.clearCallingIdentity();
             try {
-                mCallbackStub.onNext(packageName, pid, uid, caller);
+                MediaSessionEngine sessionImpl = mSessionImpl.get();
+                if (sessionImpl != null) {
+                    sessionImpl.dispatchNext(createRemoteUserInfo(packageName, pid, uid));
+                }
             } finally {
                 Binder.restoreCallingIdentity(token);
             }
@@ -854,7 +799,10 @@
             ensureMediaControlPermission();
             final long token = Binder.clearCallingIdentity();
             try {
-                mCallbackStub.onPrevious(packageName, pid, uid, caller);
+                MediaSessionEngine sessionImpl = mSessionImpl.get();
+                if (sessionImpl != null) {
+                    sessionImpl.dispatchPrevious(createRemoteUserInfo(packageName, pid, uid));
+                }
             } finally {
                 Binder.restoreCallingIdentity(token);
             }
@@ -866,7 +814,11 @@
             ensureMediaControlPermission();
             final long token = Binder.clearCallingIdentity();
             try {
-                mCallbackStub.onFastForward(packageName, pid, uid, caller);
+                MediaSessionEngine sessionImpl = mSessionImpl.get();
+                if (sessionImpl != null) {
+                    sessionImpl.dispatchFastForward(
+                            createRemoteUserInfo(packageName, pid, uid));
+                }
             } finally {
                 Binder.restoreCallingIdentity(token);
             }
@@ -878,7 +830,10 @@
             ensureMediaControlPermission();
             final long token = Binder.clearCallingIdentity();
             try {
-                mCallbackStub.onRewind(packageName, pid, uid, caller);
+                MediaSessionEngine sessionImpl = mSessionImpl.get();
+                if (sessionImpl != null) {
+                    sessionImpl.dispatchRewind(createRemoteUserInfo(packageName, pid, uid));
+                }
             } finally {
                 Binder.restoreCallingIdentity(token);
             }
@@ -890,7 +845,11 @@
             ensureMediaControlPermission();
             final long token = Binder.clearCallingIdentity();
             try {
-                mCallbackStub.onSeekTo(packageName, pid, uid, caller, pos);
+                MediaSessionEngine sessionImpl = mSessionImpl.get();
+                if (sessionImpl != null) {
+                    sessionImpl.dispatchSeekTo(
+                            createRemoteUserInfo(packageName, pid, uid), pos);
+                }
             } finally {
                 Binder.restoreCallingIdentity(token);
             }
@@ -902,7 +861,11 @@
             ensureMediaControlPermission();
             final long token = Binder.clearCallingIdentity();
             try {
-                mCallbackStub.onRate(packageName, pid, uid, caller, rating);
+                MediaSessionEngine sessionImpl = mSessionImpl.get();
+                if (sessionImpl != null) {
+                    sessionImpl.dispatchRate(
+                            createRemoteUserInfo(packageName, pid, uid), rating);
+                }
             } finally {
                 Binder.restoreCallingIdentity(token);
             }
@@ -913,7 +876,11 @@
             ensureMediaControlPermission();
             final long token = Binder.clearCallingIdentity();
             try {
-                mCallbackStub.onCustomAction(packageName, pid, uid, caller, action, args);
+                MediaSessionEngine sessionImpl = mSessionImpl.get();
+                if (sessionImpl != null) {
+                    sessionImpl.dispatchCustomAction(
+                            createRemoteUserInfo(packageName, pid, uid), action, args);
+                }
             } finally {
                 Binder.restoreCallingIdentity(token);
             }
@@ -925,7 +892,11 @@
             ensureMediaControlPermission();
             final long token = Binder.clearCallingIdentity();
             try {
-                mCallbackStub.onAdjustVolume(packageName, pid, uid, caller, direction);
+                MediaSessionEngine sessionImpl = mSessionImpl.get();
+                if (sessionImpl != null) {
+                    sessionImpl.dispatchAdjustVolume(
+                            createRemoteUserInfo(packageName, pid, uid), direction);
+                }
             } finally {
                 Binder.restoreCallingIdentity(token);
             }
@@ -937,7 +908,11 @@
             ensureMediaControlPermission();
             final long token = Binder.clearCallingIdentity();
             try {
-                mCallbackStub.onSetVolumeTo(packageName, pid, uid, caller, value);
+                MediaSessionEngine sessionImpl = mSessionImpl.get();
+                if (sessionImpl != null) {
+                    sessionImpl.dispatchSetVolumeTo(
+                            createRemoteUserInfo(packageName, pid, uid), value);
+                }
             } finally {
                 Binder.restoreCallingIdentity(token);
             }
diff --git a/media/apex/java/android/media/session/SessionLink.aidl b/media/java/android/media/session/SessionLink.aidl
similarity index 100%
rename from media/apex/java/android/media/session/SessionLink.aidl
rename to media/java/android/media/session/SessionLink.aidl
diff --git a/media/apex/java/android/media/session/SessionLink.java b/media/java/android/media/session/SessionLink.java
similarity index 99%
rename from media/apex/java/android/media/session/SessionLink.java
rename to media/java/android/media/session/SessionLink.java
index 4ea7623..2331a4a 100644
--- a/media/apex/java/android/media/session/SessionLink.java
+++ b/media/java/android/media/session/SessionLink.java
@@ -18,7 +18,6 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
-import android.annotation.SystemApi;
 import android.app.PendingIntent;
 import android.media.AudioAttributes;
 import android.media.MediaMetadata;
@@ -36,7 +35,6 @@
  * Handles incoming commands from {@link MediaSession}.
  * @hide
  */
-@SystemApi
 public final class SessionLink implements Parcelable {
     public static final Parcelable.Creator<SessionLink> CREATOR =
             new Parcelable.Creator<SessionLink>() {
diff --git a/media/apex/java/android/service/media/IMediaBrowserService.aidl b/media/java/android/service/media/IMediaBrowserService.aidl
similarity index 100%
rename from media/apex/java/android/service/media/IMediaBrowserService.aidl
rename to media/java/android/service/media/IMediaBrowserService.aidl
diff --git a/media/apex/java/android/service/media/IMediaBrowserServiceCallbacks.aidl b/media/java/android/service/media/IMediaBrowserServiceCallbacks.aidl
similarity index 100%
rename from media/apex/java/android/service/media/IMediaBrowserServiceCallbacks.aidl
rename to media/java/android/service/media/IMediaBrowserServiceCallbacks.aidl
diff --git a/media/apex/java/android/service/media/MediaBrowserService.java b/media/java/android/service/media/MediaBrowserService.java
similarity index 100%
rename from media/apex/java/android/service/media/MediaBrowserService.java
rename to media/java/android/service/media/MediaBrowserService.java
diff --git a/media/jni/Android.bp b/media/jni/Android.bp
index 0fb4d2a..f1bb13d 100644
--- a/media/jni/Android.bp
+++ b/media/jni/Android.bp
@@ -116,7 +116,7 @@
         "libhidlbase",
         "libhidlmemory",
         "libhidltransport",
-        "libhwbinder",
+        "libhwbinder_noltopgo",
         "libbinderthreadstate",
 
         // MediaPlayer2 implementation
diff --git a/media/jni/android_media_MediaDrm.cpp b/media/jni/android_media_MediaDrm.cpp
index 81fce8a..d7ab854 100644
--- a/media/jni/android_media_MediaDrm.cpp
+++ b/media/jni/android_media_MediaDrm.cpp
@@ -175,7 +175,7 @@
 
 struct OfflineLicenseState {
     jint kOfflineLicenseStateUsable;
-    jint kOfflineLicenseStateInactive;
+    jint kOfflineLicenseStateReleased;
     jint kOfflineLicenseStateUnknown;
 } gOfflineLicenseStates;
 
@@ -426,6 +426,9 @@
     if (err == BAD_VALUE || err == ERROR_DRM_CANNOT_HANDLE) {
         jniThrowException(env, "java/lang/IllegalArgumentException", msg);
         return true;
+    } else if (err == ERROR_UNSUPPORTED) {
+        jniThrowException(env, "java/lang/UnsupportedOperationException", msg);
+        return true;
     } else if (err == ERROR_DRM_NOT_PROVISIONED) {
         jniThrowException(env, "android/media/NotProvisionedException", msg);
         return true;
@@ -542,15 +545,15 @@
 
 
 // static
-bool JDrm::IsCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType,
-                                   DrmPlugin::SecurityLevel securityLevel) {
+status_t JDrm::IsCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType,
+                                       DrmPlugin::SecurityLevel securityLevel, bool *isSupported) {
     sp<IDrm> drm = MakeDrm();
 
     if (drm == NULL) {
-        return false;
+        return BAD_VALUE;
     }
 
-    return drm->isCryptoSchemeSupported(uuid, mimeType, securityLevel);
+    return drm->isCryptoSchemeSupported(uuid, mimeType, securityLevel, isSupported);
 }
 
 status_t JDrm::initCheck() const {
@@ -794,10 +797,10 @@
     GET_STATIC_FIELD_ID(field, clazz, "SECURITY_LEVEL_HW_SECURE_ALL", "I");
     gSecurityLevels.kSecurityLevelHwSecureAll = env->GetStaticIntField(clazz, field);
 
-    GET_STATIC_FIELD_ID(field, clazz, "OFFLINE_LICENSE_USABLE", "I");
+    GET_STATIC_FIELD_ID(field, clazz, "OFFLINE_LICENSE_STATE_USABLE", "I");
     gOfflineLicenseStates.kOfflineLicenseStateUsable = env->GetStaticIntField(clazz, field);
-    GET_STATIC_FIELD_ID(field, clazz, "OFFLINE_LICENSE_INACTIVE", "I");
-    gOfflineLicenseStates.kOfflineLicenseStateInactive = env->GetStaticIntField(clazz, field);
+    GET_STATIC_FIELD_ID(field, clazz, "OFFLINE_LICENSE_STATE_RELEASED", "I");
+    gOfflineLicenseStates.kOfflineLicenseStateReleased = env->GetStaticIntField(clazz, field);
     GET_STATIC_FIELD_ID(field, clazz, "OFFLINE_LICENSE_STATE_UNKNOWN", "I");
     gOfflineLicenseStates.kOfflineLicenseStateUnknown = env->GetStaticIntField(clazz, field);
 
@@ -977,7 +980,14 @@
     }
     DrmPlugin::SecurityLevel securityLevel = jintToSecurityLevel(jSecurityLevel);
 
-    return JDrm::IsCryptoSchemeSupported(uuid.array(), mimeType, securityLevel);
+    bool isSupported;
+    status_t err = JDrm::IsCryptoSchemeSupported(uuid.array(), mimeType,
+            securityLevel, &isSupported);
+
+    if (throwExceptionAsNecessary(env, err, "Failed to query crypto scheme support")) {
+        return false;
+    }
+    return isSupported;
 }
 
 static jbyteArray android_media_MediaDrm_openSession(
@@ -1571,8 +1581,8 @@
     switch(state) {
     case DrmPlugin::kOfflineLicenseStateUsable:
         return gOfflineLicenseStates.kOfflineLicenseStateUsable;
-    case DrmPlugin::kOfflineLicenseStateInactive:
-        return gOfflineLicenseStates.kOfflineLicenseStateInactive;
+    case DrmPlugin::kOfflineLicenseStateReleased:
+        return gOfflineLicenseStates.kOfflineLicenseStateReleased;
     default:
         return gOfflineLicenseStates.kOfflineLicenseStateUnknown;
     }
diff --git a/media/jni/android_media_MediaDrm.h b/media/jni/android_media_MediaDrm.h
index 9338861..5ebac1d 100644
--- a/media/jni/android_media_MediaDrm.h
+++ b/media/jni/android_media_MediaDrm.h
@@ -37,9 +37,10 @@
 };
 
 struct JDrm : public BnDrmClient {
-    static bool IsCryptoSchemeSupported(const uint8_t uuid[16],
-                                        const String8 &mimeType,
-                                        DrmPlugin::SecurityLevel level);
+    static status_t IsCryptoSchemeSupported(const uint8_t uuid[16],
+                                            const String8 &mimeType,
+                                            DrmPlugin::SecurityLevel level,
+                                            bool *isSupported);
 
     JDrm(JNIEnv *env, jobject thiz, const uint8_t uuid[16], const String8 &appPackageName);
 
diff --git a/media/jni/android_media_MediaExtractor.cpp b/media/jni/android_media_MediaExtractor.cpp
index f3442f4..c6b171b 100644
--- a/media/jni/android_media_MediaExtractor.cpp
+++ b/media/jni/android_media_MediaExtractor.cpp
@@ -913,13 +913,9 @@
     }
 
     // build and return the Bundle
-    MediaAnalyticsItem *item = new MediaAnalyticsItem;
+    std::unique_ptr<MediaAnalyticsItem> item(MediaAnalyticsItem::create());
     item->readFromParcel(reply);
-    jobject mybundle = MediaMetricsJNI::writeMetricsToBundle(env, item, NULL);
-
-    // housekeeping
-    delete item;
-    item = NULL;
+    jobject mybundle = MediaMetricsJNI::writeMetricsToBundle(env, item.get(), NULL);
 
     return mybundle;
 }
diff --git a/media/jni/android_media_MediaPlayer.cpp b/media/jni/android_media_MediaPlayer.cpp
index 76bbce7..35b1081 100644
--- a/media/jni/android_media_MediaPlayer.cpp
+++ b/media/jni/android_media_MediaPlayer.cpp
@@ -682,13 +682,9 @@
         return (jobject) NULL;
     }
 
-    MediaAnalyticsItem *item = new MediaAnalyticsItem;
+    std::unique_ptr<MediaAnalyticsItem> item(MediaAnalyticsItem::create());
     item->readFromParcel(p);
-    jobject mybundle = MediaMetricsJNI::writeMetricsToBundle(env, item, NULL);
-
-    // housekeeping
-    delete item;
-    item = NULL;
+    jobject mybundle = MediaMetricsJNI::writeMetricsToBundle(env, item.get(), NULL);
 
     return mybundle;
 }
diff --git a/media/jni/android_media_MediaRecorder.cpp b/media/jni/android_media_MediaRecorder.cpp
index ca30f32..a7c0159 100644
--- a/media/jni/android_media_MediaRecorder.cpp
+++ b/media/jni/android_media_MediaRecorder.cpp
@@ -664,15 +664,11 @@
     }
 
     // build and return the Bundle
-    MediaAnalyticsItem *item = new MediaAnalyticsItem;
+    std::unique_ptr<MediaAnalyticsItem> item(MediaAnalyticsItem::create());
     item->readFromParcel(reply);
-    jobject mybundle = MediaMetricsJNI::writeMetricsToBundle(env, item, NULL);
+    jobject mybundle = MediaMetricsJNI::writeMetricsToBundle(env, item.get(), NULL);
 
-    // housekeeping
-    delete item;
-    item = NULL;
     return mybundle;
-
 }
 
 static jboolean
diff --git a/media/native/midi/include/Doxyfile b/media/native/midi/include/Doxyfile
new file mode 100644
index 0000000..2828f48
--- /dev/null
+++ b/media/native/midi/include/Doxyfile
@@ -0,0 +1,2494 @@
+# Doxyfile 1.8.13
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME           = "Android Native MIDI API (AMidi)"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER         =
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          =" Android Native MIDI API (AMidi)"
+
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
+
+PROJECT_LOGO           =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       =
+
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS         = NO
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES    = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF       = "The $name class" \
+                         "The $name widget" \
+                         "The $name file" \
+                         is \
+                         provides \
+                         specifies \
+                         contains \
+                         represents \
+                         a \
+                         an \
+                         the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES        = YES
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH        =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH    =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE               = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES                =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST              =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT       = YES
+
+# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
+# to that level are automatically included in the table of contents, even if
+# they do not have an id attribute.
+# Note: This feature currently applies only to Markdown headings.
+# Minimum value: 0, maximum value: 99, default value: 0.
+# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
+
+TOC_INCLUDE_HEADINGS   = 0
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT       = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING            = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL            = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO, these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES, upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC  = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES        = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE            =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES         =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET                  = YES
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS               = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC       = NO
+
+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
+# a warning is encountered.
+# The default value is: NO.
+
+WARN_AS_ERROR          = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
+# Note: If this tag is empty the current directory is searched.
+
+INPUT                  = "midi.h"
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
+# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08,
+# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf.
+
+FILE_PATTERNS          = *.c \
+                         *.cc \
+                         *.cxx \
+                         *.cpp \
+                         *.c++ \
+                         *.java \
+                         *.ii \
+                         *.ixx \
+                         *.ipp \
+                         *.i++ \
+                         *.inl \
+                         *.idl \
+                         *.ddl \
+                         *.odl \
+                         *.h \
+                         *.hh \
+                         *.hxx \
+                         *.hpp \
+                         *.h++ \
+                         *.cs \
+                         *.d \
+                         *.php \
+                         *.php4 \
+                         *.php5 \
+                         *.phtml \
+                         *.inc \
+                         *.m \
+                         *.markdown \
+                         *.md \
+                         *.mm \
+                         *.dox \
+                         *.py \
+                         *.pyw \
+                         *.f90 \
+                         *.f95 \
+                         *.f03 \
+                         *.f08 \
+                         *.f \
+                         *.for \
+                         *.tcl \
+                         *.vhd \
+                         *.vhdl \
+                         *.ucf \
+                         *.qsf
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE              = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS        =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH           =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS       = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH             =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES    = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS    = NO
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS        = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS       = YES
+
+# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
+# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
+# cost of reduced performance. This can be particularly helpful with template
+# rich C++ code for which doxygen's built-in parser lacks the necessary type
+# information.
+# Note: The availability of this option depends on whether or not doxygen was
+# generated with the -Duse-libclang=ON option for CMake.
+# The default value is: NO.
+
+CLANG_ASSISTED_PARSING = NO
+
+# If clang assisted parsing is enabled you can provide the compiler with command
+# line options that you would normally use when invoking the compiler. Note that
+# the include paths will already be set by doxygen for the files and directories
+# specified with INPUT and INCLUDE_PATH.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_OPTIONS          =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX     = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER            =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET        =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET  =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES       =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to YES can help to show when doxygen was last run and thus if the
+# documentation is up to date.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP         = NO
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET        = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP      = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE               =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION           =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the master .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI           = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING     =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX          = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW      = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH         = 250
+
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT    = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX            = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT         = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS     =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE       =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE           = NO
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH    = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH        = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL       =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE        = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID     =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS  =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE             = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. The package can be specified just
+# by its name or with the correct syntax as to be used with the LaTeX
+# \usepackage command. To get the times font for instance you can specify :
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
+# To use the option intlimits with the amsmath package you can specify:
+# EXTRA_PACKAGES=[intlimits]{amsmath}
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
+# string, for the replacement values of the other commands the user is referred
+# to HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER           =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER           =
+
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES      =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES, to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE        = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES     = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE      = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE        = plain
+
+# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_TIMESTAMP        = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE    =
+
+# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
+# with syntax highlighting in the RTF output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_SOURCE_CODE        = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION          = .3
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR             =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT             = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK       = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT         = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sf.net) file that captures the
+# structure of the code including all documentation. Note that this feature is
+# still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED             =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED      =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS        = YES
+
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES         = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH               =
+
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: YES.
+
+HAVE_DOT               = YES
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS        = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME           = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH    = NO
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK               = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH          = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. For an explanation of the image formats see the section
+# output formats in the documentation of the dot tool (Graphviz (see:
+# http://www.graphviz.org/)).
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd,
+# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo,
+# gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT       = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG        = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS           =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS           =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS           =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+
+PLANTUML_JAR_PATH      =
+
+# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
+# configuration file for plantuml.
+
+PLANTUML_CFG_FILE      =
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH  =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP            = YES
diff --git a/media/native/midi/include/Doxyfile.orig b/media/native/midi/include/Doxyfile.orig
new file mode 100644
index 0000000..e56fb18
--- /dev/null
+++ b/media/native/midi/include/Doxyfile.orig
@@ -0,0 +1,2494 @@
+# Doxyfile 1.8.13
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME           = "My Project"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER         =
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          =
+
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
+
+PROJECT_LOGO           =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       =
+
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS         = NO
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES    = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF       = "The $name class" \
+                         "The $name widget" \
+                         "The $name file" \
+                         is \
+                         provides \
+                         specifies \
+                         contains \
+                         represents \
+                         a \
+                         an \
+                         the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES        = YES
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH        =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH    =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE               = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES                =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST              =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT       = YES
+
+# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
+# to that level are automatically included in the table of contents, even if
+# they do not have an id attribute.
+# Note: This feature currently applies only to Markdown headings.
+# Minimum value: 0, maximum value: 99, default value: 0.
+# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
+
+TOC_INCLUDE_HEADINGS   = 0
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT       = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING            = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO, these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES, upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC  = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES        = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE            =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES         =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS               = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC       = NO
+
+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
+# a warning is encountered.
+# The default value is: NO.
+
+WARN_AS_ERROR          = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
+# Note: If this tag is empty the current directory is searched.
+
+INPUT                  =
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
+# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08,
+# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf.
+
+FILE_PATTERNS          = *.c \
+                         *.cc \
+                         *.cxx \
+                         *.cpp \
+                         *.c++ \
+                         *.java \
+                         *.ii \
+                         *.ixx \
+                         *.ipp \
+                         *.i++ \
+                         *.inl \
+                         *.idl \
+                         *.ddl \
+                         *.odl \
+                         *.h \
+                         *.hh \
+                         *.hxx \
+                         *.hpp \
+                         *.h++ \
+                         *.cs \
+                         *.d \
+                         *.php \
+                         *.php4 \
+                         *.php5 \
+                         *.phtml \
+                         *.inc \
+                         *.m \
+                         *.markdown \
+                         *.md \
+                         *.mm \
+                         *.dox \
+                         *.py \
+                         *.pyw \
+                         *.f90 \
+                         *.f95 \
+                         *.f03 \
+                         *.f08 \
+                         *.f \
+                         *.for \
+                         *.tcl \
+                         *.vhd \
+                         *.vhdl \
+                         *.ucf \
+                         *.qsf
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE              = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS        =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH           =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS       = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH             =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES    = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS        = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS       = YES
+
+# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
+# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
+# cost of reduced performance. This can be particularly helpful with template
+# rich C++ code for which doxygen's built-in parser lacks the necessary type
+# information.
+# Note: The availability of this option depends on whether or not doxygen was
+# generated with the -Duse-libclang=ON option for CMake.
+# The default value is: NO.
+
+CLANG_ASSISTED_PARSING = NO
+
+# If clang assisted parsing is enabled you can provide the compiler with command
+# line options that you would normally use when invoking the compiler. Note that
+# the include paths will already be set by doxygen for the files and directories
+# specified with INPUT and INCLUDE_PATH.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_OPTIONS          =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX     = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER            =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET        =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET  =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES       =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to YES can help to show when doxygen was last run and thus if the
+# documentation is up to date.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP         = NO
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET        = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP      = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE               =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION           =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the master .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI           = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING     =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX          = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW      = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH         = 250
+
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT    = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX            = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT         = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS     =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE       =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE           = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH    = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH        = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL       =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE        = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID     =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS  =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX         = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE             = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. The package can be specified just
+# by its name or with the correct syntax as to be used with the LaTeX
+# \usepackage command. To get the times font for instance you can specify :
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
+# To use the option intlimits with the amsmath package you can specify:
+# EXTRA_PACKAGES=[intlimits]{amsmath}
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
+# string, for the replacement values of the other commands the user is referred
+# to HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER           =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER           =
+
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES      =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES, to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE        = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES     = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE      = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE        = plain
+
+# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_TIMESTAMP        = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE    =
+
+# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
+# with syntax highlighting in the RTF output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_SOURCE_CODE        = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION          = .3
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR             =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT             = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK       = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT         = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sf.net) file that captures the
+# structure of the code including all documentation. Note that this feature is
+# still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED             =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED      =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS        = YES
+
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES         = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH               =
+
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: YES.
+
+HAVE_DOT               = YES
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS        = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME           = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK               = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH          = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. For an explanation of the image formats see the section
+# output formats in the documentation of the dot tool (Graphviz (see:
+# http://www.graphviz.org/)).
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd,
+# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo,
+# gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT       = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG        = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS           =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS           =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS           =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+
+PLANTUML_JAR_PATH      =
+
+# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
+# configuration file for plantuml.
+
+PLANTUML_CFG_FILE      =
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH  =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP            = YES
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/helpers/CameraTestUtils.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/helpers/CameraTestUtils.java
index 5ab5092..0340cec 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/helpers/CameraTestUtils.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/helpers/CameraTestUtils.java
@@ -857,7 +857,7 @@
         // JPEG doesn't have pixelstride and rowstride, treat it as 1D buffer.
         // Same goes for DEPTH_POINT_CLOUD
         if (format == ImageFormat.JPEG || format == ImageFormat.DEPTH_POINT_CLOUD ||
-                format == ImageFormat.RAW_PRIVATE) {
+                format == ImageFormat.DEPTH_JPEG || format == ImageFormat.RAW_PRIVATE) {
             buffer = planes[0].getBuffer();
             assertNotNull("Fail to get jpeg or depth ByteBuffer", buffer);
             data = new byte[buffer.remaining()];
@@ -940,6 +940,7 @@
             case ImageFormat.RAW_PRIVATE:
             case ImageFormat.DEPTH16:
             case ImageFormat.DEPTH_POINT_CLOUD:
+            case ImageFormat.DEPTH_JPEG:
                 assertEquals("JPEG/RAW/depth Images should have one plane", 1, planes.length);
                 break;
             default:
@@ -1363,6 +1364,9 @@
             case ImageFormat.RAW_PRIVATE:
                 validateRawPrivateData(data, width, height, image.getTimestamp(), filePath);
                 break;
+            case ImageFormat.DEPTH_JPEG:
+                validateDepthJpegData(data, width, height, format, image.getTimestamp(), filePath);
+                break;
             default:
                 throw new UnsupportedOperationException("Unsupported format for validation: "
                         + format);
@@ -1528,6 +1532,23 @@
 
     }
 
+    private static void validateDepthJpegData(byte[] depthData, int width, int height, int format,
+            long ts, String filePath) {
+
+        if (VERBOSE) Log.v(TAG, "Validating depth jpeg data");
+
+        // Can't validate size since it is variable
+
+        if (DEBUG && filePath != null) {
+            String fileName =
+                    filePath + "/" + width + "x" + height + "_" + ts / 1e6 + ".jpg";
+            dumpFile(fileName, depthData);
+        }
+
+        return;
+
+    }
+
     public static <T> T getValueNotNull(CaptureResult result, CaptureResult.Key<T> key) {
         if (result == null) {
             throw new IllegalArgumentException("Result must not be null");
diff --git a/native/webview/plat_support/draw_fn.h b/native/webview/plat_support/draw_fn.h
index e31ce19..5b3e496 100644
--- a/native/webview/plat_support/draw_fn.h
+++ b/native/webview/plat_support/draw_fn.h
@@ -84,7 +84,7 @@
   VkDevice device;
   VkQueue queue;
   uint32_t graphics_queue_index;
-  uint32_t instance_version;
+  uint32_t api_version;
   const char* const* enabled_instance_extension_names;
   uint32_t enabled_instance_extension_names_length;
   const char* const* enabled_device_extension_names;
diff --git a/native/webview/plat_support/draw_functor.cpp b/native/webview/plat_support/draw_functor.cpp
index afe103a..e43a60c 100644
--- a/native/webview/plat_support/draw_functor.cpp
+++ b/native/webview/plat_support/draw_functor.cpp
@@ -102,7 +102,7 @@
       .device = init_vk_params.device,
       .queue = init_vk_params.queue,
       .graphics_queue_index = init_vk_params.graphics_queue_index,
-      .instance_version = init_vk_params.instance_version,
+      .api_version = init_vk_params.api_version,
       .enabled_instance_extension_names =
           init_vk_params.enabled_instance_extension_names,
       .enabled_instance_extension_names_length =
@@ -177,9 +177,6 @@
         webview_functor_callbacks.vk.initialize = &initializeVk;
         webview_functor_callbacks.vk.draw = &drawVk;
         webview_functor_callbacks.vk.postDraw = &postDrawVk;
-        // TODO(boliu): Remove this once SkiaRecordingCanvas::drawWebViewFunctor
-        // no longer uses GL interop.
-        webview_functor_callbacks.gles.draw = &draw_gl;
         break;
     }
     callbacks_initialized = true;
diff --git a/packages/CaptivePortalLogin/Android.bp b/packages/CaptivePortalLogin/Android.bp
new file mode 100644
index 0000000..7acdfa1
--- /dev/null
+++ b/packages/CaptivePortalLogin/Android.bp
@@ -0,0 +1,27 @@
+//
+// Copyright (C) 2019 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+android_app {
+    name: "CaptivePortalLogin",
+    srcs: ["src/**/*.java"],
+    sdk_version: "system_current",
+    certificate: "platform",
+    static_libs: [
+        "androidx.legacy_legacy-support-v4",
+        "metrics-constants-protos",
+    ],
+    manifest: "AndroidManifest.xml",
+}
diff --git a/packages/CaptivePortalLogin/Android.mk b/packages/CaptivePortalLogin/Android.mk
deleted file mode 100644
index 8c63f45..0000000
--- a/packages/CaptivePortalLogin/Android.mk
+++ /dev/null
@@ -1,14 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := optional
-LOCAL_USE_AAPT2 := true
-LOCAL_STATIC_ANDROID_LIBRARIES := androidx.legacy_legacy-support-v4
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_PACKAGE_NAME := CaptivePortalLogin
-LOCAL_PRIVATE_PLATFORM_APIS := true
-LOCAL_CERTIFICATE := platform
-
-include $(BUILD_PACKAGE)
diff --git a/packages/CaptivePortalLogin/AndroidManifest.xml b/packages/CaptivePortalLogin/AndroidManifest.xml
index 5ab6632..e15dca0 100644
--- a/packages/CaptivePortalLogin/AndroidManifest.xml
+++ b/packages/CaptivePortalLogin/AndroidManifest.xml
@@ -21,9 +21,10 @@
 
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-    <uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" />
-    <uses-permission android:name="android.permission.NETWORK_BYPASS_PRIVATE_DNS" />
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
     <uses-permission android:name="android.permission.NETWORK_SETTINGS" />
+    <uses-permission android:name="android.permission.NETWORK_BYPASS_PRIVATE_DNS" />
 
     <application android:label="@string/app_name"
                  android:usesCleartextTraffic="true"
diff --git a/packages/CaptivePortalLogin/res/layout/ssl_error_msg.xml b/packages/CaptivePortalLogin/res/layout/ssl_error_msg.xml
deleted file mode 100644
index d460041..0000000
--- a/packages/CaptivePortalLogin/res/layout/ssl_error_msg.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<TextView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/ssl_error_msg"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:textAppearance="?android:attr/textAppearanceSmall"
-    android:layout_marginStart="20dip"
-    android:layout_marginEnd="20dip"
-    android:gravity="center_vertical"
-    android:layout_marginBottom="4dip"
-    android:layout_marginTop="4dip" />
-
diff --git a/packages/CaptivePortalLogin/res/layout/ssl_warning.xml b/packages/CaptivePortalLogin/res/layout/ssl_warning.xml
index ffd57a4..ce05e78 100644
--- a/packages/CaptivePortalLogin/res/layout/ssl_warning.xml
+++ b/packages/CaptivePortalLogin/res/layout/ssl_warning.xml
@@ -78,7 +78,18 @@
             android:id="@+id/certificate_layout"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
+            android:orientation="vertical"
             android:layout_marginBottom="16dip" >
+            <TextView
+                android:id="@+id/ssl_error_msg"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:textAppearance="?android:attr/textAppearanceSmall"
+                android:layout_marginStart="20dip"
+                android:layout_marginEnd="20dip"
+                android:gravity="center_vertical"
+                android:layout_marginBottom="4dip"
+                android:layout_marginTop="16dip" />
         </LinearLayout>
 
     </ScrollView>
diff --git a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
index 7eaf04b..ce627ce 100644
--- a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
+++ b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
@@ -20,7 +20,7 @@
 
 import android.app.Activity;
 import android.app.AlertDialog;
-import android.app.LoadedApk;
+import android.app.Application;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
@@ -37,8 +37,9 @@
 import android.net.http.SslCertificate;
 import android.net.http.SslError;
 import android.net.wifi.WifiInfo;
-import android.os.Build;
+import android.net.wifi.WifiManager;
 import android.os.Bundle;
+import android.os.SystemProperties;
 import android.text.TextUtils;
 import android.util.ArrayMap;
 import android.util.Log;
@@ -60,7 +61,6 @@
 
 import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
 
-import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 
 import java.io.IOException;
@@ -97,6 +97,7 @@
     private CaptivePortal mCaptivePortal;
     private NetworkCallback mNetworkCallback;
     private ConnectivityManager mCm;
+    private WifiManager mWifiManager;
     private boolean mLaunchBrowser = false;
     private MyWebViewClient mWebViewClient;
     private SwipeRefreshLayout mSwipeRefreshLayout;
@@ -107,11 +108,12 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
+        mCaptivePortal = getIntent().getParcelableExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL);
         logMetricsEvent(MetricsEvent.ACTION_CAPTIVE_PORTAL_LOGIN_ACTIVITY);
 
-        mCm = ConnectivityManager.from(this);
+        mCm = getSystemService(ConnectivityManager.class);
+        mWifiManager = getSystemService(WifiManager.class);
         mNetwork = getIntent().getParcelableExtra(ConnectivityManager.EXTRA_NETWORK);
-        mCaptivePortal = getIntent().getParcelableExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL);
         mUserAgent =
                 getIntent().getStringExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL_USER_AGENT);
         mUrl = getUrl();
@@ -152,7 +154,6 @@
         // Also initializes proxy system properties.
         mNetwork = mNetwork.getPrivateDnsBypassingCopy();
         mCm.bindProcessToNetwork(mNetwork);
-        mCm.setProcessDefaultNetworkForHostResolution(mNetwork);
 
         // Proxy system properties must be initialized before setContentView is called because
         // setContentView initializes the WebView logic which in turn reads the system properties.
@@ -191,9 +192,12 @@
 
     // Find WebView's proxy BroadcastReceiver and prompt it to read proxy system properties.
     private void setWebViewProxy() {
-        LoadedApk loadedApk = getApplication().mLoadedApk;
+        // TODO: migrate to androidx WebView proxy setting API as soon as it is finalized
         try {
-            Field receiversField = LoadedApk.class.getDeclaredField("mReceivers");
+            final Field loadedApkField = Application.class.getDeclaredField("mLoadedApk");
+            final Class<?> loadedApkClass = loadedApkField.getType();
+            final Object loadedApk = loadedApkField.get(getApplication());
+            Field receiversField = loadedApkClass.getDeclaredField("mReceivers");
             receiversField.setAccessible(true);
             ArrayMap receivers = (ArrayMap) receiversField.get(loadedApk);
             for (Object receiverMap : receivers.values()) {
@@ -334,7 +338,11 @@
 
     private static String sanitizeURL(URL url) {
         // In non-Debug build, only show host to avoid leaking private info.
-        return Build.IS_DEBUGGABLE ? Objects.toString(url) : host(url);
+        return isDebuggable() ? Objects.toString(url) : host(url);
+    }
+
+    private static boolean isDebuggable() {
+        return SystemProperties.getInt("ro.debuggable", 0) == 1;
     }
 
     private void testForCaptivePortal() {
@@ -587,19 +595,18 @@
         }
 
         private void setViewSecurityCertificate(LinearLayout certificateLayout, SslError error) {
+            ((TextView) certificateLayout.findViewById(R.id.ssl_error_msg))
+                    .setText(sslErrorMessage(error));
             SslCertificate cert = error.getCertificate();
-
-            View certificateView = cert.inflateCertificateView(CaptivePortalLoginActivity.this);
-            final LinearLayout placeholder = (LinearLayout) certificateView
-                    .findViewById(com.android.internal.R.id.placeholder);
-            LayoutInflater factory = LayoutInflater.from(CaptivePortalLoginActivity.this);
-
-            TextView textView = (TextView) factory.inflate(
-                    R.layout.ssl_error_msg, placeholder, false);
-            textView.setText(sslErrorMessage(error));
-            placeholder.addView(textView);
-
-            certificateLayout.addView(certificateView);
+            // TODO: call the method directly once inflateCertificateView is @SystemApi
+            try {
+                final View certificateView = (View) SslCertificate.class.getMethod(
+                        "inflateCertificateView", Context.class)
+                        .invoke(cert, CaptivePortalLoginActivity.this);
+                certificateLayout.addView(certificateView);
+            } catch (ReflectiveOperationException | SecurityException e) {
+                Log.e(TAG, "Could not create certificate view", e);
+            }
         }
     }
 
@@ -620,11 +627,30 @@
 
     private String getHeaderTitle() {
         NetworkCapabilities nc = mCm.getNetworkCapabilities(mNetwork);
-        if (nc == null || TextUtils.isEmpty(nc.getSSID())
-            || !nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
+        final String ssid = getSsid();
+        if (TextUtils.isEmpty(ssid)
+                || nc == null || !nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
             return getString(R.string.action_bar_label);
         }
-        return getString(R.string.action_bar_title, WifiInfo.removeDoubleQuotes(nc.getSSID()));
+        return getString(R.string.action_bar_title, ssid);
+    }
+
+    // TODO: remove once SSID is obtained from NetworkCapabilities
+    private String getSsid() {
+        if (mWifiManager == null) {
+            return null;
+        }
+        final WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
+        return removeDoubleQuotes(wifiInfo.getSSID());
+    }
+
+    private static String removeDoubleQuotes(String string) {
+        if (string == null) return null;
+        final int length = string.length();
+        if ((length > 1) && (string.charAt(0) == '"') && (string.charAt(length - 1) == '"')) {
+            return string.substring(1, length - 1);
+        }
+        return string;
     }
 
     private String getHeaderSubtitle(URL url) {
@@ -637,7 +663,7 @@
     }
 
     private void logMetricsEvent(int event) {
-        MetricsLogger.action(this, event, getPackageName());
+        mCaptivePortal.logEvent(event, getPackageName());
     }
 
     private static final SparseArray<String> SSL_ERRORS = new SparseArray<>();
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_null.xml b/packages/CarSystemUI/res/drawable/stat_sys_signal_null.xml
similarity index 100%
rename from packages/SystemUI/res/drawable/stat_sys_signal_null.xml
rename to packages/CarSystemUI/res/drawable/stat_sys_signal_null.xml
diff --git a/packages/CarSystemUI/res/layout/car_status_bar_header.xml b/packages/CarSystemUI/res/layout/car_status_bar_header.xml
index e446072..81c7108 100644
--- a/packages/CarSystemUI/res/layout/car_status_bar_header.xml
+++ b/packages/CarSystemUI/res/layout/car_status_bar_header.xml
@@ -22,6 +22,7 @@
     android:layout_height="@dimen/status_bar_height">
 
     <include layout="@layout/car_top_navigation_bar"
+        android:id="@+id/qs_car_top_bar"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:layout_weight="1"
diff --git a/packages/CarSystemUI/res/layout/notification_center_activity.xml b/packages/CarSystemUI/res/layout/notification_center_activity.xml
new file mode 100644
index 0000000..7c83303
--- /dev/null
+++ b/packages/CarSystemUI/res/layout/notification_center_activity.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (C) 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<com.android.car.notification.CarNotificationView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/notification_view"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <View
+         android:id="@+id/glass_pane"
+         android:layout_width="match_parent"
+         android:layout_height="match_parent"
+         app:layout_constraintTop_toTopOf="parent"
+         app:layout_constraintBottom_toBottomOf="parent"
+         app:layout_constraintStart_toStartOf="parent"
+         app:layout_constraintEnd_toEndOf="parent"
+         android:translationZ="2dp"
+        />
+
+    <androidx.car.widget.PagedListView
+        android:id="@+id/notifications"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:orientation="vertical"
+        android:theme="@style/PagedListTheme"
+        app:gutter="none"
+        app:itemSpacing="@dimen/item_spacing"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:scrollBarEnabled="false"
+        app:showPagedListViewDivider="false"/>
+
+</com.android.car.notification.CarNotificationView>
diff --git a/packages/CarSystemUI/res/values/colors.xml b/packages/CarSystemUI/res/values/colors.xml
index c510ab6..1e38f26 100644
--- a/packages/CarSystemUI/res/values/colors.xml
+++ b/packages/CarSystemUI/res/values/colors.xml
@@ -37,8 +37,8 @@
     <color name="status_bar_background_color">#33000000</color>
     <drawable name="system_bar_background">@color/status_bar_background_color</drawable>
 
-    <!-- The scrim color for the background of the notifications shade. -->
-    <color name="scrim_behind_color">#172026</color>
+    <!-- The background color of the notification shade -->
+    <color name="notification_shade_background_color">#99000000</color>
 
     <!-- The color of the dividing line between grouped notifications. -->
     <color name="notification_divider_color">@*android:color/notification_action_list</color>
diff --git a/packages/CarSystemUI/res/values/config.xml b/packages/CarSystemUI/res/values/config.xml
index 2e05c38..c9f9dea 100644
--- a/packages/CarSystemUI/res/values/config.xml
+++ b/packages/CarSystemUI/res/values/config.xml
@@ -34,6 +34,7 @@
     <string-array name="config_systemUIServiceComponents" translatable="false">
         <item>com.android.systemui.Dependency$DependencyCreator</item>
         <item>com.android.systemui.util.NotificationChannels</item>
+        <item>com.android.systemui.notifications.NotificationsUI</item>
         <item>com.android.systemui.statusbar.CommandQueue$CommandQueueStart</item>
         <item>com.android.systemui.keyguard.KeyguardViewMediator</item>
         <item>com.android.systemui.recents.Recents</item>
@@ -52,6 +53,5 @@
         <item>com.android.systemui.globalactions.GlobalActionsComponent</item>
         <item>com.android.systemui.ScreenDecorations</item>
         <item>com.android.systemui.SliceBroadcastRelayHandler</item>
-        <item>com.android.systemui.notifications.NotificationsUI</item>
     </string-array>
 </resources>
diff --git a/packages/CarSystemUI/res/values/integers_car.xml b/packages/CarSystemUI/res/values/integers_car.xml
index 472c957..be2cb0d 100644
--- a/packages/CarSystemUI/res/values/integers_car.xml
+++ b/packages/CarSystemUI/res/values/integers_car.xml
@@ -23,5 +23,13 @@
     <!-- Number of milliseconds user can spend driving with the keyguard up. After that, we switch to Guest. -->
     <!-- If the number is negative, the feature is disabled.
          If it's zero, we switch to guest immediately as we start driving. -->
-    <integer name="driving_on_keyguard_timeout_ms">30000</integer>
+    <integer name="driving_on_keyguard_timeout_ms">-1</integer>
+
+    <!--Percentage of the screen height, from the bottom, that a notification panel being
+    partially closed at will result in it remaining open if released-->
+    <integer name="notification_settle_open_percentage">20</integer>
+    <!--Percentage of the screen height, from the bottom, that a notification panel being peeked
+    at will result in remaining closed the panel if released-->
+    <integer name="notification_settle_close_percentage">80</integer>
+
 </resources>
diff --git a/packages/CarSystemUI/res/values/themes.xml b/packages/CarSystemUI/res/values/themes.xml
index 8a5961e..8d1a4d7 100644
--- a/packages/CarSystemUI/res/values/themes.xml
+++ b/packages/CarSystemUI/res/values/themes.xml
@@ -21,4 +21,7 @@
     <!--This Theme contains attributes required for components from the car support lib -->
     <style name="PagedListTheme" parent="Theme.CarSupportWrapper.NoActionBar">
     </style>
+
+    <style name="Theme.Notification" parent="Theme.DeviceDefault.NoActionBar.Notification">
+    </style>
 </resources>
diff --git a/packages/CarSystemUI/src/com/android/systemui/notifications/NotificationsUI.java b/packages/CarSystemUI/src/com/android/systemui/notifications/NotificationsUI.java
index 5e63b90..ca343d1 100644
--- a/packages/CarSystemUI/src/com/android/systemui/notifications/NotificationsUI.java
+++ b/packages/CarSystemUI/src/com/android/systemui/notifications/NotificationsUI.java
@@ -16,6 +16,10 @@
 
 package com.android.systemui.notifications;
 
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ValueAnimator;
+import android.annotation.SuppressLint;
 import android.app.ActivityManager;
 import android.car.Car;
 import android.car.CarNotConnectedException;
@@ -23,29 +27,48 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.ServiceConnection;
+import android.content.res.Configuration;
 import android.graphics.PixelFormat;
 import android.os.IBinder;
 import android.os.ServiceManager;
 import android.util.Log;
+import android.view.ContextThemeWrapper;
+import android.view.GestureDetector;
+import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
 import android.view.WindowManager;
 
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
 import com.android.car.notification.CarNotificationListener;
+import com.android.car.notification.CarNotificationView;
 import com.android.car.notification.CarUxRestrictionManagerWrapper;
 import com.android.car.notification.NotificationClickHandlerFactory;
 import com.android.car.notification.NotificationViewController;
 import com.android.car.notification.PreprocessingManager;
 import com.android.internal.statusbar.IStatusBarService;
+import com.android.systemui.Dependency;
 import com.android.systemui.R;
 import com.android.systemui.SystemUI;
+import com.android.systemui.statusbar.FlingAnimationUtils;
+import com.android.systemui.statusbar.policy.ConfigurationController;
 
 /**
  * Standalone SystemUI for displaying Notifications that have been designed to be used in the car
  */
-public class NotificationsUI extends SystemUI {
+public class NotificationsUI extends SystemUI
+        implements ConfigurationController.ConfigurationListener {
 
     private static final String TAG = "NotificationsUI";
+    // used to calculate how fast to open or close the window
+    private static final float DEFAULT_FLING_VELOCITY = 0;
+    // max time a fling animation takes
+    private static final float FLING_ANIMATION_MAX_TIME = 0.5f;
+    // acceleration rate for the fling animation
+    private static final float FLING_SPEED_UP_FACTOR = 0.6f;
     private CarNotificationListener mCarNotificationListener;
     private CarUxRestrictionsManager mCarUxRestrictionsManager;
     private NotificationClickHandlerFactory mClickHandlerFactory;
@@ -53,8 +76,20 @@
     private ViewGroup mCarNotificationWindow;
     private NotificationViewController mNotificationViewController;
     private boolean mIsShowing;
+    private boolean mIsTracking;
+    private boolean mNotificationListAtBottom;
+    private boolean mNotificationListAtBottomAtTimeOfTouch;
     private CarUxRestrictionManagerWrapper mCarUxRestrictionManagerWrapper =
             new CarUxRestrictionManagerWrapper();
+    // Used in the Notification panel touch listener
+    private GestureDetector mGestureDetector;
+    // Used in scrollable content of the notifications
+    private GestureDetector mScrollUpDetector;
+    private View mContent;
+    private View.OnTouchListener mOnTouchListener;
+    private FlingAnimationUtils mFlingAnimationUtils;
+    private static int sSettleOpenPercentage;
+    private static int sSettleClosePercentage;
 
     /**
      * Inits the window that hosts the notifications and establishes the connections
@@ -62,32 +97,41 @@
      */
     @Override
     public void start() {
+        sSettleOpenPercentage = mContext.getResources().getInteger(
+                R.integer.notification_settle_open_percentage);
+        sSettleClosePercentage = mContext.getResources().getInteger(
+                R.integer.notification_settle_close_percentage);
         WindowManager windowManager =
                 (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
+        mFlingAnimationUtils = new FlingAnimationUtils(mContext,
+                FLING_ANIMATION_MAX_TIME, FLING_SPEED_UP_FACTOR);
         mCarNotificationListener = new CarNotificationListener();
+        // create a notification click handler that closes the notification ui if the an activity
+        // is launched successfully
         mClickHandlerFactory = new NotificationClickHandlerFactory(
                 IStatusBarService.Stub.asInterface(
                         ServiceManager.getService(Context.STATUS_BAR_SERVICE)),
                 launchResult -> {
                     if (launchResult == ActivityManager.START_TASK_TO_FRONT
                             || launchResult == ActivityManager.START_SUCCESS) {
-                        closeCarNotifications();
+                        closeCarNotifications(DEFAULT_FLING_VELOCITY);
                     }
                 });
         mCarNotificationListener.registerAsSystemService(mContext, mCarUxRestrictionManagerWrapper,
                 mClickHandlerFactory);
         mCar = Car.createCar(mContext, mCarConnectionListener);
         mCar.connect();
-
-
-        mCarNotificationWindow = (ViewGroup) View.inflate(mContext,
+        NotificationGestureListener gestureListener = new NotificationGestureListener();
+        mGestureDetector = new GestureDetector(mContext, gestureListener);
+        mScrollUpDetector = new GestureDetector(mContext, new ScrollUpDetector());
+        mOnTouchListener = new NotificationPanelTouchListener();
+        mCarNotificationWindow = (ViewGroup) View.inflate(new ContextThemeWrapper(mContext,
+                        R.style.Theme_Notification),
                 R.layout.navigation_bar_window, null);
-        View.inflate(mContext,
-                com.android.car.notification.R.layout.notification_center_activity,
-                mCarNotificationWindow);
-        mCarNotificationWindow.findViewById(
-                com.android.car.notification.R.id.exit_button_container)
-                .setOnClickListener(v -> toggleShowingCarNotifications());
+        mCarNotificationWindow
+                .setBackgroundColor(mContext.getColor(R.color.notification_shade_background_color));
+
+        inflateNotificationContent();
 
         WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
                 ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
@@ -101,15 +145,222 @@
         // start in the hidden state
         mCarNotificationWindow.setVisibility(View.GONE);
         windowManager.addView(mCarNotificationWindow, layoutParams);
+
+        // Add this object to the SystemUI component registry such that the status bar
+        // can get a reference to it.
+        putComponent(NotificationsUI.class, this);
+        Dependency.get(ConfigurationController.class).addCallback(this);
+    }
+
+    @SuppressLint("ClickableViewAccessibility")
+    private void inflateNotificationContent() {
+        if (mNotificationViewController != null) {
+            mNotificationViewController.disable();
+        }
+        mCarNotificationWindow.removeAllViews();
+
+        mContent = View.inflate(new ContextThemeWrapper(mContext,
+                        com.android.car.notification.R.style.Theme_Notification),
+                R.layout.notification_center_activity,
+                mCarNotificationWindow);
+        // set the click handler such that we can dismiss the UI when a notification is clicked
+        CarNotificationView noteView = mCarNotificationWindow.findViewById(R.id.notification_view);
+        noteView.setClickHandlerFactory(mClickHandlerFactory);
+
+        mContent.setOnTouchListener(mOnTouchListener);
+        // set initial translation after size is calculated
+        mContent.getViewTreeObserver().addOnGlobalLayoutListener(
+                new ViewTreeObserver.OnGlobalLayoutListener() {
+                    @Override
+                    public void onGlobalLayout() {
+                        mContent.getViewTreeObserver().removeOnGlobalLayoutListener(this);
+                        if (!mIsShowing && !mIsTracking) {
+                            mContent.setTranslationY(mContent.getHeight() * -1);
+                        }
+                    }
+                });
+
+        RecyclerView notificationList = mCarNotificationWindow
+                .findViewById(com.android.car.notification.R.id.recycler_view);
+        // register a scroll listener so we can figure out if we are at the bottom of the
+        // list of notifications
+        notificationList.addOnScrollListener(new RecyclerView.OnScrollListener() {
+            @Override
+            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
+                super.onScrolled(recyclerView, dx, dy);
+                if (!notificationList.canScrollVertically(1)) {
+                    mNotificationListAtBottom = true;
+                    return;
+                }
+                mNotificationListAtBottom = false;
+                mNotificationListAtBottomAtTimeOfTouch = false;
+            }
+        });
+        // add a touch listener such that when the user scrolls up and they are at the bottom
+        // of the list we can start the closing of the view.
+        notificationList.setOnTouchListener(new NotificationListTouchListener());
+
+        // There's a view installed at a higher z-order such that we can intercept the ACTION_DOWN
+        // to set the initial click state.
+        mCarNotificationWindow.findViewById(R.id.glass_pane).setOnTouchListener((v, event) -> {
+            if (event.getActionMasked() == MotionEvent.ACTION_UP) {
+                mNotificationListAtBottomAtTimeOfTouch = false;
+            }
+            if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
+                mNotificationListAtBottomAtTimeOfTouch = mNotificationListAtBottom;
+                // register the down event with the gesture detectors so then know where the down
+                // started. This is needed because at this point we don't know which listener
+                // is going to handle scroll and fling events.
+                mGestureDetector.onTouchEvent(event);
+                mScrollUpDetector.onTouchEvent(event);
+            }
+            return false;
+        });
+
         mNotificationViewController = new NotificationViewController(
                 mCarNotificationWindow
                         .findViewById(com.android.car.notification.R.id.notification_view),
                 PreprocessingManager.getInstance(mContext),
                 mCarNotificationListener,
-                mCarUxRestrictionManagerWrapper
-        );
-        // Add to the SystemUI component registry
-        putComponent(NotificationsUI.class, this);
+                mCarUxRestrictionManagerWrapper);
+        mNotificationViewController.enable();
+    }
+
+    // allows for day night switch
+    @Override
+    public void onConfigChanged(Configuration newConfig) {
+        inflateNotificationContent();
+    }
+
+    public View.OnTouchListener getDragDownListener() {
+        return mOnTouchListener;
+    }
+
+    /**
+     * This listener is attached to the notification list UI to intercept gestures if the user
+     * is scrolling up when the notification list is at the bottom
+     */
+    private class ScrollUpDetector extends GestureDetector.SimpleOnGestureListener {
+
+        @Override
+        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
+            return distanceY > 0;
+        }
+    }
+
+    private class NotificationListTouchListener implements View.OnTouchListener {
+
+        @Override
+        public boolean onTouch(View v, MotionEvent event) {
+            // reset mNotificationListAtBottomAtTimeOfTouch here since the "glass pane" will not
+            // get the up event
+            if (event.getActionMasked() == MotionEvent.ACTION_UP) {
+                mNotificationListAtBottomAtTimeOfTouch = false;
+            }
+            boolean wasScrolledUp = mScrollUpDetector.onTouchEvent(event);
+
+            if (mIsTracking
+                    || (mNotificationListAtBottomAtTimeOfTouch && mNotificationListAtBottom
+                    && wasScrolledUp)) {
+                mOnTouchListener.onTouch(v, event);
+                // touch event should not be propagated further
+                return true;
+            }
+            return false;
+        }
+    }
+
+    /**
+     * Touch listener installed on the notification panel. It is also used by the Nav and StatusBar
+     */
+    private class NotificationPanelTouchListener implements View.OnTouchListener {
+
+        @Override
+        public boolean onTouch(View v, MotionEvent event) {
+            boolean consumed = mGestureDetector.onTouchEvent(event);
+            if (consumed) {
+                return true;
+            }
+            if (!mIsTracking || event.getActionMasked() != MotionEvent.ACTION_UP) {
+                return false;
+            }
+
+            float percentFromBottom =
+                    Math.abs(mContent.getTranslationY() / mContent.getHeight()) * 100;
+            if (mIsShowing) {
+                if (percentFromBottom < sSettleOpenPercentage) {
+                    // panel started to close but did not cross minimum threshold thus we open
+                    // it back up
+                    openCarNotifications(DEFAULT_FLING_VELOCITY);
+                    return true;
+                }
+                // panel was lifted more than the threshold thus we close it the rest of the way
+                closeCarNotifications(DEFAULT_FLING_VELOCITY);
+                return true;
+            }
+
+            if (percentFromBottom > sSettleClosePercentage) {
+                // panel was only peeked at thus close it back up
+                closeCarNotifications(DEFAULT_FLING_VELOCITY);
+                return true;
+            }
+            // panel has been open more than threshold thus open it the rest of the way
+            openCarNotifications(DEFAULT_FLING_VELOCITY);
+            return true;
+
+        }
+    }
+
+    /**
+     * Listener called by mGestureDetector. This will be initiated from the
+     * NotificationPanelTouchListener
+     */
+    private class NotificationGestureListener extends GestureDetector.SimpleOnGestureListener {
+        private static final int SWIPE_UP_MIN_DISTANCE = 75;
+        private static final int SWIPE_DOWN_MIN_DISTANCE = 25;
+        private static final int SWIPE_MAX_OFF_PATH = 75;
+        private static final int SWIPE_THRESHOLD_VELOCITY = 200;
+
+        @Override
+        public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX,
+                float distanceY) {
+            mIsTracking = true;
+            mCarNotificationWindow.setVisibility(View.VISIBLE);
+
+            mContent.setTranslationY(Math.min(mContent.getTranslationY() - distanceY, 0));
+            if (mContent.getTranslationY() == 0) {
+                mIsTracking = false;
+            }
+            return true;
+        }
+
+        @Override
+        public boolean onFling(MotionEvent event1, MotionEvent event2,
+                float velocityX, float velocityY) {
+            if (Math.abs(event1.getX() - event2.getX()) > SWIPE_MAX_OFF_PATH
+                    || Math.abs(velocityY) < SWIPE_THRESHOLD_VELOCITY) {
+                // swipe was not vertical or was not fast enough
+                return false;
+            }
+
+            boolean isUp = velocityY < 0;
+            float distanceDelta = Math.abs(event1.getY() - event2.getY());
+
+            if (isUp && distanceDelta > SWIPE_UP_MIN_DISTANCE) {
+                // fling up
+                mIsTracking = false;
+                closeCarNotifications(Math.abs(velocityY));
+                return true;
+
+            } else if (!isUp && distanceDelta > SWIPE_DOWN_MIN_DISTANCE) {
+                // fling down
+                mIsTracking = false;
+                openCarNotifications(velocityY);
+                return true;
+            }
+
+            return false;
+        }
     }
 
     /**
@@ -139,38 +390,56 @@
     };
 
     /**
-     * Toggles the visiblity of the notifications
+     * Toggles the visibility of the notifications
      */
     public void toggleShowingCarNotifications() {
         if (mCarNotificationWindow.getVisibility() == View.VISIBLE) {
-            closeCarNotifications();
+            closeCarNotifications(DEFAULT_FLING_VELOCITY);
             return;
         }
-        openCarNotifications();
+        openCarNotifications(DEFAULT_FLING_VELOCITY);
     }
 
     /**
      * Hides the notifications
      */
-    public void closeCarNotifications() {
-        mCarNotificationWindow.setVisibility(View.GONE);
+    public void closeCarNotifications(float velocityY) {
+        float closedTranslation = mContent.getHeight() * -1;
+        ValueAnimator animator =
+                ValueAnimator.ofFloat(mContent.getTranslationY(), closedTranslation);
+        animator.addUpdateListener(
+                animation -> mContent.setTranslationY((Float) animation.getAnimatedValue()));
+        mFlingAnimationUtils.apply(
+                animator, mContent.getTranslationY(), closedTranslation, velocityY);
+        animator.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                mCarNotificationWindow.setVisibility(View.GONE);
+            }
+        });
+        animator.start();
         mNotificationViewController.disable();
         mIsShowing = false;
+        mIsTracking = false;
+        RecyclerView notificationListView = mCarNotificationWindow.findViewById(
+                com.android.car.notification.R.id.recycler_view);
+        notificationListView.scrollToPosition(0);
     }
 
     /**
      * Sets the notifications to visible
      */
-    public void openCarNotifications() {
+    public void openCarNotifications(float velocityY) {
         mCarNotificationWindow.setVisibility(View.VISIBLE);
+
+        ValueAnimator animator = ValueAnimator.ofFloat(mContent.getTranslationY(), 0);
+        animator.addUpdateListener(
+                animation -> mContent.setTranslationY((Float) animation.getAnimatedValue()));
+        mFlingAnimationUtils.apply(animator, mContent.getTranslationY(), 0, velocityY);
+        animator.start();
+
         mNotificationViewController.enable();
         mIsShowing = true;
-    }
-
-    /**
-     * Returns {@code true} if notifications are currently on the screen
-     */
-    public boolean isShowing() {
-        return mIsShowing;
+        mIsTracking = false;
     }
 }
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarNavigationBarView.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarNavigationBarView.java
index 0cba351..afefa1b 100644
--- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarNavigationBarView.java
+++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarNavigationBarView.java
@@ -18,6 +18,7 @@
 
 import android.content.Context;
 import android.util.AttributeSet;
+import android.view.MotionEvent;
 import android.view.View;
 import android.widget.LinearLayout;
 
@@ -37,6 +38,8 @@
     private CarStatusBar mCarStatusBar;
     private Context mContext;
     private View mLockScreenButtons;
+    private OnTouchListener mStatusBarWindowTouchListener;
+
 
     public CarNavigationBarView(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -62,11 +65,22 @@
             mDarkIconManager.setShouldLog(true);
             Dependency.get(StatusBarIconController.class).addIconGroup(mDarkIconManager);
         }
+    }
 
+    @Override
+    public boolean onInterceptTouchEvent(MotionEvent ev) {
+        if (mStatusBarWindowTouchListener == null) {
+            return false;
+        }
+        // forward touch events to the status bar window so it can add a drag down
+        // windows if required (Notification shade)
+        mStatusBarWindowTouchListener.onTouch(this, ev);
+        return false;
     }
 
     void setStatusBar(CarStatusBar carStatusBar) {
         mCarStatusBar = carStatusBar;
+        mStatusBarWindowTouchListener = carStatusBar.getStatusBarWindowTouchListener();
     }
 
     protected void onNotificationsClick(View v) {
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
index b37c5e6..e66a4624 100644
--- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
+++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
@@ -211,6 +211,7 @@
     @Override
     public void showKeyguard() {
         super.showKeyguard();
+        getComponent(NotificationsUI.class).closeCarNotifications(0);
         if (mNavigationBarView != null) {
             mNavigationBarView.showKeyguardButtons();
         }
@@ -264,6 +265,12 @@
             mBatteryMeterView.setVisibility(View.GONE);
         });
         addTemperatureViewToController(mStatusBarWindow);
+        // The following are the ui elements that the user would call the status bar.
+        // This will set the status bar so it they can make call backs.
+        CarNavigationBarView topBar = mStatusBarWindow.findViewById(R.id.car_top_bar);
+        topBar.setStatusBar(this);
+        CarNavigationBarView qsTopBar = mStatusBarWindow.findViewById(R.id.qs_car_top_bar);
+        qsTopBar.setStatusBar(this);
     }
 
     @Override
@@ -339,6 +346,7 @@
             lp.setTitle("CarNavigationBar");
             lp.windowAnimations = 0;
             mWindowManager.addView(mNavigationBarWindow, lp);
+            mNavigationBarWindow.setOnTouchListener(getStatusBarWindowTouchListener());
         }
         if (mShowLeft) {
             int width = mContext.getResources().getDimensionPixelSize(
@@ -458,10 +466,8 @@
 
     @Override
     protected View.OnTouchListener getStatusBarWindowTouchListener() {
-        // Usually, a touch on the background window will dismiss the notification shade. However,
-        // for the car use-case, the shade should remain unless the user switches to a different
-        // facet (e.g. phone).
-        return null;
+        // Gets the car specific notification touch listener
+        return getComponent(NotificationsUI.class).getDragDownListener();
     }
 
     @Override
diff --git a/packages/ExtServices/Android.bp b/packages/ExtServices/Android.bp
new file mode 100644
index 0000000..77972fe
--- /dev/null
+++ b/packages/ExtServices/Android.bp
@@ -0,0 +1,11 @@
+android_library {
+    name: "ExtServices-core",
+     srcs: [
+         "src/**/*.java",
+     ],
+     resource_dirs: [
+         "res",
+     ],
+
+     manifest: "AndroidManifest.xml",
+}
\ No newline at end of file
diff --git a/packages/ExtServices/AndroidManifest.xml b/packages/ExtServices/AndroidManifest.xml
index 010a810..7fb51b9 100644
--- a/packages/ExtServices/AndroidManifest.xml
+++ b/packages/ExtServices/AndroidManifest.xml
@@ -22,6 +22,7 @@
     coreApp="true">
 
     <uses-permission android:name="android.permission.PROVIDE_RESOLVER_RANKER_SERVICE" />
+    <uses-permission android:name="android.permission.READ_DEVICE_CONFIG" />
 
     <application android:label="@string/app_name"
         android:defaultToDeviceProtectedStorage="true"
diff --git a/packages/ExtServices/src/android/ext/services/notification/Assistant.java b/packages/ExtServices/src/android/ext/services/notification/Assistant.java
index ce58d4e..fe931ff 100644
--- a/packages/ExtServices/src/android/ext/services/notification/Assistant.java
+++ b/packages/ExtServices/src/android/ext/services/notification/Assistant.java
@@ -215,9 +215,9 @@
             return null;
         }
         NotificationEntry entry = new NotificationEntry(mPackageManager, sbn, channel);
-        ArrayList<Notification.Action> actions = mSmartActionsHelper.suggestActions(entry);
-        ArrayList<CharSequence> replies = mSmartActionsHelper.suggestReplies(entry);
-        return createEnqueuedNotificationAdjustment(entry, actions, replies);
+        SmartActionsHelper.SmartSuggestions suggestions = mSmartActionsHelper.suggest(entry);
+        return createEnqueuedNotificationAdjustment(
+                entry, suggestions.actions, suggestions.replies);
     }
 
     /** A convenience helper for creating an adjustment for an SBN. */
diff --git a/packages/ExtServices/src/android/ext/services/notification/AssistantSettings.java b/packages/ExtServices/src/android/ext/services/notification/AssistantSettings.java
index 406b44d..d99c356 100644
--- a/packages/ExtServices/src/android/ext/services/notification/AssistantSettings.java
+++ b/packages/ExtServices/src/android/ext/services/notification/AssistantSettings.java
@@ -46,24 +46,6 @@
     private static final Uri NOTIFICATION_NEW_INTERRUPTION_MODEL_URI =
             Settings.Secure.getUriFor(Settings.Secure.NOTIFICATION_NEW_INTERRUPTION_MODEL);
 
-    /**
-     * Flag determining whether the Notification Assistant should generate replies for
-     * notifications.
-     * <p>
-     * This flag belongs to the namespace: {@link DeviceConfig#NAMESPACE_NOTIFICATION_ASSISTANT}.
-     */
-    @VisibleForTesting
-    static final String KEY_GENERATE_REPLIES = "notification_assistant_generate_replies";
-
-    /**
-     * Flag determining whether the Notification Assistant should generate contextual actions in
-     * notifications.
-     * <p>
-     * This flag belongs to the namespace: {@link DeviceConfig#NAMESPACE_NOTIFICATION_ASSISTANT}.
-     */
-    @VisibleForTesting
-    static final String KEY_GENERATE_ACTIONS = "notification_assistant_generate_actions";
-
     private final KeyValueListParser mParser = new KeyValueListParser(',');
     private final ContentResolver mResolver;
     private final int mUserId;
@@ -118,7 +100,7 @@
 
     private void registerDeviceConfigs() {
         DeviceConfig.addOnPropertyChangedListener(
-                DeviceConfig.NAMESPACE_NOTIFICATION_ASSISTANT,
+                DeviceConfig.NotificationAssistant.NAMESPACE,
                 this::postToHandler,
                 this::onDeviceConfigPropertyChanged);
 
@@ -132,7 +114,7 @@
 
     @VisibleForTesting
     void onDeviceConfigPropertyChanged(String namespace, String name, String value) {
-        if (!DeviceConfig.NAMESPACE_NOTIFICATION_ASSISTANT.equals(namespace)) {
+        if (!DeviceConfig.NotificationAssistant.NAMESPACE.equals(namespace)) {
             Log.e(LOG_TAG, "Received update from DeviceConfig for unrelated namespace: "
                     + namespace + " " + name + "=" + value);
             return;
@@ -143,8 +125,8 @@
 
     private void updateFromDeviceConfigFlags() {
         String generateRepliesFlag = DeviceConfig.getProperty(
-                DeviceConfig.NAMESPACE_NOTIFICATION_ASSISTANT,
-                KEY_GENERATE_REPLIES);
+                DeviceConfig.NotificationAssistant.NAMESPACE,
+                DeviceConfig.NotificationAssistant.GENERATE_REPLIES);
         if (TextUtils.isEmpty(generateRepliesFlag)) {
             mGenerateReplies = DEFAULT_GENERATE_REPLIES;
         } else {
@@ -154,8 +136,8 @@
         }
 
         String generateActionsFlag = DeviceConfig.getProperty(
-                DeviceConfig.NAMESPACE_NOTIFICATION_ASSISTANT,
-                KEY_GENERATE_ACTIONS);
+                DeviceConfig.NotificationAssistant.NAMESPACE,
+                DeviceConfig.NotificationAssistant.GENERATE_ACTIONS);
         if (TextUtils.isEmpty(generateActionsFlag)) {
             mGenerateActions = DEFAULT_GENERATE_ACTIONS;
         } else {
diff --git a/packages/ExtServices/src/android/ext/services/notification/NotificationCategorizer.java b/packages/ExtServices/src/android/ext/services/notification/NotificationCategorizer.java
index 1f4ba01..7ba0f7a 100644
--- a/packages/ExtServices/src/android/ext/services/notification/NotificationCategorizer.java
+++ b/packages/ExtServices/src/android/ext/services/notification/NotificationCategorizer.java
@@ -45,12 +45,13 @@
     protected static final int CATEGORY_PEOPLE = 4;
     protected static final int CATEGORY_ALARM = 5;
     protected static final int CATEGORY_CALL = 6;
+    protected static final int CATEGORY_HIGH = 7;
 
     /** @hide */
     @IntDef(prefix = { "CATEGORY_" }, value = {
             CATEGORY_MIN, CATEGORY_EVERYTHING_ELSE, CATEGORY_ONGOING, CATEGORY_CALL,
             CATEGORY_SYSTEM_LOW, CATEGORY_EVENT, CATEGORY_REMINDER, CATEGORY_SYSTEM,
-            CATEGORY_PEOPLE, CATEGORY_ALARM
+            CATEGORY_PEOPLE, CATEGORY_ALARM, CATEGORY_HIGH
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface Category {}
@@ -96,6 +97,9 @@
                 return CATEGORY_SYSTEM_LOW;
             }
         }
+        if (entry.getChannel().getImportance() == IMPORTANCE_HIGH) {
+            return CATEGORY_HIGH;
+        }
         if (entry.isOngoing()) {
             return CATEGORY_ONGOING;
         }
diff --git a/packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java b/packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java
index 5acf4fb..48a3974 100644
--- a/packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java
+++ b/packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java
@@ -92,6 +92,23 @@
         mSettings = settings;
     }
 
+    @NonNull
+    SmartSuggestions suggest(@NonNull NotificationEntry entry) {
+        // Whenever suggest() is called on a notification, its previous session is ended.
+        mNotificationKeyToResultIdCache.remove(entry.getSbn().getKey());
+
+        ArrayList<Notification.Action> actions = suggestActions(entry);
+        ArrayList<CharSequence> replies = suggestReplies(entry);
+
+        // Not logging subsequent events of this notification if we didn't generate any suggestion
+        // for it.
+        if (replies.isEmpty() && actions.isEmpty()) {
+            mNotificationKeyToResultIdCache.remove(entry.getSbn().getKey());
+        }
+
+        return new SmartSuggestions(replies, actions);
+    }
+
     /**
      * Adds action adjustments based on the notification contents.
      */
@@ -115,6 +132,7 @@
                 messages.get(messages.size() - 1).getText(), MAX_SMART_ACTIONS);
     }
 
+    @NonNull
     ArrayList<CharSequence> suggestReplies(@NonNull NotificationEntry entry) {
         if (!mSettings.mGenerateReplies) {
             return EMPTY_REPLY_LIST;
@@ -146,7 +164,7 @@
                 .collect(Collectors.toCollection(ArrayList::new));
 
         String resultId = conversationActionsResult.getId();
-        if (resultId != null && !replies.isEmpty()) {
+        if (resultId != null) {
             mNotificationKeyToResultIdCache.put(entry.getSbn().getKey(), resultId);
         }
         return replies;
@@ -385,4 +403,15 @@
         }
         return actions;
     }
+
+    static class SmartSuggestions {
+        public final ArrayList<CharSequence> replies;
+        public final ArrayList<Notification.Action> actions;
+
+        SmartSuggestions(
+                ArrayList<CharSequence> replies, ArrayList<Notification.Action> actions) {
+            this.replies = replies;
+            this.actions = actions;
+        }
+    }
 }
diff --git a/packages/ExtServices/tests/Android.bp b/packages/ExtServices/tests/Android.bp
new file mode 100644
index 0000000..5de4548
--- /dev/null
+++ b/packages/ExtServices/tests/Android.bp
@@ -0,0 +1,26 @@
+android_test {
+    name: "ExtServicesUnitTests",
+
+    // Include all test java files.
+    srcs: ["src/**/*.java"],
+
+    // We only want this apk build for tests.
+    certificate: "platform",
+
+    libs: [
+        "android.test.runner",
+        "android.test.base",
+    ],
+
+    static_libs: [
+        "ExtServices-core",
+        "android-support-test",
+        "mockito-target-minus-junit4",
+        "espresso-core",
+        "truth-prebuilt",
+        "testables",
+        "testng",
+    ],
+
+    platform_apis: true,
+}
\ No newline at end of file
diff --git a/packages/ExtServices/tests/Android.mk b/packages/ExtServices/tests/Android.mk
deleted file mode 100644
index a57fa94..0000000
--- a/packages/ExtServices/tests/Android.mk
+++ /dev/null
@@ -1,26 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-# We only want this apk build for tests.
-LOCAL_MODULE_TAGS := tests
-LOCAL_CERTIFICATE := platform
-
-LOCAL_JAVA_LIBRARIES := android.test.runner android.test.base
-
-LOCAL_STATIC_JAVA_LIBRARIES := \
-    android-support-test \
-    mockito-target-minus-junit4 \
-    espresso-core \
-    truth-prebuilt \
-    testables \
-    testng
-
-# Include all test java files.
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_PACKAGE_NAME := ExtServicesUnitTests
-LOCAL_PRIVATE_PLATFORM_APIS := true
-
-LOCAL_INSTRUMENTATION_FOR := ExtServices
-
-include $(BUILD_PACKAGE)
diff --git a/packages/ExtServices/tests/AndroidManifest.xml b/packages/ExtServices/tests/AndroidManifest.xml
index ddf725b..3cf1527 100644
--- a/packages/ExtServices/tests/AndroidManifest.xml
+++ b/packages/ExtServices/tests/AndroidManifest.xml
@@ -24,7 +24,7 @@
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
-                     android:targetPackage="android.ext.services"
+                     android:targetPackage="android.ext.services.tests.unit"
                      android:label="ExtServices Test Cases">
     </instrumentation>
 
diff --git a/packages/ExtServices/tests/src/android/ext/services/notification/AssistantSettingsTest.java b/packages/ExtServices/tests/src/android/ext/services/notification/AssistantSettingsTest.java
index 51b723d..597051a 100644
--- a/packages/ExtServices/tests/src/android/ext/services/notification/AssistantSettingsTest.java
+++ b/packages/ExtServices/tests/src/android/ext/services/notification/AssistantSettingsTest.java
@@ -71,9 +71,14 @@
 
     @Test
     public void testGenerateRepliesDisabled() {
+        DeviceConfig.setProperty(
+                DeviceConfig.NotificationAssistant.NAMESPACE,
+                DeviceConfig.NotificationAssistant.GENERATE_REPLIES,
+                "false",
+                false /* makeDefault */);
         mAssistantSettings.onDeviceConfigPropertyChanged(
-                DeviceConfig.NAMESPACE_NOTIFICATION_ASSISTANT,
-                AssistantSettings.KEY_GENERATE_REPLIES,
+                DeviceConfig.NotificationAssistant.NAMESPACE,
+                DeviceConfig.NotificationAssistant.GENERATE_REPLIES,
                 "false");
 
         assertFalse(mAssistantSettings.mGenerateReplies);
@@ -81,9 +86,14 @@
 
     @Test
     public void testGenerateRepliesEnabled() {
+        DeviceConfig.setProperty(
+                DeviceConfig.NotificationAssistant.NAMESPACE,
+                DeviceConfig.NotificationAssistant.GENERATE_REPLIES,
+                "true",
+                false /* makeDefault */);
         mAssistantSettings.onDeviceConfigPropertyChanged(
-                DeviceConfig.NAMESPACE_NOTIFICATION_ASSISTANT,
-                AssistantSettings.KEY_GENERATE_REPLIES,
+                DeviceConfig.NotificationAssistant.NAMESPACE,
+                DeviceConfig.NotificationAssistant.GENERATE_REPLIES,
                 "true");
 
         assertTrue(mAssistantSettings.mGenerateReplies);
@@ -91,16 +101,26 @@
 
     @Test
     public void testGenerateRepliesEmptyFlag() {
+        DeviceConfig.setProperty(
+                DeviceConfig.NotificationAssistant.NAMESPACE,
+                DeviceConfig.NotificationAssistant.GENERATE_REPLIES,
+                "false",
+                false /* makeDefault */);
         mAssistantSettings.onDeviceConfigPropertyChanged(
-                DeviceConfig.NAMESPACE_NOTIFICATION_ASSISTANT,
-                AssistantSettings.KEY_GENERATE_REPLIES,
+                DeviceConfig.NotificationAssistant.NAMESPACE,
+                DeviceConfig.NotificationAssistant.GENERATE_REPLIES,
                 "false");
 
         assertFalse(mAssistantSettings.mGenerateReplies);
 
+        DeviceConfig.setProperty(
+                DeviceConfig.NotificationAssistant.NAMESPACE,
+                DeviceConfig.NotificationAssistant.GENERATE_REPLIES,
+                "",
+                false /* makeDefault */);
         mAssistantSettings.onDeviceConfigPropertyChanged(
-                DeviceConfig.NAMESPACE_NOTIFICATION_ASSISTANT,
-                AssistantSettings.KEY_GENERATE_REPLIES,
+                DeviceConfig.NotificationAssistant.NAMESPACE,
+                DeviceConfig.NotificationAssistant.GENERATE_REPLIES,
                 "");
 
         // Go back to the default value.
@@ -109,9 +129,14 @@
 
     @Test
     public void testGenerateActionsDisabled() {
+        DeviceConfig.setProperty(
+                DeviceConfig.NotificationAssistant.NAMESPACE,
+                DeviceConfig.NotificationAssistant.GENERATE_ACTIONS,
+                "false",
+                false /* makeDefault */);
         mAssistantSettings.onDeviceConfigPropertyChanged(
-                DeviceConfig.NAMESPACE_NOTIFICATION_ASSISTANT,
-                AssistantSettings.KEY_GENERATE_ACTIONS,
+                DeviceConfig.NotificationAssistant.NAMESPACE,
+                DeviceConfig.NotificationAssistant.GENERATE_ACTIONS,
                 "false");
 
         assertFalse(mAssistantSettings.mGenerateActions);
@@ -119,9 +144,14 @@
 
     @Test
     public void testGenerateActionsEnabled() {
+        DeviceConfig.setProperty(
+                DeviceConfig.NotificationAssistant.NAMESPACE,
+                DeviceConfig.NotificationAssistant.GENERATE_ACTIONS,
+                "true",
+                false /* makeDefault */);
         mAssistantSettings.onDeviceConfigPropertyChanged(
-                DeviceConfig.NAMESPACE_NOTIFICATION_ASSISTANT,
-                AssistantSettings.KEY_GENERATE_ACTIONS,
+                DeviceConfig.NotificationAssistant.NAMESPACE,
+                DeviceConfig.NotificationAssistant.GENERATE_ACTIONS,
                 "true");
 
         assertTrue(mAssistantSettings.mGenerateActions);
@@ -129,16 +159,26 @@
 
     @Test
     public void testGenerateActionsEmptyFlag() {
+        DeviceConfig.setProperty(
+                DeviceConfig.NotificationAssistant.NAMESPACE,
+                DeviceConfig.NotificationAssistant.GENERATE_ACTIONS,
+                "false",
+                false /* makeDefault */);
         mAssistantSettings.onDeviceConfigPropertyChanged(
-                DeviceConfig.NAMESPACE_NOTIFICATION_ASSISTANT,
-                AssistantSettings.KEY_GENERATE_ACTIONS,
+                DeviceConfig.NotificationAssistant.NAMESPACE,
+                DeviceConfig.NotificationAssistant.GENERATE_ACTIONS,
                 "false");
 
         assertFalse(mAssistantSettings.mGenerateActions);
 
+        DeviceConfig.setProperty(
+                DeviceConfig.NotificationAssistant.NAMESPACE,
+                DeviceConfig.NotificationAssistant.GENERATE_ACTIONS,
+                "",
+                false /* makeDefault */);
         mAssistantSettings.onDeviceConfigPropertyChanged(
-                DeviceConfig.NAMESPACE_NOTIFICATION_ASSISTANT,
-                AssistantSettings.KEY_GENERATE_ACTIONS,
+                DeviceConfig.NotificationAssistant.NAMESPACE,
+                DeviceConfig.NotificationAssistant.GENERATE_ACTIONS,
                 "");
 
         // Go back to the default value.
diff --git a/packages/ExtServices/tests/src/android/ext/services/notification/NotificationCategorizerTest.java b/packages/ExtServices/tests/src/android/ext/services/notification/NotificationCategorizerTest.java
index c37392f..c59885e 100644
--- a/packages/ExtServices/tests/src/android/ext/services/notification/NotificationCategorizerTest.java
+++ b/packages/ExtServices/tests/src/android/ext/services/notification/NotificationCategorizerTest.java
@@ -85,6 +85,16 @@
     }
 
     @Test
+    public void testHigh() {
+        NotificationCategorizer nc = new NotificationCategorizer();
+
+        when(mEntry.getChannel()).thenReturn(new NotificationChannel("", "", IMPORTANCE_HIGH));
+
+        assertEquals(NotificationCategorizer.CATEGORY_HIGH, nc.getCategory(mEntry));
+        assertFalse(nc.shouldSilence(NotificationCategorizer.CATEGORY_HIGH));
+    }
+
+    @Test
     public void testOngoingCategory() {
         NotificationCategorizer nc = new NotificationCategorizer();
 
@@ -170,7 +180,7 @@
         assertFalse(nc.shouldSilence(NotificationCategorizer.CATEGORY_SYSTEM));
 
         when(mSbn.getUid()).thenReturn(FIRST_APPLICATION_UID);
-        assertEquals(NotificationCategorizer.CATEGORY_EVERYTHING_ELSE, nc.getCategory(mEntry));
+        assertEquals(NotificationCategorizer.CATEGORY_HIGH, nc.getCategory(mEntry));
     }
 
     @Test
diff --git a/packages/NetworkStack/Android.bp b/packages/NetworkStack/Android.bp
index 9b0d896..d656593 100644
--- a/packages/NetworkStack/Android.bp
+++ b/packages/NetworkStack/Android.bp
@@ -18,6 +18,7 @@
 // system server on devices that run the stack there
 java_library {
     name: "NetworkStackLib",
+    sdk_version: "system_current",
     installable: true,
     srcs: [
         "src/**/*.java",
@@ -25,18 +26,20 @@
         ":services-networkstack-shared-srcs",
     ],
     static_libs: [
-        "services-netlink-lib",
+        "netd_aidl_interface-java",
+        "networkstack-aidl-interfaces-java",
     ]
 }
 
 // Updatable network stack packaged as an application
 android_app {
     name: "NetworkStack",
-    platform_apis: true,
+    sdk_version: "system_current",
     certificate: "platform",
     privileged: true,
     static_libs: [
         "NetworkStackLib"
     ],
     manifest: "AndroidManifest.xml",
+    required: ["NetworkStackPermissionStub"],
 }
\ No newline at end of file
diff --git a/packages/NetworkStack/AndroidManifest.xml b/packages/NetworkStack/AndroidManifest.xml
index 5ab833b..ac55bfa 100644
--- a/packages/NetworkStack/AndroidManifest.xml
+++ b/packages/NetworkStack/AndroidManifest.xml
@@ -25,6 +25,8 @@
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
     <uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" />
     <uses-permission android:name="android.permission.NETWORK_SETTINGS" />
+    <!-- Signature permission defined in NetworkStackStub -->
+    <uses-permission android:name="android.permission.MAINLINE_NETWORK_STACK" />
     <!-- Launch captive portal app as specific user -->
     <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
     <uses-permission android:name="android.permission.NETWORK_STACK" />
diff --git a/packages/NetworkStack/src/android/net/apf/ApfFilter.java b/packages/NetworkStack/src/android/net/apf/ApfFilter.java
index 08452bb..4fa7d64 100644
--- a/packages/NetworkStack/src/android/net/apf/ApfFilter.java
+++ b/packages/NetworkStack/src/android/net/apf/ApfFilter.java
@@ -38,7 +38,6 @@
 import android.content.IntentFilter;
 import android.net.LinkAddress;
 import android.net.LinkProperties;
-import android.net.NetworkUtils;
 import android.net.apf.ApfGenerator.IllegalInstructionException;
 import android.net.apf.ApfGenerator.Register;
 import android.net.ip.IpClient.IpClientCallbacksWrapper;
@@ -47,6 +46,8 @@
 import android.net.metrics.IpConnectivityLog;
 import android.net.metrics.RaEvent;
 import android.net.util.InterfaceParams;
+import android.net.util.NetworkStackUtils;
+import android.net.util.SocketUtils;
 import android.os.PowerManager;
 import android.os.SystemClock;
 import android.system.ErrnoException;
@@ -60,8 +61,6 @@
 import com.android.internal.util.HexDump;
 import com.android.internal.util.IndentingPrintWriter;
 
-import libcore.io.IoBridge;
-
 import java.io.FileDescriptor;
 import java.io.IOException;
 import java.net.Inet4Address;
@@ -200,10 +199,8 @@
 
         public void halt() {
             mStopped = true;
-            try {
-                // Interrupts the read() call the thread is blocked in.
-                IoBridge.closeAndSignalBlockedThreads(mSocket);
-            } catch (IOException ignored) {}
+            // Interrupts the read() call the thread is blocked in.
+            NetworkStackUtils.closeSocketQuietly(mSocket);
         }
 
         @Override
@@ -470,8 +467,8 @@
             socket = Os.socket(AF_PACKET, SOCK_RAW, ETH_P_IPV6);
             SocketAddress addr = makePacketSocketAddress(
                     (short) ETH_P_IPV6, mInterfaceParams.index);
-            Os.bind(socket, addr);
-            NetworkUtils.attachRaFilter(socket, mApfCapabilities.apfPacketFormat);
+            SocketUtils.bindSocket(socket, addr);
+            SocketUtils.attachRaFilter(socket, mApfCapabilities.apfPacketFormat);
         } catch(SocketException|ErrnoException e) {
             Log.e(TAG, "Error starting filter", e);
             return;
diff --git a/packages/NetworkStack/src/android/net/dhcp/DhcpClient.java b/packages/NetworkStack/src/android/net/dhcp/DhcpClient.java
index 12eecc0..b0e8da9 100644
--- a/packages/NetworkStack/src/android/net/dhcp/DhcpClient.java
+++ b/packages/NetworkStack/src/android/net/dhcp/DhcpClient.java
@@ -28,6 +28,7 @@
 import static android.net.dhcp.DhcpPacket.DHCP_VENDOR_INFO;
 import static android.net.dhcp.DhcpPacket.INADDR_ANY;
 import static android.net.dhcp.DhcpPacket.INADDR_BROADCAST;
+import static android.net.util.NetworkStackUtils.closeSocketQuietly;
 import static android.net.util.SocketUtils.makePacketSocketAddress;
 import static android.system.OsConstants.AF_INET;
 import static android.system.OsConstants.AF_PACKET;
@@ -44,7 +45,6 @@
 
 import android.content.Context;
 import android.net.DhcpResults;
-import android.net.NetworkUtils;
 import android.net.TrafficStats;
 import android.net.ip.IpClient;
 import android.net.metrics.DhcpClientEvent;
@@ -66,8 +66,6 @@
 import com.android.internal.util.StateMachine;
 import com.android.internal.util.WakeupMessage;
 
-import libcore.io.IoBridge;
-
 import java.io.FileDescriptor;
 import java.io.IOException;
 import java.net.Inet4Address;
@@ -108,6 +106,12 @@
     private static final boolean MSG_DBG = false;
     private static final boolean PACKET_DBG = false;
 
+    // Metrics events: must be kept in sync with server-side aggregation code.
+    /** Represents transitions from DhcpInitState to DhcpBoundState */
+    private static final String EVENT_INITIAL_BOUND = "InitialBoundState";
+    /** Represents transitions from and to DhcpBoundState via DhcpRenewingState */
+    private static final String EVENT_RENEWING_BOUND = "RenewingBoundState";
+
     // Timers and timeouts.
     private static final int SECONDS = 1000;
     private static final int FIRST_TIMEOUT_MS   =   2 * SECONDS;
@@ -313,8 +317,8 @@
         try {
             mPacketSock = Os.socket(AF_PACKET, SOCK_RAW, ETH_P_IP);
             SocketAddress addr = makePacketSocketAddress((short) ETH_P_IP, mIface.index);
-            Os.bind(mPacketSock, addr);
-            NetworkUtils.attachDhcpFilter(mPacketSock);
+            SocketUtils.bindSocket(mPacketSock, addr);
+            SocketUtils.attachDhcpFilter(mPacketSock);
         } catch(SocketException|ErrnoException e) {
             Log.e(TAG, "Error creating packet socket", e);
             return false;
@@ -350,15 +354,9 @@
         }
     }
 
-    private static void closeQuietly(FileDescriptor fd) {
-        try {
-            IoBridge.closeAndSignalBlockedThreads(fd);
-        } catch (IOException ignored) {}
-    }
-
     private void closeSockets() {
-        closeQuietly(mUdpSock);
-        closeQuietly(mPacketSock);
+        closeSocketQuietly(mUdpSock);
+        closeSocketQuietly(mPacketSock);
     }
 
     class ReceiveThread extends Thread {
@@ -414,7 +412,8 @@
         try {
             if (encap == DhcpPacket.ENCAP_L2) {
                 if (DBG) Log.d(TAG, "Broadcasting " + description);
-                Os.sendto(mPacketSock, buf.array(), 0, buf.limit(), 0, mInterfaceBroadcastAddr);
+                SocketUtils.sendTo(
+                        mPacketSock, buf.array(), 0, buf.limit(), 0, mInterfaceBroadcastAddr);
             } else if (encap == DhcpPacket.ENCAP_BOOTP && to.equals(INADDR_BROADCAST)) {
                 if (DBG) Log.d(TAG, "Broadcasting " + description);
                 // We only send L3-encapped broadcasts in DhcpRebindingState,
@@ -928,9 +927,9 @@
         private void logTimeToBoundState() {
             long now = SystemClock.elapsedRealtime();
             if (mLastBoundExitTime > mLastInitEnterTime) {
-                logState(DhcpClientEvent.RENEWING_BOUND, (int)(now - mLastBoundExitTime));
+                logState(EVENT_RENEWING_BOUND, (int) (now - mLastBoundExitTime));
             } else {
-                logState(DhcpClientEvent.INITIAL_BOUND, (int)(now - mLastInitEnterTime));
+                logState(EVENT_INITIAL_BOUND, (int) (now - mLastInitEnterTime));
             }
         }
     }
@@ -1021,7 +1020,7 @@
 
             // We need to broadcast and possibly reconnect the socket to a
             // completely different server.
-            closeQuietly(mUdpSock);
+            closeSocketQuietly(mUdpSock);
             if (!initUdpSocket()) {
                 Log.e(TAG, "Failed to recreate UDP socket");
                 transitionTo(mDhcpInitState);
diff --git a/packages/NetworkStack/src/android/net/dhcp/DhcpPacketListener.java b/packages/NetworkStack/src/android/net/dhcp/DhcpPacketListener.java
index dce8b61..96d1a28 100644
--- a/packages/NetworkStack/src/android/net/dhcp/DhcpPacketListener.java
+++ b/packages/NetworkStack/src/android/net/dhcp/DhcpPacketListener.java
@@ -18,7 +18,7 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
-import android.net.util.FdEventsReader;
+import android.net.shared.FdEventsReader;
 import android.os.Handler;
 import android.system.Os;
 
@@ -64,7 +64,7 @@
     @Override
     protected int readPacket(@NonNull FileDescriptor fd, @NonNull Payload packetBuffer)
             throws Exception {
-        final InetSocketAddress addr = new InetSocketAddress();
+        final InetSocketAddress addr = new InetSocketAddress(0);
         final int read = Os.recvfrom(
                 fd, packetBuffer.mBytes, 0, packetBuffer.mBytes.length, 0 /* flags */, addr);
 
diff --git a/packages/NetworkStack/src/android/net/dhcp/DhcpServer.java b/packages/NetworkStack/src/android/net/dhcp/DhcpServer.java
index beabd3e..cd993e9 100644
--- a/packages/NetworkStack/src/android/net/dhcp/DhcpServer.java
+++ b/packages/NetworkStack/src/android/net/dhcp/DhcpServer.java
@@ -28,6 +28,7 @@
 import static android.system.OsConstants.AF_INET;
 import static android.system.OsConstants.IPPROTO_UDP;
 import static android.system.OsConstants.SOCK_DGRAM;
+import static android.system.OsConstants.SOCK_NONBLOCK;
 import static android.system.OsConstants.SOL_SOCKET;
 import static android.system.OsConstants.SO_BROADCAST;
 import static android.system.OsConstants.SO_REUSEADDR;
@@ -43,7 +44,6 @@
 import android.annotation.Nullable;
 import android.net.INetworkStackStatusCallback;
 import android.net.MacAddress;
-import android.net.NetworkUtils;
 import android.net.TrafficStats;
 import android.net.util.SharedLog;
 import android.net.util.SocketUtils;
@@ -207,7 +207,7 @@
         @Override
         public void addArpEntry(@NonNull Inet4Address ipv4Addr, @NonNull MacAddress ethAddr,
                 @NonNull String ifname, @NonNull FileDescriptor fd) throws IOException {
-            NetworkUtils.addArpEntry(ipv4Addr, ethAddr, ifname, fd);
+            SocketUtils.addArpEntry(ipv4Addr, ethAddr, ifname, fd);
         }
 
         @Override
@@ -630,7 +630,7 @@
             // TODO: have and use an API to set a socket tag without going through the thread tag
             final int oldTag = TrafficStats.getAndSetThreadStatsTag(TAG_SYSTEM_DHCP_SERVER);
             try {
-                mSocket = Os.socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+                mSocket = Os.socket(AF_INET, SOCK_DGRAM | SOCK_NONBLOCK, IPPROTO_UDP);
                 SocketUtils.bindSocketToInterface(mSocket, mIfName);
                 Os.setsockoptInt(mSocket, SOL_SOCKET, SO_REUSEADDR, 1);
                 Os.setsockoptInt(mSocket, SOL_SOCKET, SO_BROADCAST, 1);
diff --git a/packages/NetworkStack/src/android/net/dhcp/DhcpServingParams.java b/packages/NetworkStack/src/android/net/dhcp/DhcpServingParams.java
index 31ce95b..3cd2aa4 100644
--- a/packages/NetworkStack/src/android/net/dhcp/DhcpServingParams.java
+++ b/packages/NetworkStack/src/android/net/dhcp/DhcpServingParams.java
@@ -209,7 +209,7 @@
          * but it must always be set explicitly before building the {@link DhcpServingParams}.
          */
         public Builder setDefaultRouters(@NonNull Inet4Address... defaultRouters) {
-            return setDefaultRouters(new ArraySet<>(Arrays.asList(defaultRouters)));
+            return setDefaultRouters(makeArraySet(defaultRouters));
         }
 
         /**
@@ -239,7 +239,7 @@
          * building the {@link DhcpServingParams}.
          */
         public Builder setDnsServers(@NonNull Inet4Address... dnsServers) {
-            return setDnsServers(new ArraySet<>(Arrays.asList(dnsServers)));
+            return setDnsServers(makeArraySet(dnsServers));
         }
 
         /**
@@ -269,7 +269,7 @@
          * and do not need to be set here.
          */
         public Builder setExcludedAddrs(@NonNull Inet4Address... excludedAddrs) {
-            return setExcludedAddrs(new ArraySet<>(Arrays.asList(excludedAddrs)));
+            return setExcludedAddrs(makeArraySet(excludedAddrs));
         }
 
         /**
@@ -368,4 +368,10 @@
     static IpPrefix makeIpPrefix(@NonNull LinkAddress addr) {
         return new IpPrefix(addr.getAddress(), addr.getPrefixLength());
     }
+
+    private static <T> ArraySet<T> makeArraySet(T[] elements) {
+        final ArraySet<T> set = new ArraySet<>(elements.length);
+        set.addAll(Arrays.asList(elements));
+        return set;
+    }
 }
diff --git a/packages/NetworkStack/src/android/net/ip/ConnectivityPacketTracker.java b/packages/NetworkStack/src/android/net/ip/ConnectivityPacketTracker.java
index 385dd52..649257a 100644
--- a/packages/NetworkStack/src/android/net/ip/ConnectivityPacketTracker.java
+++ b/packages/NetworkStack/src/android/net/ip/ConnectivityPacketTracker.java
@@ -20,12 +20,13 @@
 import static android.system.OsConstants.AF_PACKET;
 import static android.system.OsConstants.ARPHRD_ETHER;
 import static android.system.OsConstants.ETH_P_ALL;
+import static android.system.OsConstants.SOCK_NONBLOCK;
 import static android.system.OsConstants.SOCK_RAW;
 
-import android.net.NetworkUtils;
 import android.net.util.ConnectivityPacketSummary;
 import android.net.util.InterfaceParams;
 import android.net.util.PacketReader;
+import android.net.util.SocketUtils;
 import android.os.Handler;
 import android.system.ErrnoException;
 import android.system.Os;
@@ -33,7 +34,7 @@
 import android.util.LocalLog;
 import android.util.Log;
 
-import libcore.util.HexEncoding;
+import com.android.internal.util.HexDump;
 
 import java.io.FileDescriptor;
 import java.io.IOException;
@@ -101,9 +102,10 @@
         protected FileDescriptor createFd() {
             FileDescriptor s = null;
             try {
-                s = Os.socket(AF_PACKET, SOCK_RAW, 0);
-                NetworkUtils.attachControlPacketFilter(s, ARPHRD_ETHER);
-                Os.bind(s, makePacketSocketAddress((short) ETH_P_ALL, mInterface.index));
+                s = Os.socket(AF_PACKET, SOCK_RAW | SOCK_NONBLOCK, 0);
+                SocketUtils.attachControlPacketFilter(s, ARPHRD_ETHER);
+                SocketUtils.bindSocket(
+                        s, makePacketSocketAddress((short) ETH_P_ALL, mInterface.index));
             } catch (ErrnoException | IOException e) {
                 logError("Failed to create packet tracking socket: ", e);
                 closeFd(s);
@@ -119,8 +121,7 @@
             if (summary == null) return;
 
             if (DBG) Log.d(mTag, summary);
-            addLogEntry(summary +
-                        "\n[" + new String(HexEncoding.encode(recvbuf, 0, length)) + "]");
+            addLogEntry(summary + "\n[" + HexDump.toHexString(recvbuf, 0, length) + "]");
         }
 
         @Override
diff --git a/packages/NetworkStack/src/android/net/ip/IpClient.java b/packages/NetworkStack/src/android/net/ip/IpClient.java
index f20e0163..12fe8c5 100644
--- a/packages/NetworkStack/src/android/net/ip/IpClient.java
+++ b/packages/NetworkStack/src/android/net/ip/IpClient.java
@@ -16,6 +16,7 @@
 
 package android.net.ip;
 
+import static android.net.RouteInfo.RTN_UNICAST;
 import static android.net.shared.IpConfigurationParcelableUtil.toStableParcelable;
 import static android.net.shared.LinkPropertiesParcelableUtil.fromStableParcelable;
 import static android.net.shared.LinkPropertiesParcelableUtil.toStableParcelable;
@@ -36,26 +37,21 @@
 import android.net.apf.ApfCapabilities;
 import android.net.apf.ApfFilter;
 import android.net.dhcp.DhcpClient;
-import android.net.ip.IIpClientCallbacks;
 import android.net.metrics.IpConnectivityLog;
 import android.net.metrics.IpManagerEvent;
 import android.net.shared.InitialConfiguration;
-import android.net.shared.NetdService;
 import android.net.shared.ProvisioningConfiguration;
 import android.net.util.InterfaceParams;
 import android.net.util.SharedLog;
 import android.os.ConditionVariable;
-import android.os.INetworkManagementService;
 import android.os.Message;
 import android.os.RemoteException;
-import android.os.ServiceManager;
 import android.os.SystemClock;
 import android.text.TextUtils;
 import android.util.LocalLog;
 import android.util.Log;
 import android.util.SparseArray;
 
-import com.android.internal.R;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.IState;
 import com.android.internal.util.IndentingPrintWriter;
@@ -64,7 +60,7 @@
 import com.android.internal.util.State;
 import com.android.internal.util.StateMachine;
 import com.android.internal.util.WakeupMessage;
-import com.android.server.net.NetlinkTracker;
+import com.android.server.NetworkObserverRegistry;
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
@@ -338,8 +334,9 @@
     private final Dependencies mDependencies;
     private final CountDownLatch mShutdownLatch;
     private final ConnectivityManager mCm;
-    private final INetworkManagementService mNwService;
-    private final NetlinkTracker mNetlinkTracker;
+    private final INetd mNetd;
+    private final NetworkObserverRegistry mObserverRegistry;
+    private final IpClientLinkObserver mLinkObserver;
     private final WakeupMessage mProvisioningTimeoutAlarm;
     private final WakeupMessage mDhcpActionTimeoutAlarm;
     private final SharedLog mLog;
@@ -373,15 +370,6 @@
     private final ConditionVariable mApfDataSnapshotComplete = new ConditionVariable();
 
     public static class Dependencies {
-        public INetworkManagementService getNMS() {
-            return INetworkManagementService.Stub.asInterface(
-                    ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE));
-        }
-
-        public INetd getNetd() {
-            return NetdService.getInstance();
-        }
-
         /**
          * Get interface parameters for the specified interface.
          */
@@ -390,26 +378,14 @@
         }
     }
 
-    public IpClient(Context context, String ifName, IIpClientCallbacks callback) {
-        this(context, ifName, callback, new Dependencies());
-    }
-
-    /**
-     * An expanded constructor, useful for dependency injection.
-     * TODO: migrate all test users to mock IpClient directly and remove this ctor.
-     */
     public IpClient(Context context, String ifName, IIpClientCallbacks callback,
-            INetworkManagementService nwService) {
-        this(context, ifName, callback, new Dependencies() {
-            @Override
-            public INetworkManagementService getNMS() {
-                return nwService;
-            }
-        });
+            NetworkObserverRegistry observerRegistry) {
+        this(context, ifName, callback, observerRegistry, new Dependencies());
     }
 
     @VisibleForTesting
-    IpClient(Context context, String ifName, IIpClientCallbacks callback, Dependencies deps) {
+    IpClient(Context context, String ifName, IIpClientCallbacks callback,
+            NetworkObserverRegistry observerRegistry, Dependencies deps) {
         super(IpClient.class.getSimpleName() + "." + ifName);
         Preconditions.checkNotNull(ifName);
         Preconditions.checkNotNull(callback);
@@ -422,7 +398,7 @@
         mDependencies = deps;
         mShutdownLatch = new CountDownLatch(1);
         mCm = mContext.getSystemService(ConnectivityManager.class);
-        mNwService = deps.getNMS();
+        mObserverRegistry = observerRegistry;
 
         sSmLogs.putIfAbsent(mInterfaceName, new SharedLog(MAX_LOG_RECORDS, mTag));
         mLog = sSmLogs.get(mInterfaceName);
@@ -433,19 +409,15 @@
 
         // TODO: Consider creating, constructing, and passing in some kind of
         // InterfaceController.Dependencies class.
-        mInterfaceCtrl = new InterfaceController(mInterfaceName, deps.getNetd(), mLog);
+        mNetd = mContext.getSystemService(INetd.class);
+        mInterfaceCtrl = new InterfaceController(mInterfaceName, mNetd, mLog);
 
-        mNetlinkTracker = new NetlinkTracker(
+        mLinkObserver = new IpClientLinkObserver(
                 mInterfaceName,
-                new NetlinkTracker.Callback() {
-                    @Override
-                    public void update() {
-                        sendMessage(EVENT_NETLINK_LINKPROPERTIES_CHANGED);
-                    }
-                }) {
+                () -> sendMessage(EVENT_NETLINK_LINKPROPERTIES_CHANGED)) {
             @Override
-            public void interfaceAdded(String iface) {
-                super.interfaceAdded(iface);
+            public void onInterfaceAdded(String iface) {
+                super.onInterfaceAdded(iface);
                 if (mClatInterfaceName.equals(iface)) {
                     mCallback.setNeighborDiscoveryOffload(false);
                 } else if (!mInterfaceName.equals(iface)) {
@@ -457,8 +429,8 @@
             }
 
             @Override
-            public void interfaceRemoved(String iface) {
-                super.interfaceRemoved(iface);
+            public void onInterfaceRemoved(String iface) {
+                super.onInterfaceRemoved(iface);
                 // TODO: Also observe mInterfaceName going down and take some
                 // kind of appropriate action.
                 if (mClatInterfaceName.equals(iface)) {
@@ -570,19 +542,11 @@
     }
 
     private void startStateMachineUpdaters() {
-        try {
-            mNwService.registerObserver(mNetlinkTracker);
-        } catch (RemoteException e) {
-            logError("Couldn't register NetlinkTracker: %s", e);
-        }
+        mObserverRegistry.registerObserverForNonblockingCallback(mLinkObserver);
     }
 
     private void stopStateMachineUpdaters() {
-        try {
-            mNwService.unregisterObserver(mNetlinkTracker);
-        } catch (RemoteException e) {
-            logError("Couldn't unregister NetlinkTracker: %s", e);
-        }
+        mObserverRegistry.unregisterObserver(mLinkObserver);
     }
 
     @Override
@@ -805,7 +769,7 @@
     // we should only call this if we know for sure that there are no IP addresses
     // assigned to the interface, etc.
     private void resetLinkProperties() {
-        mNetlinkTracker.clearLinkProperties();
+        mLinkObserver.clearLinkProperties();
         mConfiguration = null;
         mDhcpResults = null;
         mTcpBufferSizes = "";
@@ -984,10 +948,10 @@
         //         - IPv6 DNS servers
         //
         // N.B.: this is fundamentally race-prone and should be fixed by
-        // changing NetlinkTracker from a hybrid edge/level model to an
+        // changing IpClientLinkObserver from a hybrid edge/level model to an
         // edge-only model, or by giving IpClient its own netlink socket(s)
         // so as to track all required information directly.
-        LinkProperties netlinkLinkProperties = mNetlinkTracker.getLinkProperties();
+        LinkProperties netlinkLinkProperties = mLinkObserver.getLinkProperties();
         newLp.setLinkAddresses(netlinkLinkProperties.getLinkAddresses());
         for (RouteInfo route : netlinkLinkProperties.getRoutes()) {
             newLp.addRoute(route);
@@ -1027,7 +991,7 @@
             // specified in the InitialConfiguration have been observed with Netlink.
             if (config.isProvisionedBy(newLp.getLinkAddresses(), null)) {
                 for (IpPrefix prefix : config.directlyConnectedRoutes) {
-                    newLp.addRoute(new RouteInfo(prefix, null, mInterfaceName));
+                    newLp.addRoute(new RouteInfo(prefix, null, mInterfaceName, RTN_UNICAST));
                 }
             }
             addAllReachableDnsServers(newLp, config.dnsServers);
@@ -1128,7 +1092,7 @@
         // If we have a StaticIpConfiguration attempt to apply it and
         // handle the result accordingly.
         if (mConfiguration.mStaticIpConfig != null) {
-            if (mInterfaceCtrl.setIPv4Address(mConfiguration.mStaticIpConfig.ipAddress)) {
+            if (mInterfaceCtrl.setIPv4Address(mConfiguration.mStaticIpConfig.getIpAddress())) {
                 handleIPv4Success(new DhcpResults(mConfiguration.mStaticIpConfig));
             } else {
                 return false;
@@ -1166,8 +1130,7 @@
             // necessary or does reading from settings at startup suffice?).
             final int numSolicits = 5;
             final int interSolicitIntervalMs = 750;
-            setNeighborParameters(mDependencies.getNetd(), mInterfaceName,
-                    numSolicits, interSolicitIntervalMs);
+            setNeighborParameters(mNetd, mInterfaceName, numSolicits, interSolicitIntervalMs);
         } catch (Exception e) {
             mLog.e("Failed to adjust neighbor parameters", e);
             // Carry on using the system defaults (currently: 3, 1000);
@@ -1384,10 +1347,8 @@
             apfConfig.apfCapabilities = mConfiguration.mApfCapabilities;
             apfConfig.multicastFilter = mMulticastFiltering;
             // Get the Configuration for ApfFilter from Context
-            apfConfig.ieee802_3Filter =
-                    mContext.getResources().getBoolean(R.bool.config_apfDrop802_3Frames);
-            apfConfig.ethTypeBlackList =
-                    mContext.getResources().getIntArray(R.array.config_apfEthTypeBlackList);
+            apfConfig.ieee802_3Filter = ApfCapabilities.getApfDrop8023Frames(mContext);
+            apfConfig.ethTypeBlackList = ApfCapabilities.getApfEthTypeBlackList(mContext);
             mApfFilter = ApfFilter.maybeCreate(mContext, apfConfig, mInterfaceParams, mCallback);
             // TODO: investigate the effects of any multicast filtering racing/interfering with the
             // rest of this IP configuration startup.
diff --git a/packages/NetworkStack/src/android/net/ip/IpClientLinkObserver.java b/packages/NetworkStack/src/android/net/ip/IpClientLinkObserver.java
new file mode 100644
index 0000000..8ad99aa0
--- /dev/null
+++ b/packages/NetworkStack/src/android/net/ip/IpClientLinkObserver.java
@@ -0,0 +1,378 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.ip;
+
+import android.net.InetAddresses;
+import android.net.LinkAddress;
+import android.net.LinkProperties;
+import android.net.RouteInfo;
+import android.util.Log;
+
+import com.android.server.NetworkObserver;
+
+import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Keeps track of link configuration received from Netd.
+ *
+ * An instance of this class is constructed by passing in an interface name and a callback. The
+ * owner is then responsible for registering the tracker with NetworkObserverRegistry. When the
+ * class receives update notifications, it applies the update to its local LinkProperties, and if
+ * something has changed, notifies its owner of the update via the callback.
+ *
+ * The owner can then call {@code getLinkProperties()} in order to find out
+ * what changed. If in the meantime the LinkProperties stored here have changed,
+ * this class will return the current LinkProperties. Because each change
+ * triggers an update callback after the change is made, the owner may get more
+ * callbacks than strictly necessary (some of which may be no-ops), but will not
+ * be out of sync once all callbacks have been processed.
+ *
+ * Threading model:
+ *
+ * - The owner of this class is expected to create it, register it, and call
+ *   getLinkProperties or clearLinkProperties on its thread.
+ * - Most of the methods in the class are implementing NetworkObserver and are called
+ *   on the handler used to register the observer.
+ * - All accesses to mLinkProperties must be synchronized(this). All the other
+ *   member variables are immutable once the object is constructed.
+ *
+ * @hide
+ */
+public class IpClientLinkObserver implements NetworkObserver {
+    private final String mTag;
+
+    /**
+     * Callback used by {@link IpClientLinkObserver} to send update notifications.
+     */
+    public interface Callback {
+        /**
+         * Called when some properties of the link were updated.
+         */
+        void update();
+    }
+
+    private final String mInterfaceName;
+    private final Callback mCallback;
+    private final LinkProperties mLinkProperties;
+    private DnsServerRepository mDnsServerRepository;
+
+    private static final boolean DBG = false;
+
+    public IpClientLinkObserver(String iface, Callback callback) {
+        mTag = "NetlinkTracker/" + iface;
+        mInterfaceName = iface;
+        mCallback = callback;
+        mLinkProperties = new LinkProperties();
+        mLinkProperties.setInterfaceName(mInterfaceName);
+        mDnsServerRepository = new DnsServerRepository();
+    }
+
+    private void maybeLog(String operation, String iface, LinkAddress address) {
+        if (DBG) {
+            Log.d(mTag, operation + ": " + address + " on " + iface
+                    + " flags " + address.getFlags() + " scope " + address.getScope());
+        }
+    }
+
+    private void maybeLog(String operation, Object o) {
+        if (DBG) {
+            Log.d(mTag, operation + ": " + o.toString());
+        }
+    }
+
+    @Override
+    public void onInterfaceRemoved(String iface) {
+        maybeLog("interfaceRemoved", iface);
+        if (mInterfaceName.equals(iface)) {
+            // Our interface was removed. Clear our LinkProperties and tell our owner that they are
+            // now empty. Note that from the moment that the interface is removed, any further
+            // interface-specific messages (e.g., RTM_DELADDR) will not reach us, because the netd
+            // code that parses them will not be able to resolve the ifindex to an interface name.
+            clearLinkProperties();
+            mCallback.update();
+        }
+    }
+
+    @Override
+    public void onInterfaceAddressUpdated(LinkAddress address, String iface) {
+        if (mInterfaceName.equals(iface)) {
+            maybeLog("addressUpdated", iface, address);
+            boolean changed;
+            synchronized (this) {
+                changed = mLinkProperties.addLinkAddress(address);
+            }
+            if (changed) {
+                mCallback.update();
+            }
+        }
+    }
+
+    @Override
+    public void onInterfaceAddressRemoved(LinkAddress address, String iface) {
+        if (mInterfaceName.equals(iface)) {
+            maybeLog("addressRemoved", iface, address);
+            boolean changed;
+            synchronized (this) {
+                changed = mLinkProperties.removeLinkAddress(address);
+            }
+            if (changed) {
+                mCallback.update();
+            }
+        }
+    }
+
+    @Override
+    public void onRouteUpdated(RouteInfo route) {
+        if (mInterfaceName.equals(route.getInterface())) {
+            maybeLog("routeUpdated", route);
+            boolean changed;
+            synchronized (this) {
+                changed = mLinkProperties.addRoute(route);
+            }
+            if (changed) {
+                mCallback.update();
+            }
+        }
+    }
+
+    @Override
+    public void onRouteRemoved(RouteInfo route) {
+        if (mInterfaceName.equals(route.getInterface())) {
+            maybeLog("routeRemoved", route);
+            boolean changed;
+            synchronized (this) {
+                changed = mLinkProperties.removeRoute(route);
+            }
+            if (changed) {
+                mCallback.update();
+            }
+        }
+    }
+
+    @Override
+    public void onInterfaceDnsServerInfo(String iface, long lifetime, String[] addresses) {
+        if (mInterfaceName.equals(iface)) {
+            maybeLog("interfaceDnsServerInfo", Arrays.toString(addresses));
+            boolean changed = mDnsServerRepository.addServers(lifetime, addresses);
+            if (changed) {
+                synchronized (this) {
+                    mDnsServerRepository.setDnsServersOn(mLinkProperties);
+                }
+                mCallback.update();
+            }
+        }
+    }
+
+    /**
+     * Returns a copy of this object's LinkProperties.
+     */
+    public synchronized LinkProperties getLinkProperties() {
+        return new LinkProperties(mLinkProperties);
+    }
+
+    /**
+     * Reset this object's LinkProperties.
+     */
+    public synchronized void clearLinkProperties() {
+        // Clear the repository before clearing mLinkProperties. That way, if a clear() happens
+        // while interfaceDnsServerInfo() is being called, we'll end up with no DNS servers in
+        // mLinkProperties, as desired.
+        mDnsServerRepository = new DnsServerRepository();
+        mLinkProperties.clear();
+        mLinkProperties.setInterfaceName(mInterfaceName);
+    }
+
+    /**
+     * Tracks DNS server updates received from Netlink.
+     *
+     * The network may announce an arbitrary number of DNS servers in Router Advertisements at any
+     * time. Each announcement has a lifetime; when the lifetime expires, the servers should not be
+     * used any more. In this way, the network can gracefully migrate clients from one set of DNS
+     * servers to another. Announcements can both raise and lower the lifetime, and an announcement
+     * can expire servers by announcing them with a lifetime of zero.
+     *
+     * Typically the system will only use a small number (2 or 3; {@code NUM_CURRENT_SERVERS}) of
+     * DNS servers at any given time. These are referred to as the current servers. In case all the
+     * current servers expire, the class also keeps track of a larger (but limited) number of
+     * servers that are promoted to current servers when the current ones expire. In order to
+     * minimize updates to the rest of the system (and potentially expensive cache flushes) this
+     * class attempts to keep the list of current servers constant where possible. More
+     * specifically, the list of current servers is only updated if a new server is learned and
+     * there are not yet {@code NUM_CURRENT_SERVERS} current servers, or if one or more of the
+     * current servers expires or is pushed out of the set. Therefore, the current servers will not
+     * necessarily be the ones with the highest lifetime, but the ones learned first.
+     *
+     * This is by design: if instead the class always preferred the servers with the highest
+     * lifetime, a (misconfigured?) network where two or more routers announce more than
+     * {@code NUM_CURRENT_SERVERS} unique servers would cause persistent oscillations.
+     *
+     * TODO: Currently servers are only expired when a new DNS update is received.
+     * Update them using timers, or possibly on every notification received by NetlinkTracker.
+     *
+     * Threading model: run by NetlinkTracker. Methods are synchronized(this) just in case netlink
+     * notifications are sent by multiple threads. If future threads use alarms to expire, those
+     * alarms must also be synchronized(this).
+     *
+     */
+    private static class DnsServerRepository {
+
+        /** How many DNS servers we will use. 3 is suggested by RFC 6106. */
+        static final int NUM_CURRENT_SERVERS = 3;
+
+        /** How many DNS servers we'll keep track of, in total. */
+        static final int NUM_SERVERS = 12;
+
+        /** Stores up to {@code NUM_CURRENT_SERVERS} DNS servers we're currently using. */
+        private Set<InetAddress> mCurrentServers;
+
+        public static final String TAG = "DnsServerRepository";
+
+        /**
+         * Stores all the DNS servers we know about, for use when the current servers expire.
+         * Always sorted in order of decreasing expiry. The elements in this list are also the
+         * values of mIndex, and may be elements in mCurrentServers.
+         */
+        private ArrayList<DnsServerEntry> mAllServers;
+
+        /**
+         * Indexes the servers so we can update their lifetimes more quickly in the common case
+         * where servers are not being added, but only being refreshed.
+         */
+        private HashMap<InetAddress, DnsServerEntry> mIndex;
+
+        DnsServerRepository() {
+            mCurrentServers = new HashSet<>();
+            mAllServers = new ArrayList<>(NUM_SERVERS);
+            mIndex = new HashMap<>(NUM_SERVERS);
+        }
+
+        /** Sets the DNS servers of the provided LinkProperties object to the current servers. */
+        public synchronized void setDnsServersOn(LinkProperties lp) {
+            lp.setDnsServers(mCurrentServers);
+        }
+
+        /**
+         * Notifies the class of new DNS server information.
+         * @param lifetime the time in seconds that the DNS servers are valid.
+         * @param addresses the string representations of the IP addresses of DNS servers to use.
+         */
+        public synchronized boolean addServers(long lifetime, String[] addresses) {
+            // The lifetime is actually an unsigned 32-bit number, but Java doesn't have unsigned.
+            // Technically 0xffffffff (the maximum) is special and means "forever", but 2^32 seconds
+            // (136 years) is close enough.
+            long now = System.currentTimeMillis();
+            long expiry = now + 1000 * lifetime;
+
+            // Go through the list of servers. For each one, update the entry if one exists, and
+            // create one if it doesn't.
+            for (String addressString : addresses) {
+                InetAddress address;
+                try {
+                    address = InetAddresses.parseNumericAddress(addressString);
+                } catch (IllegalArgumentException ex) {
+                    continue;
+                }
+
+                if (!updateExistingEntry(address, expiry)) {
+                    // There was no entry for this server. Create one, unless it's already expired
+                    // (i.e., if the lifetime is zero; it cannot be < 0 because it's unsigned).
+                    if (expiry > now) {
+                        DnsServerEntry entry = new DnsServerEntry(address, expiry);
+                        mAllServers.add(entry);
+                        mIndex.put(address, entry);
+                    }
+                }
+            }
+
+            // Sort the servers by expiry.
+            Collections.sort(mAllServers);
+
+            // Prune excess entries and update the current server list.
+            return updateCurrentServers();
+        }
+
+        private synchronized boolean updateExistingEntry(InetAddress address, long expiry) {
+            DnsServerEntry existing = mIndex.get(address);
+            if (existing != null) {
+                existing.expiry = expiry;
+                return true;
+            }
+            return false;
+        }
+
+        private synchronized boolean updateCurrentServers() {
+            long now = System.currentTimeMillis();
+            boolean changed = false;
+
+            // Prune excess or expired entries.
+            for (int i = mAllServers.size() - 1; i >= 0; i--) {
+                if (i >= NUM_SERVERS || mAllServers.get(i).expiry < now) {
+                    DnsServerEntry removed = mAllServers.remove(i);
+                    mIndex.remove(removed.address);
+                    changed |= mCurrentServers.remove(removed.address);
+                } else {
+                    break;
+                }
+            }
+
+            // Add servers to the current set, in order of decreasing lifetime, until it has enough.
+            // Prefer existing servers over new servers in order to minimize updates to the rest of
+            // the system and avoid persistent oscillations.
+            for (DnsServerEntry entry : mAllServers) {
+                if (mCurrentServers.size() < NUM_CURRENT_SERVERS) {
+                    changed |= mCurrentServers.add(entry.address);
+                } else {
+                    break;
+                }
+            }
+            return changed;
+        }
+    }
+
+    /**
+     * Represents a DNS server entry with an expiry time.
+     *
+     * Implements Comparable so DNS server entries can be sorted by lifetime, longest-lived first.
+     * The ordering of entries with the same lifetime is unspecified, because given two servers with
+     * identical lifetimes, we don't care which one we use, and only comparing the lifetime is much
+     * faster than comparing the IP address as well.
+     *
+     * Note: this class has a natural ordering that is inconsistent with equals.
+     */
+    private static class DnsServerEntry implements Comparable<DnsServerEntry> {
+        /** The IP address of the DNS server. */
+        public final InetAddress address;
+        /** The time until which the DNS server may be used. A Java millisecond time as might be
+         * returned by currentTimeMillis(). */
+        public long expiry;
+
+        DnsServerEntry(InetAddress address, long expiry) throws IllegalArgumentException {
+            this.address = address;
+            this.expiry = expiry;
+        }
+
+        public int compareTo(DnsServerEntry other) {
+            return Long.compare(other.expiry, this.expiry);
+        }
+    }
+}
diff --git a/packages/NetworkStack/src/android/net/ip/IpNeighborMonitor.java b/packages/NetworkStack/src/android/net/ip/IpNeighborMonitor.java
index 2e6ff24..b29d617 100644
--- a/packages/NetworkStack/src/android/net/ip/IpNeighborMonitor.java
+++ b/packages/NetworkStack/src/android/net/ip/IpNeighborMonitor.java
@@ -20,6 +20,10 @@
 import static android.net.netlink.NetlinkConstants.hexify;
 import static android.net.netlink.NetlinkConstants.stringForNlMsgType;
 import static android.net.util.SocketUtils.makeNetlinkSocketAddress;
+import static android.system.OsConstants.AF_NETLINK;
+import static android.system.OsConstants.NETLINK_ROUTE;
+import static android.system.OsConstants.SOCK_DGRAM;
+import static android.system.OsConstants.SOCK_NONBLOCK;
 
 import android.net.MacAddress;
 import android.net.netlink.NetlinkErrorMessage;
@@ -27,8 +31,10 @@
 import android.net.netlink.NetlinkSocket;
 import android.net.netlink.RtNetlinkNeighborMessage;
 import android.net.netlink.StructNdMsg;
+import android.net.util.NetworkStackUtils;
 import android.net.util.PacketReader;
 import android.net.util.SharedLog;
+import android.net.util.SocketUtils;
 import android.os.Handler;
 import android.os.SystemClock;
 import android.system.ErrnoException;
@@ -36,8 +42,6 @@
 import android.system.OsConstants;
 import android.util.Log;
 
-import libcore.io.IoUtils;
-
 import java.io.FileDescriptor;
 import java.net.InetAddress;
 import java.net.SocketAddress;
@@ -77,7 +81,7 @@
                 1, ip, StructNdMsg.NUD_PROBE, ifIndex, null);
 
         try {
-            NetlinkSocket.sendOneShotKernelMessage(OsConstants.NETLINK_ROUTE, msg);
+            NetlinkSocket.sendOneShotKernelMessage(NETLINK_ROUTE, msg);
         } catch (ErrnoException e) {
             Log.e(TAG, "Error " + msgSnippet + ": " + e);
             return -e.errno;
@@ -145,8 +149,8 @@
         FileDescriptor fd = null;
 
         try {
-            fd = NetlinkSocket.forProto(OsConstants.NETLINK_ROUTE);
-            Os.bind(fd, makeNetlinkSocketAddress(0, OsConstants.RTMGRP_NEIGH));
+            fd = Os.socket(AF_NETLINK, SOCK_DGRAM | SOCK_NONBLOCK, NETLINK_ROUTE);
+            SocketUtils.bindSocket(fd, makeNetlinkSocketAddress(0, OsConstants.RTMGRP_NEIGH));
             NetlinkSocket.connectToKernel(fd);
 
             if (VDBG) {
@@ -155,7 +159,7 @@
             }
         } catch (ErrnoException|SocketException e) {
             logError("Failed to create rtnetlink socket", e);
-            IoUtils.closeQuietly(fd);
+            NetworkStackUtils.closeSocketQuietly(fd);
             return null;
         }
 
diff --git a/packages/NetworkStack/src/android/net/util/NetworkStackUtils.java b/packages/NetworkStack/src/android/net/util/NetworkStackUtils.java
index 6dcf0c0..98123a5 100644
--- a/packages/NetworkStack/src/android/net/util/NetworkStackUtils.java
+++ b/packages/NetworkStack/src/android/net/util/NetworkStackUtils.java
@@ -16,6 +16,9 @@
 
 package android.net.util;
 
+import java.io.FileDescriptor;
+import java.io.IOException;
+
 /**
  * Collection of utilities for the network stack.
  */
@@ -27,4 +30,14 @@
     public static <T> boolean isEmpty(T[] array) {
         return array == null || array.length == 0;
     }
+
+    /**
+     * Close a socket, ignoring any exception while closing.
+     */
+    public static void closeSocketQuietly(FileDescriptor fd) {
+        try {
+            SocketUtils.closeSocket(fd);
+        } catch (IOException ignored) {
+        }
+    }
 }
diff --git a/packages/NetworkStack/src/android/net/util/PacketReader.java b/packages/NetworkStack/src/android/net/util/PacketReader.java
index 4aec6b6..94b1e9f 100644
--- a/packages/NetworkStack/src/android/net/util/PacketReader.java
+++ b/packages/NetworkStack/src/android/net/util/PacketReader.java
@@ -18,6 +18,7 @@
 
 import static java.lang.Math.max;
 
+import android.net.shared.FdEventsReader;
 import android.os.Handler;
 import android.system.Os;
 
diff --git a/packages/NetworkStack/src/com/android/server/NetworkObserver.java b/packages/NetworkStack/src/com/android/server/NetworkObserver.java
index d3b40a6..cccec0b 100644
--- a/packages/NetworkStack/src/com/android/server/NetworkObserver.java
+++ b/packages/NetworkStack/src/com/android/server/NetworkObserver.java
@@ -17,6 +17,7 @@
 package com.android.server;
 
 import android.net.LinkAddress;
+import android.net.RouteInfo;
 
 /**
  * Observer for network events, to use with {@link NetworkObserverRegistry}.
@@ -77,11 +78,11 @@
      * @see android.net.INetdUnsolicitedEventListener
      *          #onRouteChanged(boolean, String, String, String)
      */
-    default void onRouteUpdated(String route, String gateway, String ifName) {}
+    default void onRouteUpdated(RouteInfo route) {}
 
     /**
      * @see android.net.INetdUnsolicitedEventListener
      *          #onRouteChanged(boolean, String, String, String)
      */
-    default void onRouteRemoved(String route, String gateway, String ifName) {}
+    default void onRouteRemoved(RouteInfo route) {}
 }
diff --git a/packages/NetworkStack/src/com/android/server/NetworkObserverRegistry.java b/packages/NetworkStack/src/com/android/server/NetworkObserverRegistry.java
index 14e6c5f..6fb4b0d 100644
--- a/packages/NetworkStack/src/com/android/server/NetworkObserverRegistry.java
+++ b/packages/NetworkStack/src/com/android/server/NetworkObserverRegistry.java
@@ -15,14 +15,21 @@
  */
 package com.android.server;
 
+import static android.net.RouteInfo.RTN_UNICAST;
+
 import android.annotation.NonNull;
 import android.net.INetd;
 import android.net.INetdUnsolicitedEventListener;
+import android.net.InetAddresses;
+import android.net.IpPrefix;
 import android.net.LinkAddress;
+import android.net.RouteInfo;
 import android.os.Handler;
 import android.os.RemoteException;
+import android.util.Log;
 
 import java.util.Map;
+import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 
 /**
@@ -32,6 +39,7 @@
  * all INetworkManagementEventObserver objects that have registered with it.
  */
 public class NetworkObserverRegistry extends INetdUnsolicitedEventListener.Stub {
+    private static final String TAG = NetworkObserverRegistry.class.getSimpleName();
 
     /**
      * Constructs a new NetworkObserverRegistry.
@@ -50,7 +58,7 @@
         netd.registerUnsolicitedEventListener(this);
     }
 
-    private final ConcurrentHashMap<NetworkObserver, Handler> mObservers =
+    private final ConcurrentHashMap<NetworkObserver, Optional<Handler>> mObservers =
             new ConcurrentHashMap<>();
 
     /**
@@ -58,7 +66,20 @@
      * This method may be called on any thread.
      */
     public void registerObserver(@NonNull NetworkObserver observer, @NonNull Handler handler) {
-        mObservers.put(observer, handler);
+        if (handler == null) {
+            throw new IllegalArgumentException("handler must be non-null");
+        }
+        mObservers.put(observer, Optional.of(handler));
+    }
+
+    /**
+     * Registers the specified observer, and start sending callbacks to it.
+     *
+     * <p>This method must only be called with callbacks that are nonblocking, such as callbacks
+     * that only send a message to a StateMachine.
+     */
+    public void registerObserverForNonblockingCallback(@NonNull NetworkObserver observer) {
+        mObservers.put(observer, Optional.empty());
     }
 
     /**
@@ -77,9 +98,19 @@
     private void invokeForAllObservers(@NonNull final NetworkObserverEventCallback callback) {
         // ConcurrentHashMap#entrySet is weakly consistent: observers that were in the map before
         // creation will be processed, those added during traversal may or may not.
-        for (Map.Entry<NetworkObserver, Handler> entry : mObservers.entrySet()) {
+        for (Map.Entry<NetworkObserver, Optional<Handler>> entry : mObservers.entrySet()) {
             final NetworkObserver observer = entry.getKey();
-            entry.getValue().post(() -> callback.sendCallback(observer));
+            final Optional<Handler> handler = entry.getValue();
+            if (handler.isPresent()) {
+                handler.get().post(() -> callback.sendCallback(observer));
+                return;
+            }
+
+            try {
+                callback.sendCallback(observer);
+            } catch (RuntimeException e) {
+                Log.e(TAG, "Error sending callback to observer", e);
+            }
         }
     }
 
@@ -138,10 +169,13 @@
 
     @Override
     public void onRouteChanged(boolean updated, String route, String gateway, String ifName) {
+        final RouteInfo processRoute = new RouteInfo(new IpPrefix(route),
+                ("".equals(gateway)) ? null : InetAddresses.parseNumericAddress(gateway),
+                ifName, RTN_UNICAST);
         if (updated) {
-            invokeForAllObservers(o -> o.onRouteUpdated(route, gateway, ifName));
+            invokeForAllObservers(o -> o.onRouteUpdated(processRoute));
         } else {
-            invokeForAllObservers(o -> o.onRouteRemoved(route, gateway, ifName));
+            invokeForAllObservers(o -> o.onRouteRemoved(processRoute));
         }
     }
 
diff --git a/packages/NetworkStack/src/com/android/server/NetworkStackService.java b/packages/NetworkStack/src/com/android/server/NetworkStackService.java
index 631ee45..cedcb84 100644
--- a/packages/NetworkStack/src/com/android/server/NetworkStackService.java
+++ b/packages/NetworkStack/src/com/android/server/NetworkStackService.java
@@ -19,6 +19,7 @@
 import static android.net.dhcp.IDhcpServer.STATUS_INVALID_ARGUMENT;
 import static android.net.dhcp.IDhcpServer.STATUS_SUCCESS;
 import static android.net.dhcp.IDhcpServer.STATUS_UNKNOWN_ERROR;
+import static android.net.shared.NetworkParcelableUtil.fromStableParcelable;
 
 import static com.android.server.util.PermissionUtil.checkDumpPermission;
 import static com.android.server.util.PermissionUtil.checkNetworkStackCallingPermission;
@@ -34,7 +35,7 @@
 import android.net.INetworkMonitorCallbacks;
 import android.net.INetworkStackConnector;
 import android.net.Network;
-import android.net.NetworkRequest;
+import android.net.NetworkParcelable;
 import android.net.PrivateDnsConfigParcel;
 import android.net.dhcp.DhcpServer;
 import android.net.dhcp.DhcpServingParams;
@@ -117,7 +118,11 @@
             mObserverRegistry = new NetworkObserverRegistry();
             mCm = context.getSystemService(ConnectivityManager.class);
 
-            // TODO: call mObserverRegistry here after adding sepolicy changes
+            try {
+                mObserverRegistry.register(mNetd);
+            } catch (RemoteException e) {
+                mLog.e("Error registering observer on Netd", e);
+            }
         }
 
         @NonNull
@@ -146,19 +151,18 @@
         }
 
         @Override
-        public void makeNetworkMonitor(int netId, String name, INetworkMonitorCallbacks cb)
+        public void makeNetworkMonitor(
+                NetworkParcelable network, String name, INetworkMonitorCallbacks cb)
                 throws RemoteException {
-            final Network network = new Network(netId, false /* privateDnsBypass */);
-            final NetworkRequest defaultRequest = mCm.getDefaultRequest();
-            final SharedLog log = addValidationLogs(network, name);
-            final NetworkMonitor nm = new NetworkMonitor(
-                    mContext, cb, network, defaultRequest, log);
+            final Network parsedNetwork = fromStableParcelable(network);
+            final SharedLog log = addValidationLogs(parsedNetwork, name);
+            final NetworkMonitor nm = new NetworkMonitor(mContext, cb, parsedNetwork, log);
             cb.onNetworkMonitorCreated(new NetworkMonitorImpl(nm));
         }
 
         @Override
         public void makeIpClient(String ifName, IIpClientCallbacks cb) throws RemoteException {
-            final IpClient ipClient = new IpClient(mContext, ifName, cb);
+            final IpClient ipClient = new IpClient(mContext, ifName, cb, mObserverRegistry);
 
             synchronized (mIpClients) {
                 final Iterator<WeakReference<IpClient>> it = mIpClients.iterator();
diff --git a/packages/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java b/packages/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java
index 96eaa50..dbffa6d 100644
--- a/packages/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java
+++ b/packages/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java
@@ -47,7 +47,6 @@
 import android.net.LinkProperties;
 import android.net.Network;
 import android.net.NetworkCapabilities;
-import android.net.NetworkRequest;
 import android.net.ProxyInfo;
 import android.net.TrafficStats;
 import android.net.Uri;
@@ -110,6 +109,8 @@
     private static final boolean DBG  = true;
     private static final boolean VDBG = false;
     private static final boolean VDBG_STALL = Log.isLoggable(TAG, Log.DEBUG);
+    // TODO: use another permission for CaptivePortalLoginActivity once it has its own certificate
+    private static final String PERMISSION_NETWORK_SETTINGS = "android.permission.NETWORK_SETTINGS";
     // Default configuration values for captive portal detection probes.
     // TODO: append a random length parameter to the default HTTPS url.
     // TODO: randomize browser version ids in the default User-Agent String.
@@ -310,14 +311,14 @@
     private long mLastProbeTime;
 
     public NetworkMonitor(Context context, INetworkMonitorCallbacks cb, Network network,
-            NetworkRequest defaultRequest, SharedLog validationLog) {
-        this(context, cb, network, defaultRequest, new IpConnectivityLog(), validationLog,
+            SharedLog validationLog) {
+        this(context, cb, network, new IpConnectivityLog(), validationLog,
                 Dependencies.DEFAULT);
     }
 
     @VisibleForTesting
     protected NetworkMonitor(Context context, INetworkMonitorCallbacks cb, Network network,
-            NetworkRequest defaultRequest, IpConnectivityLog logger, SharedLog validationLogs,
+            IpConnectivityLog logger, SharedLog validationLogs,
             Dependencies deps) {
         // Add suffix indicating which NetworkMonitor we're talking about.
         super(TAG + "/" + network.toString());
@@ -369,8 +370,7 @@
         // we can ever fetch them.
         // TODO: Delete ASAP.
         mLinkProperties = new LinkProperties();
-        mNetworkCapabilities = new NetworkCapabilities();
-        mNetworkCapabilities.clearAll();
+        mNetworkCapabilities = new NetworkCapabilities(null);
     }
 
     /**
@@ -684,11 +684,20 @@
                                 public void appResponse(int response) {
                                     if (response == APP_RETURN_WANTED_AS_IS) {
                                         mContext.enforceCallingPermission(
-                                                android.Manifest.permission.CONNECTIVITY_INTERNAL,
+                                                PERMISSION_NETWORK_SETTINGS,
                                                 "CaptivePortal");
                                     }
                                     sendMessage(CMD_CAPTIVE_PORTAL_APP_FINISHED, response);
                                 }
+
+                                @Override
+                                public void logEvent(int eventId, String packageName)
+                                        throws RemoteException {
+                                    mContext.enforceCallingPermission(
+                                            PERMISSION_NETWORK_SETTINGS,
+                                            "CaptivePortal");
+                                    mCallback.logCaptivePortalLoginEvent(eventId, packageName);
+                                }
                             }));
                     final CaptivePortalProbeResult probeRes = mLastPortalProbeResult;
                     intent.putExtra(EXTRA_CAPTIVE_PORTAL_URL, probeRes.detectUrl);
diff --git a/packages/NetworkStack/src/com/android/server/util/PermissionUtil.java b/packages/NetworkStack/src/com/android/server/util/PermissionUtil.java
index 82bf038..f6eb900 100644
--- a/packages/NetworkStack/src/com/android/server/util/PermissionUtil.java
+++ b/packages/NetworkStack/src/com/android/server/util/PermissionUtil.java
@@ -19,6 +19,7 @@
 import static android.os.Binder.getCallingUid;
 
 import android.os.Process;
+import android.os.UserHandle;
 
 /**
  * Utility class to check calling permissions on the network stack.
@@ -32,7 +33,7 @@
     public static void checkNetworkStackCallingPermission() {
         // TODO: check that the calling PID is the system server.
         final int caller = getCallingUid();
-        if (caller != Process.SYSTEM_UID && caller != Process.BLUETOOTH_UID) {
+        if (caller != Process.SYSTEM_UID && UserHandle.getAppId(caller) != Process.BLUETOOTH_UID) {
             throw new SecurityException("Invalid caller: " + caller);
         }
     }
diff --git a/packages/NetworkStack/tests/src/android/net/ip/IpClientTest.java b/packages/NetworkStack/tests/src/android/net/ip/IpClientTest.java
index 4ae044de..7e57d1e 100644
--- a/packages/NetworkStack/tests/src/android/net/ip/IpClientTest.java
+++ b/packages/NetworkStack/tests/src/android/net/ip/IpClientTest.java
@@ -46,7 +46,6 @@
 import android.net.shared.InitialConfiguration;
 import android.net.shared.ProvisioningConfiguration;
 import android.net.util.InterfaceParams;
-import android.os.INetworkManagementService;
 import android.provider.Settings;
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
@@ -54,7 +53,8 @@
 
 import com.android.internal.R;
 import com.android.internal.util.test.FakeSettingsProvider;
-import com.android.server.net.BaseNetworkObserver;
+import com.android.server.NetworkObserver;
+import com.android.server.NetworkObserverRegistry;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -87,15 +87,15 @@
 
     @Mock private Context mContext;
     @Mock private ConnectivityManager mCm;
-    @Mock private INetworkManagementService mNMService;
+    @Mock private NetworkObserverRegistry mObserverRegistry;
     @Mock private INetd mNetd;
     @Mock private Resources mResources;
     @Mock private IIpClientCallbacks mCb;
     @Mock private AlarmManager mAlarm;
-    @Mock private IpClient.Dependencies mDependecies;
+    @Mock private IpClient.Dependencies mDependencies;
     private MockContentResolver mContentResolver;
 
-    private BaseNetworkObserver mObserver;
+    private NetworkObserver mObserver;
     private InterfaceParams mIfParams;
 
     @Before
@@ -104,6 +104,7 @@
 
         when(mContext.getSystemService(eq(Context.ALARM_SERVICE))).thenReturn(mAlarm);
         when(mContext.getSystemService(eq(ConnectivityManager.class))).thenReturn(mCm);
+        when(mContext.getSystemService(INetd.class)).thenReturn(mNetd);
         when(mContext.getResources()).thenReturn(mResources);
         when(mResources.getInteger(R.integer.config_networkAvoidBadWifi))
                 .thenReturn(DEFAULT_AVOIDBADWIFI_CONFIG_VALUE);
@@ -113,28 +114,24 @@
         when(mContext.getContentResolver()).thenReturn(mContentResolver);
 
         mIfParams = null;
-
-        when(mDependecies.getNMS()).thenReturn(mNMService);
-        when(mDependecies.getNetd()).thenReturn(mNetd);
     }
 
     private void setTestInterfaceParams(String ifname) {
         mIfParams = (ifname != null)
                 ? new InterfaceParams(ifname, TEST_IFINDEX, TEST_MAC)
                 : null;
-        when(mDependecies.getInterfaceParams(anyString())).thenReturn(mIfParams);
+        when(mDependencies.getInterfaceParams(anyString())).thenReturn(mIfParams);
     }
 
     private IpClient makeIpClient(String ifname) throws Exception {
         setTestInterfaceParams(ifname);
-        final IpClient ipc = new IpClient(mContext, ifname, mCb, mDependecies);
+        final IpClient ipc = new IpClient(mContext, ifname, mCb, mObserverRegistry, mDependencies);
         verify(mNetd, timeout(TEST_TIMEOUT_MS).times(1)).interfaceSetEnableIPv6(ifname, false);
         verify(mNetd, timeout(TEST_TIMEOUT_MS).times(1)).interfaceClearAddrs(ifname);
-        ArgumentCaptor<BaseNetworkObserver> arg =
-                ArgumentCaptor.forClass(BaseNetworkObserver.class);
-        verify(mNMService, times(1)).registerObserver(arg.capture());
+        ArgumentCaptor<NetworkObserver> arg = ArgumentCaptor.forClass(NetworkObserver.class);
+        verify(mObserverRegistry, times(1)).registerObserverForNonblockingCallback(arg.capture());
         mObserver = arg.getValue();
-        reset(mNMService);
+        reset(mObserverRegistry);
         reset(mNetd);
         // Verify IpClient doesn't call onLinkPropertiesChange() when it starts.
         verify(mCb, never()).onLinkPropertiesChange(any());
@@ -152,7 +149,8 @@
     public void testNullInterfaceNameMostDefinitelyThrows() throws Exception {
         setTestInterfaceParams(null);
         try {
-            final IpClient ipc = new IpClient(mContext, null, mCb, mDependecies);
+            final IpClient ipc = new IpClient(
+                    mContext, null, mCb, mObserverRegistry, mDependencies);
             ipc.shutdown();
             fail();
         } catch (NullPointerException npe) {
@@ -165,7 +163,8 @@
         final String ifname = "lo";
         setTestInterfaceParams(ifname);
         try {
-            final IpClient ipc = new IpClient(mContext, ifname, null, mDependecies);
+            final IpClient ipc = new IpClient(
+                    mContext, ifname, null, mObserverRegistry, mDependencies);
             ipc.shutdown();
             fail();
         } catch (NullPointerException npe) {
@@ -176,14 +175,16 @@
     @Test
     public void testInvalidInterfaceDoesNotThrow() throws Exception {
         setTestInterfaceParams(TEST_IFNAME);
-        final IpClient ipc = new IpClient(mContext, TEST_IFNAME, mCb, mDependecies);
+        final IpClient ipc = new IpClient(
+                mContext, TEST_IFNAME, mCb, mObserverRegistry, mDependencies);
         ipc.shutdown();
     }
 
     @Test
     public void testInterfaceNotFoundFailsImmediately() throws Exception {
         setTestInterfaceParams(null);
-        final IpClient ipc = new IpClient(mContext, TEST_IFNAME, mCb, mDependecies);
+        final IpClient ipc = new IpClient(
+                mContext, TEST_IFNAME, mCb, mObserverRegistry, mDependencies);
         ipc.startProvisioning(new ProvisioningConfiguration());
         verify(mCb, times(1)).onProvisioningFailure(any());
         ipc.shutdown();
@@ -247,13 +248,13 @@
 
         // Add N - 1 addresses
         for (int i = 0; i < lastAddr; i++) {
-            mObserver.addressUpdated(iface, new LinkAddress(addresses[i]));
+            mObserver.onInterfaceAddressUpdated(new LinkAddress(addresses[i]), iface);
             verify(mCb, timeout(TEST_TIMEOUT_MS)).onLinkPropertiesChange(any());
             reset(mCb);
         }
 
         // Add Nth address
-        mObserver.addressUpdated(iface, new LinkAddress(addresses[lastAddr]));
+        mObserver.onInterfaceAddressUpdated(new LinkAddress(addresses[lastAddr]), iface);
         LinkProperties want = linkproperties(links(addresses), routes(prefixes));
         want.setInterfaceName(iface);
         verify(mCb, timeout(TEST_TIMEOUT_MS).times(1)).onProvisioningSuccess(argThat(
diff --git a/packages/NetworkStack/tests/src/android/net/util/PacketReaderTest.java b/packages/NetworkStack/tests/src/android/net/util/PacketReaderTest.java
index dced743..6e11c40 100644
--- a/packages/NetworkStack/tests/src/android/net/util/PacketReaderTest.java
+++ b/packages/NetworkStack/tests/src/android/net/util/PacketReaderTest.java
@@ -17,7 +17,13 @@
 package android.net.util;
 
 import static android.net.util.PacketReader.DEFAULT_RECV_BUF_SIZE;
-import static android.system.OsConstants.*;
+import static android.system.OsConstants.AF_INET6;
+import static android.system.OsConstants.IPPROTO_UDP;
+import static android.system.OsConstants.SOCK_DGRAM;
+import static android.system.OsConstants.SOCK_NONBLOCK;
+import static android.system.OsConstants.SOL_SOCKET;
+import static android.system.OsConstants.SO_SNDTIMEO;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -31,10 +37,12 @@
 import android.system.Os;
 import android.system.StructTimeval;
 
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 import java.io.FileDescriptor;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.UncheckedIOException;
 import java.net.DatagramPacket;
 import java.net.DatagramSocket;
 import java.net.Inet6Address;
@@ -45,13 +53,6 @@
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
-import org.junit.runner.RunWith;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import libcore.io.IoBridge;
-
 /**
  * Tests for PacketReader.
  *
@@ -80,7 +81,7 @@
         protected FileDescriptor createFd() {
             FileDescriptor s = null;
             try {
-                s = Os.socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
+                s = Os.socket(AF_INET6, SOCK_DGRAM | SOCK_NONBLOCK, IPPROTO_UDP);
                 Os.bind(s, LOOPBACK6, 0);
                 mLocalSockName = (InetSocketAddress) Os.getsockname(s);
                 Os.setsockoptTimeval(s, SOL_SOCKET, SO_SNDTIMEO, TIMEO);
diff --git a/packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java b/packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java
index d31fa77..d11bb64 100644
--- a/packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java
+++ b/packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java
@@ -21,7 +21,6 @@
 import static android.net.INetworkMonitor.NETWORK_TEST_RESULT_INVALID;
 import static android.net.INetworkMonitor.NETWORK_TEST_RESULT_VALID;
 import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
-import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED;
 
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertFalse;
@@ -51,7 +50,6 @@
 import android.net.Network;
 import android.net.NetworkCapabilities;
 import android.net.NetworkInfo;
-import android.net.NetworkRequest;
 import android.net.captiveportal.CaptivePortalProbeResult;
 import android.net.metrics.IpConnectivityLog;
 import android.net.util.SharedLog;
@@ -103,7 +101,6 @@
     private @Mock NetworkMonitor.Dependencies mDependencies;
     private @Mock INetworkMonitorCallbacks mCallbacks;
     private @Spy Network mNetwork = new Network(TEST_NETID);
-    private NetworkRequest mRequest;
 
     private static final int TEST_NETID = 4242;
 
@@ -178,10 +175,6 @@
                 InetAddresses.parseNumericAddress("192.168.0.0")
         }).when(mNetwork).getAllByName(any());
 
-        mRequest = new NetworkRequest.Builder()
-                .addCapability(NET_CAPABILITY_INTERNET)
-                .addCapability(NET_CAPABILITY_NOT_RESTRICTED)
-                .build();
         // Default values. Individual tests can override these.
         when(mCm.getLinkProperties(any())).thenReturn(TEST_LINKPROPERTIES);
         when(mCm.getNetworkCapabilities(any())).thenReturn(METERED_CAPABILITIES);
@@ -195,9 +188,9 @@
     private class WrappedNetworkMonitor extends NetworkMonitor {
         private long mProbeTime = 0;
 
-        WrappedNetworkMonitor(Context context, Network network, NetworkRequest defaultRequest,
-                IpConnectivityLog logger, Dependencies deps) {
-                super(context, mCallbacks, network, defaultRequest, logger,
+        WrappedNetworkMonitor(Context context, Network network, IpConnectivityLog logger,
+                Dependencies deps) {
+                super(context, mCallbacks, network, logger,
                         new SharedLog("test_nm"), deps);
         }
 
@@ -213,7 +206,7 @@
 
     private WrappedNetworkMonitor makeMeteredWrappedNetworkMonitor() {
         final WrappedNetworkMonitor nm = new WrappedNetworkMonitor(
-                mContext, mNetwork, mRequest, mLogger, mDependencies);
+                mContext, mNetwork, mLogger, mDependencies);
         when(mCm.getNetworkCapabilities(any())).thenReturn(METERED_CAPABILITIES);
         nm.start();
         waitForIdle(nm.getHandler());
@@ -222,7 +215,7 @@
 
     private WrappedNetworkMonitor makeNotMeteredWrappedNetworkMonitor() {
         final WrappedNetworkMonitor nm = new WrappedNetworkMonitor(
-                mContext, mNetwork, mRequest, mLogger, mDependencies);
+                mContext, mNetwork, mLogger, mDependencies);
         when(mCm.getNetworkCapabilities(any())).thenReturn(NOT_METERED_CAPABILITIES);
         nm.start();
         waitForIdle(nm.getHandler());
@@ -231,7 +224,7 @@
 
     private NetworkMonitor makeMonitor() {
         final NetworkMonitor nm = new NetworkMonitor(
-                mContext, mCallbacks, mNetwork, mRequest, mLogger, mValidationLogger,
+                mContext, mCallbacks, mNetwork, mLogger, mValidationLogger,
                 mDependencies);
         nm.start();
         waitForIdle(nm.getHandler());
diff --git a/packages/NetworkStackPermissionStub/Android.bp b/packages/NetworkStackPermissionStub/Android.bp
new file mode 100644
index 0000000..94870c9
--- /dev/null
+++ b/packages/NetworkStackPermissionStub/Android.bp
@@ -0,0 +1,27 @@
+//
+// Copyright (C) 2019 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+// Stub APK to define permissions for NetworkStack
+android_app {
+    name: "NetworkStackPermissionStub",
+    // TODO: mark app as hasCode=false in manifest once soong stops complaining about apps without
+    // a classes.dex.
+    srcs: ["src/**/*.java"],
+    platform_apis: true,
+    certificate: "platform",
+    privileged: true,
+    manifest: "AndroidManifest.xml",
+}
diff --git a/packages/NetworkStackPermissionStub/AndroidManifest.xml b/packages/NetworkStackPermissionStub/AndroidManifest.xml
new file mode 100644
index 0000000..2ccf5ff
--- /dev/null
+++ b/packages/NetworkStackPermissionStub/AndroidManifest.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.mainline.networkstack.permissionstub">
+    <!--
+    This package only exists to define the below permissions, and enforce that they are only
+    granted to apps sharing the same signature.
+    Permissions defined here are intended to be used only by the NetworkStack: both
+    NetworkStack and this stub APK are to be signed with a dedicated certificate to ensure
+    that, with the below permissions being signature permissions.
+
+    This APK *must* be installed, even if the NetworkStack app is not installed, because otherwise,
+    any application will be able to define this permission and the system will give that application
+    full access to the network stack.
+     -->
+    <permission android:name="android.permission.MAINLINE_NETWORK_STACK"
+                android:protectionLevel="signature"/>
+
+    <application android:name="com.android.server.NetworkStackPermissionStub"/>
+</manifest>
\ No newline at end of file
diff --git a/packages/NetworkStackPermissionStub/src/com/android/server/NetworkStackPermissionStub.java b/packages/NetworkStackPermissionStub/src/com/android/server/NetworkStackPermissionStub.java
new file mode 100644
index 0000000..01e59d2
--- /dev/null
+++ b/packages/NetworkStackPermissionStub/src/com/android/server/NetworkStackPermissionStub.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server;
+
+import android.app.Application;
+
+/**
+ * Empty application for NetworkStackStub that only exists because soong builds complain if APKs
+ * have no source file.
+ */
+public class NetworkStackPermissionStub extends Application {
+}
diff --git a/packages/PrintSpooler/src/com/android/printspooler/widget/PrintContentView.java b/packages/PrintSpooler/src/com/android/printspooler/widget/PrintContentView.java
index 8b00ed0..00b3736 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/widget/PrintContentView.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/widget/PrintContentView.java
@@ -23,6 +23,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.inputmethod.InputMethodManager;
+
 import com.android.printspooler.R;
 
 /**
@@ -366,7 +367,8 @@
             // and is janky. Now it is there but transparent, doing nothing.
             mEmbeddedContentScrim.setOnClickListener(null);
             mEmbeddedContentScrim.setClickable(false);
-            mExpandCollapseIcon.setBackgroundResource(R.drawable.ic_expand_more);
+            mExpandCollapseIcon.setBackgroundResource(
+                    com.android.internal.R.drawable.ic_expand_more);
         } else {
             if (mMoreOptionsButton.getVisibility() != View.GONE) {
                 mMoreOptionsButton.setVisibility(View.VISIBLE);
diff --git a/packages/SettingsLib/ActionBarShadow/Android.bp b/packages/SettingsLib/ActionBarShadow/Android.bp
new file mode 100644
index 0000000..d284856
--- /dev/null
+++ b/packages/SettingsLib/ActionBarShadow/Android.bp
@@ -0,0 +1,14 @@
+android_library {
+    name: "SettingsLibActionBarShadow",
+
+    srcs: ["src/**/*.java"],
+
+    static_libs: [
+        "androidx.annotation_annotation",
+        "androidx.lifecycle_lifecycle-runtime",
+        "androidx.recyclerview_recyclerview",
+    ],
+
+    sdk_version: "system_current",
+    min_sdk_version: "21",
+}
diff --git a/packages/SettingsLib/ActionBarShadow/AndroidManifest.xml b/packages/SettingsLib/ActionBarShadow/AndroidManifest.xml
new file mode 100644
index 0000000..4b9f1ab
--- /dev/null
+++ b/packages/SettingsLib/ActionBarShadow/AndroidManifest.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2018 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="com.android.settingslib.widget">
+
+    <uses-sdk android:minSdkVersion="21" />
+
+</manifest>
diff --git a/packages/SettingsLib/ActionBarShadow/src/com/android/settingslib/widget/ActionBarShadowController.java b/packages/SettingsLib/ActionBarShadow/src/com/android/settingslib/widget/ActionBarShadowController.java
new file mode 100644
index 0000000..be3365f
--- /dev/null
+++ b/packages/SettingsLib/ActionBarShadow/src/com/android/settingslib/widget/ActionBarShadowController.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.widget;
+
+import static androidx.lifecycle.Lifecycle.Event.ON_START;
+import static androidx.lifecycle.Lifecycle.Event.ON_STOP;
+
+import android.app.ActionBar;
+import android.app.Activity;
+import android.view.View;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleObserver;
+import androidx.lifecycle.OnLifecycleEvent;
+
+/**
+ * UI controller that adds a shadow appear/disappear animation to action bar scroll.
+ */
+public class ActionBarShadowController implements LifecycleObserver {
+
+    @VisibleForTesting
+    static final float ELEVATION_HIGH = 8;
+    @VisibleForTesting
+    static final float ELEVATION_LOW = 0;
+
+    @VisibleForTesting
+    ScrollChangeWatcher mScrollChangeWatcher;
+    private View mScrollView;
+    private boolean mIsScrollWatcherAttached;
+
+    /**
+     * Wire up the animation to to an {@link Activity}. Shadow will be applied to activity's
+     * action bar.
+     */
+    public static ActionBarShadowController attachToView(
+            Activity activity, Lifecycle lifecycle, View scrollView) {
+        return new ActionBarShadowController(activity, lifecycle, scrollView);
+    }
+
+    /**
+     * Wire up the animation to to a {@link View}. Shadow will be applied to the view.
+     */
+    public static ActionBarShadowController attachToView(
+            View anchorView, Lifecycle lifecycle, View scrollView) {
+        return new ActionBarShadowController(anchorView, lifecycle, scrollView);
+    }
+
+    private ActionBarShadowController(Activity activity, Lifecycle lifecycle, View scrollView) {
+        mScrollChangeWatcher = new ActionBarShadowController.ScrollChangeWatcher(activity);
+        mScrollView = scrollView;
+        attachScrollWatcher();
+        lifecycle.addObserver(this);
+    }
+
+    private ActionBarShadowController(View anchorView, Lifecycle lifecycle, View scrollView) {
+        mScrollChangeWatcher = new ActionBarShadowController.ScrollChangeWatcher(anchorView);
+        mScrollView = scrollView;
+        attachScrollWatcher();
+        lifecycle.addObserver(this);
+    }
+
+    @OnLifecycleEvent(ON_START)
+    private void attachScrollWatcher() {
+        if (!mIsScrollWatcherAttached) {
+            mIsScrollWatcherAttached = true;
+            mScrollView.setOnScrollChangeListener(mScrollChangeWatcher);
+            mScrollChangeWatcher.updateDropShadow(mScrollView);
+        }
+    }
+
+    @OnLifecycleEvent(ON_STOP)
+    private void detachScrollWatcher() {
+        mScrollView.setOnScrollChangeListener(null);
+        mIsScrollWatcherAttached = false;
+    }
+
+    /**
+     * Update the drop shadow as the scrollable entity is scrolled.
+     */
+    final class ScrollChangeWatcher implements View.OnScrollChangeListener {
+
+        private final Activity mActivity;
+        private final View mAnchorView;
+
+        ScrollChangeWatcher(Activity activity) {
+            mActivity = activity;
+            mAnchorView = null;
+        }
+
+        ScrollChangeWatcher(View anchorView) {
+            mAnchorView = anchorView;
+            mActivity = null;
+        }
+
+        @Override
+        public void onScrollChange(View view, int scrollX, int scrollY, int oldScrollX,
+                int oldScrollY) {
+            updateDropShadow(view);
+        }
+
+        public void updateDropShadow(View view) {
+            final boolean shouldShowShadow = view.canScrollVertically(-1);
+            if (mAnchorView != null) {
+                mAnchorView.setElevation(shouldShowShadow ? ELEVATION_HIGH : ELEVATION_LOW);
+            } else if (mActivity != null) { // activity can become null when running monkey
+                final ActionBar actionBar = mActivity.getActionBar();
+                if (actionBar != null) {
+                    actionBar.setElevation(shouldShowShadow ? ELEVATION_HIGH : ELEVATION_LOW);
+                }
+            }
+        }
+    }
+}
diff --git a/packages/SettingsLib/Android.bp b/packages/SettingsLib/Android.bp
index 2321790..5a81f8b 100644
--- a/packages/SettingsLib/Android.bp
+++ b/packages/SettingsLib/Android.bp
@@ -13,6 +13,7 @@
 
         "SettingsLibHelpUtils",
         "SettingsLibRestrictedLockUtils",
+        "SettingsLibActionBarShadow",
         "SettingsLibAppPreference",
         "SettingsLibSearchWidget",
         "SettingsLibSettingsSpinner",
diff --git a/packages/SettingsLib/OWNERS b/packages/SettingsLib/OWNERS
index d188c65..d879087 100644
--- a/packages/SettingsLib/OWNERS
+++ b/packages/SettingsLib/OWNERS
@@ -4,7 +4,7 @@
 dehboxturtle@google.com
 dhnishi@google.com
 dling@google.com
-dsandler@google.com
+dsandler@android.com
 evanlaird@google.com
 jackqdyulei@google.com
 jmonk@google.com
diff --git a/packages/SettingsLib/SearchWidget/res/values-es-rUS/strings.xml b/packages/SettingsLib/SearchWidget/res/values-es-rUS/strings.xml
index 40a8fd0..3ca1a56 100644
--- a/packages/SettingsLib/SearchWidget/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/SearchWidget/res/values-es-rUS/strings.xml
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="search_menu" msgid="1604061903696928905">"Configuración de búsqueda"</string>
+    <string name="search_menu" msgid="1604061903696928905">"Buscar en la configuración"</string>
 </resources>
diff --git a/packages/SettingsLib/SearchWidget/res/values-fr/strings.xml b/packages/SettingsLib/SearchWidget/res/values-fr/strings.xml
index e065fa0..6c6413a 100644
--- a/packages/SettingsLib/SearchWidget/res/values-fr/strings.xml
+++ b/packages/SettingsLib/SearchWidget/res/values-fr/strings.xml
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="search_menu" msgid="1604061903696928905">"Paramètres de recherche"</string>
+    <string name="search_menu" msgid="1604061903696928905">"Rechercher dans les paramètres"</string>
 </resources>
diff --git a/packages/SettingsLib/SearchWidget/res/values-gl/strings.xml b/packages/SettingsLib/SearchWidget/res/values-gl/strings.xml
index 4e30f8c..e9e1ae8 100644
--- a/packages/SettingsLib/SearchWidget/res/values-gl/strings.xml
+++ b/packages/SettingsLib/SearchWidget/res/values-gl/strings.xml
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="search_menu" msgid="1604061903696928905">"Configuración de busca"</string>
+    <string name="search_menu" msgid="1604061903696928905">"Buscar na configuración"</string>
 </resources>
diff --git a/packages/SettingsLib/SearchWidget/res/values-it/strings.xml b/packages/SettingsLib/SearchWidget/res/values-it/strings.xml
index c59db23..a051f98 100644
--- a/packages/SettingsLib/SearchWidget/res/values-it/strings.xml
+++ b/packages/SettingsLib/SearchWidget/res/values-it/strings.xml
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="search_menu" msgid="1604061903696928905">"Impostazioni di ricerca"</string>
+    <string name="search_menu" msgid="1604061903696928905">"Cerca nelle impostazioni"</string>
 </resources>
diff --git a/packages/SettingsLib/SearchWidget/res/values-iw/strings.xml b/packages/SettingsLib/SearchWidget/res/values-iw/strings.xml
index 671f69a..1d4a80c 100644
--- a/packages/SettingsLib/SearchWidget/res/values-iw/strings.xml
+++ b/packages/SettingsLib/SearchWidget/res/values-iw/strings.xml
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="search_menu" msgid="1604061903696928905">"הגדרות חיפוש"</string>
+    <string name="search_menu" msgid="1604061903696928905">"חיפוש בהגדרות"</string>
 </resources>
diff --git a/packages/SettingsLib/SearchWidget/res/values-pt-rBR/strings.xml b/packages/SettingsLib/SearchWidget/res/values-pt-rBR/strings.xml
index f406bc1..d215d78 100644
--- a/packages/SettingsLib/SearchWidget/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/SearchWidget/res/values-pt-rBR/strings.xml
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="search_menu" msgid="1604061903696928905">"Configurações de pesquisa"</string>
+    <string name="search_menu" msgid="1604061903696928905">"Pesquisar em Configurações"</string>
 </resources>
diff --git a/packages/SettingsLib/SearchWidget/res/values-pt/strings.xml b/packages/SettingsLib/SearchWidget/res/values-pt/strings.xml
index f406bc1..d215d78 100644
--- a/packages/SettingsLib/SearchWidget/res/values-pt/strings.xml
+++ b/packages/SettingsLib/SearchWidget/res/values-pt/strings.xml
@@ -17,5 +17,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="search_menu" msgid="1604061903696928905">"Configurações de pesquisa"</string>
+    <string name="search_menu" msgid="1604061903696928905">"Pesquisar em Configurações"</string>
 </resources>
diff --git a/packages/SettingsLib/res/drawable/ic_info_outline_24dp.xml b/packages/SettingsLib/res/drawable/ic_info_outline_24dp.xml
deleted file mode 100644
index 46b8309..0000000
--- a/packages/SettingsLib/res/drawable/ic_info_outline_24dp.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2016 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
-        android:tint="?android:attr/textColorSecondary">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M11,7h2v2h-2z"/>
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M11,11h2v6h-2z"/>
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10s10,-4.48 10,-10C22,6.48 17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8c0,-4.41 3.59,-8 8,-8s8,3.59 8,8C20,16.41 16.41,20 12,20z"/>
-</vector>
diff --git a/packages/SettingsLib/res/drawable/ic_landscape_from_auto_rotate.xml b/packages/SettingsLib/res/drawable/ic_landscape_from_auto_rotate.xml
deleted file mode 100644
index 44b1866..0000000
--- a/packages/SettingsLib/res/drawable/ic_landscape_from_auto_rotate.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:name="ic_rotate_to_landscape"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportHeight="24.0"
-    android:viewportWidth="24.0"
-    android:tint="?android:attr/colorControlNormal" >
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M12.72,23H11C5.49,23 1,18.51 1,13h2c0,3.78 2.63,6.95 6.15,7.79L8.13,19L9.87,18L12.72,23zM13,1h-1.72l2.85,5L15.87,5l-1.02,-1.79C18.37,4.05 21,7.22 21,11h2C23,5.49 18.51,1 13,1zM10.23,6L18,13.76L13.77,18L6,10.24L10.23,6C10.23,6 10.23,6 10.23,6M10.23,4C9.72,4 9.21,4.2 8.82,4.59L4.59,8.82c-0.78,0.78 -0.78,2.04 0,2.82l7.77,7.77c0.39,0.39 0.9,0.59 1.41,0.59c0.51,0 1.02,-0.2 1.41,-0.59l4.24,-4.24c0.78,-0.78 0.78,-2.04 0,-2.82l-7.77,-7.77C11.26,4.2 10.75,4 10.23,4L10.23,4z"/>
-</vector>
diff --git a/packages/SettingsLib/res/drawable/notification_auto_importance.xml b/packages/SettingsLib/res/drawable/notification_auto_importance.xml
deleted file mode 100644
index c946153..0000000
--- a/packages/SettingsLib/res/drawable/notification_auto_importance.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-    Copyright (C) 2016 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
-    <path
-            android:fillColor="#FFFFFFFF"
-            android:pathData="M10.8,12.7l2.4,0l-1.2,-3.7z"/>
-    <path
-            android:fillColor="#FF000000"
-            android:pathData="M12,2C6.5,2 2,6.5 2,12s4.5,10 10,10s10,-4.5 10,-10S17.5,2 12,2zM14.3,16l-0.7,-2h-3.2l-0.7,2H7.8L11,7h2l3.2,9H14.3z"/>
-</vector>
\ No newline at end of file
diff --git a/packages/SettingsLib/res/layout/zen_mode_condition.xml b/packages/SettingsLib/res/layout/zen_mode_condition.xml
index c85a892..3222174 100644
--- a/packages/SettingsLib/res/layout/zen_mode_condition.xml
+++ b/packages/SettingsLib/res/layout/zen_mode_condition.xml
@@ -67,7 +67,7 @@
         android:layout_toStartOf="@android:id/button2"
         android:contentDescription="@string/accessibility_manual_zen_less_time"
         android:tint="?android:attr/colorAccent"
-        android:src="@drawable/ic_minus" />
+        android:src="@*android:drawable/ic_minus" />
 
     <ImageView
         android:id="@android:id/button2"
@@ -79,6 +79,6 @@
         android:layout_centerVertical="true"
         android:contentDescription="@string/accessibility_manual_zen_more_time"
         android:tint="?android:attr/colorAccent"
-        android:src="@drawable/ic_plus" />
+        android:src="@*android:drawable/ic_plus" />
 
-</RelativeLayout>
\ No newline at end of file
+</RelativeLayout>
diff --git a/packages/SettingsLib/res/values-af/arrays.xml b/packages/SettingsLib/res/values-af/arrays.xml
index 04917cd..5a96a58 100644
--- a/packages/SettingsLib/res/values-af/arrays.xml
+++ b/packages/SettingsLib/res/values-af/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Gebruik HDCP-kontrolering net vir DRM-inhoud"</item>
     <item msgid="45075631231212732">"Gebruik altyd HDCP-kontrolering"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (verstek)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index 080fcc2..0e46f61 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Outomaties deur %1$s gekoppel"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Outomaties deur netwerkgraderingverskaffer gekoppel"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Gekoppel via %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> deur <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Beskikbaar via %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Tik om op te stel"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Gekoppel, geen internet nie"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Geen internet nie"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Aanmelding word vereis"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Toegangspunt is tydelik vol"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Gekoppel via %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Beskikbaar via %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Kon nie koppel nie"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Ongeldige OSU-bediener-URL"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU-bediener kon nie koppel nie"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU-bediener kon nie gestaaf word nie"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Ongeldige OSU-bedienersertifikaat"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Opstelling is gestaak"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Opstelling is nie beskikbaar nie"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Ongeldige OSU-bediener-URL"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Onvoorsiene beveltipe"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Onvoorsiene SOAP-boodskapsoort"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP-boodskappe kon nie uitgeruil word nie"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Herlei-luisteraar kon nie begin nie"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Wagperiode vir herleiding het uitgetel"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Geen OSU-aktiwiteit gekry nie"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Onvoorsiene SOAP-boodskapstatus"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Kon nie PPS-MO kry nie"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Kon nie vertroue-kernnodus vir AAA-bediener kry nie"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Kon nie vertroue-kernnodus vir regstellingbediener kry nie"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Kon nie vertroue-kernnodus vir beleidbediener kry nie"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Kon nie vertroue-kernsertifikate ophaal nie"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Kon nie vertroue-kernsertifikaat vir AAA-bediener kry nie"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Kon nie PassPoint-opstelling byvoeg nie"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Kon nie \'n OSU-verskaffer kry nie"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Koppel tans"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Gekoppel"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Koppel tans aan OSU-bediener"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU-bediener is gestaaf"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Gekoppel aan OSU-bediener"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Aanvanklike SOAP-uitruiling"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Wag tans vir herlei-reaksie"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Het herlei-antwoord ontvang"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Tweede SOAP-uitruiling"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Derde SOAP-uitruiling"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Haal tans vertroue-kernsertifikate op"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Opstelling is voltooi"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Baie stadig"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Stadig"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Bly wakker"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Skerm sal nooit slaap terwyl dit laai nie"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Aktiveer Bluetooth HCI-loerloglêer"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Vang alle Bluetooth HCI-pakkette in \'n lêer vas (Wissel Bluetooth nadat jy hierdie instelling verander het)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM-ontsluit"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Laat toe dat die selflaaiprogram ontsluit word"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Laat OEM-ontsluit toe?"</string>
diff --git a/packages/SettingsLib/res/values-am/arrays.xml b/packages/SettingsLib/res/values-am/arrays.xml
index d7866da..b1acfb7 100644
--- a/packages/SettingsLib/res/values-am/arrays.xml
+++ b/packages/SettingsLib/res/values-am/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"ለDRM ይዘት ብቻ HDCP  ምልከታን ተጠቀም"</item>
     <item msgid="45075631231212732">"ሁልጊዜ የHDCP ምልከታ ተጠቀም"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (ነባሪ)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index 53d1c4d..2304908 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"በ%1$s በኩል በራስ-ሰር ተገናኝቷል"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"በአውታረ መረብ ደረጃ ሰጪ አቅራቢ በኩል በራስ-ሰር ተገናኝቷል"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"በ%1$s በኩል መገናኘት"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> በ<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"በ%1$s በኩል የሚገኝ"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"ለማዋቀር መታ ያድርጉ"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"ተገናኝቷል፣ ምንም በይነመረብ የለም"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"ምንም በይነመረብ የለም"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"ወደ መለያ መግባት ያስፈልጋል"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"የመዳረሻ ነጥብ ለጊዜው ሞልቷል"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"በ%1$s በኩል ተገናኝቷል"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"በ%1$s በኩል የሚገኝ"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"ግንኙነት አልተሳካም"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"ልክ ያልኾነ OSU አገልጋይ ዩአርኤል"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU አገልጋይ ግንኙነት አልተሳካም"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU አገልጋይ ማረጋገጥ አልተሳካም"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"ልክ ያልኾነ OSU አገልጋይ ዩአርኤል"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"በባለቤትነት መያዝ ተጨናግፏል"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"በባለቤትነት መያዝ አይገኝም"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"ልክ ያልኾነ OSU አገልጋይ ዩአርኤል"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"ያልተጠበቀ የትዕዛዝ ዓይነት"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"ያልተጠበቀ SOAP መልዕክት ዓይነት"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP መልዕክት ልውውጥ አልተሳካም"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"አቅጣጫ ቀይር አዳማጭ መጀመር አልቻለም"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"አቅጣጫን ቀይርን መጠበቅ ጊዜው አብቅቷል"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"ምንም የOSU እንቅስቃሴ አልተገኘም"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"ያልተጠበቀ SOAP መልዕክት ሁኔታ"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO ማግኘት አልተሳካም"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"ለAAA አገልጋይ የታመነ የሥር እስር ማግኘት አልተቻለም"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"ለማስተካከያ አገልጋይ የታመነ የሥር እስር ማግኘት አልተቻለም"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"ለመመሪያ አገልጋይ የታመነ የሥር እስር ማግኘት አልተቻለም"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"የሥር እውቅና ማረጋገጫን ሰርስሮ ማውጣት አልተቻለም"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"ለ AAA አገልጋይ የሥር እውቅና ማረጋገጫ ማግኘት አልተሳካም"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"PassPointን ውቅረት ማከል አልተሳካም"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"የOSU አቅራቢን ማግኘት አልተሳካም"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"በመገናኘት ላይ"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"ተገናኝቷል"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"ወደ OSU አገልጋይ በማገናኘት ላይ"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU አገልጋይ ተረጋግጧል"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"ወደ OSU አገልጋይ ተገናኝቷል"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"የመጀመሪያ SOAP ልውውጥ"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"ለአቅጣጫ ቀይር ምላሽ በመጠባበቅ ላይ"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"የአቅጣጫ ቀይር ምላሽ ተቀብሏል"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"ሁለተኛ SOAP ልውውጥ"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"ሦስተኛ SOAP ልውውጥ"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"የሥር እውቅና ማረጋገጫዎችን ሰርስሮ በማውጣት ላይ"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"በባለቤትነት መያዝ ተጠናቋል"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"በጣም ቀርፋፋ"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"አዘግይ"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"እሺ"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"ነቅተህ ቆይ"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"ማያኃይል በመሙላት ላይበፍፁም አይተኛም"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"የብሉቱዝ HCI ስለላ ምዝግብ ማስታወሻን ያንቁ"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"በአንድ ፋይል ውስጥ ያሉት ሁሉንም የብሉቱዝ HCI ጥቅሎች ይቅረጹ (ይህን ቅንብር ከቀየሩ በኋላ ብሉቱዝን ይቀይሩ)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM መክፈቻ"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"የማስነሻ ተሸካሚ እንዲከፈት ፍቀድ"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"የOEM መክፈቻ ይፈቀድ?"</string>
diff --git a/packages/SettingsLib/res/values-ar/arrays.xml b/packages/SettingsLib/res/values-ar/arrays.xml
index f17c74c..49a080e 100644
--- a/packages/SettingsLib/res/values-ar/arrays.xml
+++ b/packages/SettingsLib/res/values-ar/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"‏استخدام التحقق من HDCP لمحتوى DRM فقط"</item>
     <item msgid="45075631231212732">"‏استخدام التحقق من HDCP دومًا"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"‏AVRCP 1.4 (التلقائي)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 81755a7..09cf925 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"‏تم الاتصال تلقائيًا عبر %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"تم الاتصال تلقائيًا عبر مقدم خدمة تقييم الشبكة"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"‏تم الاتصال عبر %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> بواسطة <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"‏متوفرة عبر %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"انقر للإعداد."</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"متصلة ولكن بلا إنترنت"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"لا يتوفر اتصال إنترنت."</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"يلزم تسجيل الدخول"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"نقطة الدخول ممتلئة مؤقتًا"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"‏تم الاتصال عبر %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"‏متوفرة عبر %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"تعذّر الاتصال"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"‏عنوان URL لخادم OSU غير صالح"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"‏تعذّر الاتصال بخادم OSU"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"‏تعذّر التحقق من خادم OSU"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"‏شهادة خادم OSU غير صالحة"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"تم إلغاء إدارة الحسابات"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"إدارة الحسابات غير متاحة"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"‏عنوان URL لخادم OSU غير صالح"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"نوع الطلب غير متوقّع"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"‏نوع رسالة SOAP غير متوقّع"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"‏تعذّر تبادل رسالة SOAP"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"تعذّر تشغيل إعادة توجيه المستمع"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"انتهت مهلة انتظار إعادة التوجيه"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"‏لم يتم العثور على نشاط OSU"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"‏حالة رسالة SOAP غير متوقعة"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"‏تعذّر العثور على PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"‏تعذّر العثور على عقدة جذر الثقة لخادم AAA"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"تعذّر العثور على عقدة جذر الثقة لخادم المعالجة"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"تعذّر العثور على عقدة جذر الثقة لخادم السياسة"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"تعذّر استرداد شهادات جذر الثقة"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"‏تعذّر العثور على شهادة جذر ثقة لخادم AAA"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"‏تعذّرت إضافة ضبط PassPoint"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"‏تعذّر العثور على مقدّم OSU"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"جارٍ الاتصال"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"تم الاتصال"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"‏جارٍ الاتصال بخادم OSU"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"‏تم التحقق من خادم OSU"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"‏تم الاتصال بخادم OSU"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"‏تبادل SOAP الأوّل"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"في انتظار رد إعادة التوجيه"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"تم تلقّي رد إعادة توجيه"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"‏تبادل SOAP الثاني"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"‏تبادل SOAP الثالث"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"جارٍ استرداد شهادات جذر الثقة"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"اكتملت إدارة الحسابات"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"بطيئة جدًا"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"بطيئة"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"موافق"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"البقاء في الوضع النشط"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"لا يتم مطلقًا دخول الشاشة في وضع السكون أثناء الشحن"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"تفعيل سجلّ تطفّل بواجهة وحدة تحكّم المضيف عبر بلوتوث"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"‏التقاط جميع حزم واجهة وحدة تحكم المضيف (HCI) في أحد الملفات عبر البلوتوث (تبديل البلوتوث بعد تغيير هذا الإعداد)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"إلغاء قفل المصنّع الأصلي للجهاز"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"‏السماح بإلغاء قفل برنامج bootloader"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"هل تريد السماح بإلغاء قفل المصنّع الأصلي للجهاز؟"</string>
diff --git a/packages/SettingsLib/res/values-as/arrays.xml b/packages/SettingsLib/res/values-as/arrays.xml
index c0a2179..e930fe3 100644
--- a/packages/SettingsLib/res/values-as/arrays.xml
+++ b/packages/SettingsLib/res/values-as/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"কেৱল DRM সমলৰ বাবে HDCP পৰীক্ষণ ব্যৱহাৰ কৰক"</item>
     <item msgid="45075631231212732">"সদায় HDCP পৰীক্ষণ ব্যৱহাৰ কৰক"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP ১.৪ (ডিফ’ল্ট)"</item>
     <item msgid="2809759619990248160">"AVRCP ১.৩"</item>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index 6cb0c3e..b95680f 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s মাধ্যমেদি স্বয়ংক্ৰিয়ভাৱে সংযোগ কৰা হৈছে"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"নেটৱৰ্ক ৰেটিং প্ৰদানকাৰীৰ জৰিয়তে স্বয়ং সংয়োগ কৰা হ’ল"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s-ৰ মাধ্যমেদি সংযোগ কৰা হৈছে"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>ৰ <xliff:g id="SSID">%1$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$sৰ মাধ্যমেৰে উপলব্ধ"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"ছেট আপ কৰিবলৈ টিপক"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"সংযোজিত, ইণ্টাৰনেট নাই"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"ইণ্টাৰনেট সংযোগ নাই"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"ছাইন ইন কৰা দৰকাৰী"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"একচেছ পইণ্ট কিছু সময়ৰ বাবে পূৰ্ণ হৈ আছে"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"%1$sৰ যোগেৰে সংযোজিত"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"%1$sৰ মাধ্যমেৰে উপলব্ধ"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"সংযোগ কৰিব পৰা নগ\'ল"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"OSU ছাৰ্ভাৰৰ URLটো অমান্য"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU ছাৰ্ভাৰৰ সৈতে সংযোগ কৰিব পৰা নগ\'ল"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU ছাৰ্ভাৰ সত্যাপন কৰিব পৰা নগ\'ল"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"OSU ছাৰ্ভাৰৰ প্ৰমাণপত্ৰ অমান্য"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"প্ৰৱন্ধন কৰাটো আধাতে বন্ধ কৰা হ\'ল"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"প্ৰৱন্ধন কৰিব নোৱাৰি"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"OSU ছাৰ্ভাৰৰ URLটো অমান্য"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"অনাকাংক্ষিত কামাণ্ডৰ ধৰণ"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"অনাকাংক্ষিত SOAP বাৰ্তাৰ ধৰণ"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP বাৰ্তা অদল-বদল কৰাত বিফল হ\'ল"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"পুনৰ্নিৰ্দেশ কৰা শুনোতা আৰম্ভ কৰিব পৰা নগ\'ল"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"পুনৰ্নিৰ্দেশ হোৱালৈ ৰৈ থকা সময় সমাপ্ত হ\'ল"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"কোনো OSU কাৰ্যকলাপ বিচাৰি পোৱা নগ\'ল"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"SOAP বাৰ্তাৰ স্থিতি অনাকাংক্ষিত"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO বিচাৰি পোৱা নগ\'ল"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"AAA ছাৰ্ভাৰৰ বাবে বিশ্বাসযোগ্য মূল ন\'ড বিচাৰি পোৱা নগ\'ল"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"ৰিমেডিয়েশ্বন ছাৰ্ভাৰৰ বাবে বিশ্বাসযোগ্য মূল ন\'ড পোৱা নগ\'ল"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"পলিচি ছাৰ্ভাৰৰ বাবে বিশ্বাসযোগ্য মূল ন\'ড বিচাৰি পোৱা নগ\'ল"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"বিশ্বাসযোগ্য মূল প্ৰমাণপত্ৰ পুনৰুদ্ধাৰ কৰিব পৰা নগ\'ল"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"AAA ছাৰ্ভাৰৰ বাবে বিশ্বাসযোগ্য মূল প্ৰমাণপত্ৰ পোৱা নগ\'ল"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"পাছপইণ্ট কনফিগাৰেশ্বন যোগ কৰিব পৰা নগ\'ল"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"OSU প্ৰদান কৰোঁতা বিচাৰি পোৱা নগ\'ল"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"সংযোগ কৰি থকা হৈছে"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"সংযোগ কৰা হ’ল"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"OSU ছাৰ্ভাৰৰ সৈতে সংযোগ কৰি থকা হৈছে"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU ছাৰ্ভাৰ সত্যাপন কৰা হ\'ল"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"OSU ছাৰ্ভাৰৰ সৈতে সংযোগ কৰা হৈছে"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"প্ৰাৰম্ভিক SOAP এক্সেঞ্জ"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"পুনৰ্নিৰ্দেশৰ সঁহাৰিৰ বাবে অপেক্ষা কৰি থকা হৈছে"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"পুনৰ্নিৰ্দেশৰ সঁহাৰি পোৱা গৈছে"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"দ্বিতীয় SOAP এক্সেঞ্জ"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"তৃতীয় SOAP এক্সেঞ্জ"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"বিশ্বাসযোগ্য মূল প্ৰমাণপত্ৰ পুনৰুদ্ধাৰ কৰি থকা হৈছে"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"প্রৱন্ধন কৰা সম্পূৰ্ণ হ\'ল"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"অতি লেহেম"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"লেহেমীয়া"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"ঠিক"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"জাগ্ৰত কৰি ৰাখক"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"চ্চাৰ্জ হৈ থকাৰ সময়ত স্ক্ৰীণ কেতিয়াও সুপ্ত অৱস্থালৈ নাযায়"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"ব্লুটুথ HCI স্নুপ ল’গ সক্ষম কৰক"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"সকলো ব্লুটুথ HCI পেকেটক কোনো ফাইলত অন্তৰ্ভুক্ত কৰক (এই ছেটিং সলনি কৰাৰ পিছত ব্লুটুথ ট\'গল কৰক)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"ঔইএম আনলক"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"বুটল\'ডাৰটো আনলক কৰিবলৈ অনুমতি দিয়ক"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"ঔইএম আনলক কৰাৰ অনুমতি দিবনে?"</string>
diff --git a/packages/SettingsLib/res/values-az/arrays.xml b/packages/SettingsLib/res/values-az/arrays.xml
index 52006ad..a662182 100644
--- a/packages/SettingsLib/res/values-az/arrays.xml
+++ b/packages/SettingsLib/res/values-az/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Yalnız DRM məzmun oxumaq üçün HDCP istifadə edin"</item>
     <item msgid="45075631231212732">"Həmişə HDCP yoxlama istifadə edin"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (Defolt)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index d30834f2..110c8da 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s üzərindən avtomatik qoşuldu"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Avtomatik olaraq şəbəkə reytinq provayderi ilə qoşuludur"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s vasitəsilə qoşuludur"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g> tərəfindən <xliff:g id="SSID">%1$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s vasitəsilə əlçatandır"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Quraşdırmaq üçün klikləyin"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Qoşuludur, internet yoxdur"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"İnternet yoxdur"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Giriş tələb olunur"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Giriş nöqtəsi müvəqqəti olaraq doludur"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s ilə qoşuludur"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"%1$s vasitəsilə əlçatandır"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Bağlantı alınmadı"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Yalnış OSU server linki"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU serverinə qoşulmadı"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU serveri doğrulanmadı"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Yalnış OSU server sertifikatı"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Təchizat prosesi ləğv edildi"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Təchizat prosesi əlçatan deyil"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Yalnış OSU server linki"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Gözlənilməyən əmr növü"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Gözlənilməz SOAP mesaj növü"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP mesaj mübadiləsi alınmadı"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Yönləndirmə dinləyicisini başlatmaq alınmadı"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Yönləndirmə dinləyicisinin gözlənilməsi üçün vaxt bitdi"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"OSU fəaliyyəti yoxdur"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Gözlənilməz SOAP mesaj statusu"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO tapılmadı"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"AAA serveri üçün güvənli mənbə şəbəkəsi tapılmadı"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Bərpa serveri üçün güvənli mənbə şəbəkəsi tapılmadı"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Siyasət serveri üçün güvənli mənbə şəbəkəsi tapılmadı"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Güvənli mənbə sertifikatları əldə edilmədi"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"AAA serveri üçün güvənli mənbə sertifikatı tapılmadı"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"PassPoint konfiqurasiyası əlavə edilmədi"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"OSU provayderi tapılmadı"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Qoşulur"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Qoşuldu"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"OSU serverinə qoşulur"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU serveri doğrulandı"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"OSU serverinə qoşuldu"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"İlk SOAP mübadiləsi"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Yönləndirmə cavabı gözlənilir"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Yönləndirilmiş cavab qəbul edildi"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"İkinci SOAP mübadiləsi"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Üçüncü SOAP mübadiləsi"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Güvənli mənbə sertifikatları əldə edilir"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Təchizat prosesi tamamlandı"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Çox Yavaş"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Yavaş"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Oyaq qal"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Enereji doldurularkən ekran heç vaxt yuxu rejimində olmur"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Bluetooth HCI izləmə jurnalını aktivləşdir"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Bütün Bluetooth HCI paketlərini faylda saxlayın (Bu ayarı dəyişdikdən sonra Bluetooth\'a keçin)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM kilidinin açılması"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Əməliyyat sistemi yükləyicisinin kilidinin açılmasına icazə ver"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM kilidinin açılmasına icazə verilsin?"</string>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
index 1d5713c..2b7d87e 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Koristi HDCP proveru samo za DRM sadržaj"</item>
     <item msgid="45075631231212732">"Uvek koristi HDCP proveru"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (podrazumevano)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index 427daab..3d34593 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatski povezano preko %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatski povezano preko dobavljača ocene mreže"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Veza je uspostavljena preko pristupne tačke %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> – <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Dostupna je preko pristupne tačke %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Dodirnite da biste podesili"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Veza je uspostavljena, nema interneta"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Nema interneta"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Treba da se prijavite"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Pristupna tačka je privremeno zauzeta"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Povezano preko %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Dostupno preko %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Povezivanje nije uspelo"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Nevažeći URL OSU servera"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Povezivanje sa OSU serverom nije uspelo"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Potvrda OSU servera nije uspela"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Nevažeći sertifikat OSU servera"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Dodela je otkazana"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Dodela nije dostupna"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Nevažeći URL OSU servera"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Neočekivani tip komande"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Neočekivani tip SOAP poruke"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Razmena SOAP poruka nije uspela"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Pokretanje obrađivača preusmeravanja nije uspelo"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Vreme čekanja preusmeravanja je isteklo"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Nije pronađena nijedna OSU aktivnost"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Neočekivani status SOAP poruke"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO nije pronađen"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Pouzdani čvor osnovnog nivoa za AAA server nije pronađen"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Pouzdani čvor osnovnog nivoa za server za otklanjanje propusta nije pronađen"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Pouzdani čvor osnovnog nivoa za server za smernice nije pronađen"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Preuzimanje pouzdanih sertifikata osnovnog nivoa nije uspelo"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Pouzdani sertifikat osnovnog nivoa za server AAA nije pronađen"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Dodavanje PassPoint konfiguracije nije uspelo"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"OSU dobavljač nije pronađen"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Povezuje se"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Povezan"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Povezujete se sa OSU serverom"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Potvrđen je OSU server"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Veza sa OSU serverom je uspostavljena"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Prva razmena SOAP-a"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Čeka se odgovor o preusmeravanju"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Primljen je odgovor o preusmeravanju"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Druga razmena SOAP-a"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Treća razmena SOAP-a"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Preuzimaju se pouzdani sertifikati osnovnog nivoa"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Dodela pristupa je završena"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Veoma spora"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Spora"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"Potvrdi"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Ne zaključavaj"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Ekran neće biti u režimu spavanja tokom punjenja"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Omogući snoop evidenciju za Bluetooth HCI"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Snimi sve Bluetooth HCI pakete u datoteci (Uključite/isključite Bluetooth kada promenite ovo podešavanje)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Otključavanje OEM-a"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Dozvoli otključavanje funkcije za pokretanje"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Želite li da dozvolite otključavanje proizvođača originalne opreme (OEM)?"</string>
diff --git a/packages/SettingsLib/res/values-be/arrays.xml b/packages/SettingsLib/res/values-be/arrays.xml
index 3891b7a..9aaa559 100644
--- a/packages/SettingsLib/res/values-be/arrays.xml
+++ b/packages/SettingsLib/res/values-be/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Выкарыстанне праверкі HDCP только для змесціва, абароненага DRM"</item>
     <item msgid="45075631231212732">"Заўсёды выкарыстоўваць праверку HDCP"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (стандартная)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index a156caf..02b0451 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Аўтаматычна падключана праз %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Аўтаматычна падключана праз пастаўшчыка паслугі ацэнкі сеткі"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Падлучана праз %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> (<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>)"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Даступна праз %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Дакраніцеся, каб наладзіць"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Падключана, без доступу да інтэрнэту"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Не падключана да інтэрнэту"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Трэба выканаць уваход"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Пункт доступу часова заняты"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Падлучана праз %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Даступна праз %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Памылка падключэння"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Несапраўдны URL-адрас сервера OSU"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Не ўдалося падключыцца да сервера OSU"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Не ўдалося праверыць сервер OSU"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Несапраўдны сертыфікат сервера OSU"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Сінхранізацыя спынена"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Сінхранізацыя недаступная"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Несапраўдны URL-адрас сервера OSU"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Нечаканы тып каманды"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Нечаканы тып паведамлення SOAP"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Не ўдалося выканаць абмен паведамленнямі SOAP"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Не ўдалося запусціць праслухоўванне перанакіравання"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Час чакання перанакіравання скончыўся"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Дзеянняў OSU не знойдзена"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Нечаканы статус паведамлення SOAP"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Не ўдалося знайсці PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Не ўдалося знайсці давераны каранёвы вузел для сервера AAA"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Не ўдалося знайсці давераны каранёвы вузел для сервера выпраўленняў"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Не ўдалося знайсці давераны каранёвы вузел для сервера палітыкі"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Не ўдалося атрымаць давераныя каранёвыя сертыфікаты"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Не ўдалося знайсці давераны каранёвы сертыфікат для сервера AAA"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Не ўдалося дадаць канфігурацыю PassPoint"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Не ўдалося знайсці аператара OSU"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Ідзе падключэнне"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Падключана"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Ідзе падключэнне да сервера OSU"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Сервер OSU пацверджаны"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Падключана да сервера OSU"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Першапачатковы абмен SOAP"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Чаканне адказу на перанакіраванне"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Атрыманы адказ на перанакіраванне"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Другі абмен SOAP"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Трэці абмен SOAP"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Ідзе атрыманне давераных каранёвых сертыфікатаў"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Сінхранізацыя завершана"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Вельмі павольная"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Павольная"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"ОК"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Прадухіляць ад пераходу ў рэжым сну"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Падчас зарадкі экран будзе пастаянна ўключаны"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Уключыць журнал адсочвання Bluetooth HCI"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Захоўваць усе пакеты Bluetooth HCI у файле (пераключыце Bluetooth пасля змены гэтай налады)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Разблакіроўка OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Дазволіць разблакіроўку загрузчыка"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Дазволіць разблакіроўку OEM?"</string>
diff --git a/packages/SettingsLib/res/values-bg/arrays.xml b/packages/SettingsLib/res/values-bg/arrays.xml
index d6e79cb..8484090 100644
--- a/packages/SettingsLib/res/values-bg/arrays.xml
+++ b/packages/SettingsLib/res/values-bg/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Да се използва проверка с HDCP само за DRM съдържание"</item>
     <item msgid="45075631231212732">"Винаги да се използва проверка с HDCP"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (по подразбиране)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index 8333646..4efbe64 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Автоматично е установена връзка чрез %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Автоматично е установена връзка чрез доставчик на услуги за оценяване на мрежите"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Установена е връзка през „%1$s“"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> на <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Мрежата е достъпна през „%1$s“"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Докоснете, за да настроите"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Установена е връзка – няма достъп до интернет"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Няма връзка с интернет"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Изисква се вход в профила"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Точката за достъп временно е пълна"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Установена е връзка през %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Мрежата е достъпна през %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Свързването не бе успешно"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Невалиден URL адрес на OSU сървъра"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Свързването с OSU сървъра не бе успешно"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Потвърждаването на OSU сървъра не бе успешно"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Невалиден сертификат на OSU сървъра"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Обезпечаването бе прекратено"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Обезпечаването не е възможно"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Невалиден URL адрес на OSU сървъра"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Неочакван тип команда"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Неочакван тип съобщение през SOAP"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Обменът на съобщения през SOAP не бе успешен"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Стартирането на приемателя за пренасочване не бе успешно"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Времето за изчакване на пренасочването изтече"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Няма намерена OSU активност"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Състояние за неочаквано съобщение през SOAP"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Намирането на PPS-MO не бе успешно"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Намирането на надежден основен възел за AAA сървъра не бе успешно"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Намирането на надежден основен възел за сървъра за отстраняване на проблеми не бе успешно"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Намирането на надежден основен възел за сървъра за правила не бе успешно"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Извличането на надеждните основни сертификати не бе успешно"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Намирането на надежден основен сертификат за AAA сървъра не бе успешно"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Добавянето на PassPoint конфигурация не бе успешно"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Намирането на OSU доставчик не бе успешно"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Установява се връзка"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Установена е връзка"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Установява се връзка с OSU сървъра"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU сървърът е потвърден"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Установена е връзка с OSU сървъра"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Първоначален обмен на данни през SOAP"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Изчаква се отговор за пренасочването"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Отговорът за пренасочването е получен"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Втори обмен на данни през SOAP"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Трети обмен на данни през SOAP"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Надеждните основни сертификати се извличат"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Обезпечаването е завършено"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Много бавна"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Бавна"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"ОK"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Да остане активен"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Екранът никога няма да е в спящ режим при зареждане"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Активиране на рег. файл за анализ за Bluetooth с протокола HCI"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Всички пакети за комуникация през Bluetooth чрез HCI да се записват във файл (превключване на Bluetooth след промяна на тази настройка)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Отключване от OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Разрешаване на първонач. зареждащата прогр. да се откл."</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Да се разреши ли отключване от OEM?"</string>
diff --git a/packages/SettingsLib/res/values-bn/arrays.xml b/packages/SettingsLib/res/values-bn/arrays.xml
index 6340034..f055742 100644
--- a/packages/SettingsLib/res/values-bn/arrays.xml
+++ b/packages/SettingsLib/res/values-bn/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"শুধুমাত্র DRM সামগ্রীর জন্য HDCP চেক করা ব্যবহার করুন"</item>
     <item msgid="45075631231212732">"সর্বদা HDCP পরীক্ষণ ব্যবহার করুন"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (ডিফল্ট)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index c7b3afea..913c0c4 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"স্বয়ংক্রিয়ভাবে %1$s এর মাধ্যমে কানেক্ট হয়েছে"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"নেটওয়ার্কের রেটিং প্রদানকারীর মাধ্যমে অটোমেটিক কানেক্ট"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s মাধ্যমে কানেক্ট হয়েছে"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g> এর <xliff:g id="SSID">%1$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s এর মাধ্যমে উপলব্ধ"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"সেট-আপ করতে ট্যাপ করুন"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"কানেক্ট, ইন্টারনেট নেই"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"ইন্টারনেট কানেকশন নেই"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"সাইন-ইন করা দরকার"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"এই মুহূর্তে অ্যাক্সেস পয়েন্টের কোনও কানেকশন ফাঁকা নেই"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s এর মাধ্যমে কানেক্ট হয়েছে"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"%1$s এর মাধ্যমে পাওয়া যাচ্ছে"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"কানেক্ট করা যায়নি"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"ভুল OSU সার্ভার ইউআরএল"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU সার্ভারে কানেক্ট করা যায়নি"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU সার্ভার যাচাই করা যায়নি"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"ভুল OSU সার্ভার সার্টিফিকেট"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"প্রভিশনিং বাতিল করা হয়েছে"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"প্রভিশনিং উপলভ্য নেই"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"ভুল OSU সার্ভার ইউআরএল"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"অপ্রত্যাশিত কমান্ডের ধরন"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"অপ্রত্যাশিত SOAP মেসেজের ধরন"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP মেসেজ এক্সচেঞ্জ করা যায়নি"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"রিডাইরেক্ট লিসনার শুরু হয়নি"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"রিডাইরেক্টের জন্য অপেক্ষা করার সময় শেষ হয়েছে"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"কোনও OSU অ্যাক্টিভিটি খুঁজে পাওয়া যায়নি"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"অপ্রত্যাশিত SOAP মেসেজের স্ট্যাটাস"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO খুঁজে পাওয়া যায়নি"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"AAA সার্ভারের জন্য ট্রাস্ট রুট নোড খুঁজে পাওয়া যায়নি"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"রেমেডিয়েশন সার্ভারের জন্য ট্রাস্ট রুট নোড খুঁজে পাওয়া যায়নি"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"নীতি সার্ভারের জন্য ট্রাস্ট রুট নোড খুঁজে পাওয়া যায়নি"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"\'ট্রাস্ট রুট সার্টিফিকেট ফিরিয়ে আনা যায়নি"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"AAA সার্ভারের জন্য ট্রাস্ট রুট সার্টিফিকেট খুঁজে পাওয়া যায়নি"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"PassPoint কনফিগারেশন যোগ করা যায়নি"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"OSU প্রদানকারী খুঁজে পাওয়া যায়নি"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"কানেক্ট হচ্ছে"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"কানেক্ট করা হয়েছে"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"OSU সার্ভারের সাথে কানেক্ট করা হচ্ছে"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU সার্ভার যাচাই করা হয়েছে"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"OSU সার্ভারের সাথে কানেক্ট করা আছে"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"প্রারম্ভিক SOAP এক্সচেঞ্জ"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"রিডাইরেক্টের উত্তর পাওয়ার জন্য অপেক্ষা করা হচ্ছে"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"রিডাইরেক্টের উত্তর পাওয়া গেছে"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"সেকেন্ড SOAP এক্সচেন্জ"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"থার্ড SOAP এক্সচেন্জ"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"ট্রাস্ট রুট সার্টিফিকেট ফিরিয়ে আনা হচ্ছে"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"প্রভিশনিং সম্পূর্ণ হয়েছে"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"খুব ধীরে"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"ধীরে"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"ঠিক আছে"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"জাগিয়ে রাখুন"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"চার্জ হওয়ার স্ক্রিন কখনই নিদ্রা মোডে যাবে না"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"ব্লুটুথ HCI স্নুপ লগ সক্ষম করুন"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"সমস্ত ব্লুটুথ HCI প্যাকেট একটি ফাইলে ক্যাপচার করে রাখুন (এই সেটিং পরিবর্তন করার পরে ব্লুটুথ চালু অথবা বন্ধ করুন)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM আনলক করা হচ্ছে"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"বুট-লোডার আনলক করার অনুমতি দিন"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM আনলক করার অনুমতি দিতে চান?"</string>
diff --git a/packages/SettingsLib/res/values-bs/arrays.xml b/packages/SettingsLib/res/values-bs/arrays.xml
index 9b3c38c..bcb35f1 100644
--- a/packages/SettingsLib/res/values-bs/arrays.xml
+++ b/packages/SettingsLib/res/values-bs/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Koristi HDCP provjeru samo za DRM sadržaj"</item>
     <item msgid="45075631231212732">"Uvijek koristi HDCP provjeru"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (zadano)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index 715a8a5..1ba6904 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatski povezano koristeći %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatski povezano putem ocjenjivača mreže"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Povezani preko %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> autora <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Dostupan preko %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Dodirnite za postavljanje"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Povezano, nema interneta"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Nema internetske veze"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Potrebna je prijava"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Pristupna tačka je privremeno puna"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Povezano koristeći %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Dostupna koristeći %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Veza nije uspjela"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Nevažeći URL OSU servera"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Povezivanje s OSU serverom nije uspjelo"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Potvrda OSU servera nije uspjela"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Nevažeći certifikat OSU servera"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Pružanje usluga je prekinuto"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Pružanje usluga nije dostupno"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Nevažeći URL OSU servera"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Neočekivana vrsta komande"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Neočekivana vrsta poruke SOAP"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Razmjena SOAP poruka nije uspjela"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Preusmjereni slušalac nije pokrenuo sadržaj"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Vrijeme za preusmjeravanje je isteklo"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"OSU aktivnosti nisu pronađene"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Status neočekivane SOAP poruke"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO nije pronađen"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Pouzdani temeljni čvor za AAA server nije pronađen"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Pouzdani temeljni čvor za server za uklanjanje problema nije pronađen"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Pouzdani temeljni čvor za server pravila nije pronađen"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Preuzimanje temeljnih pouzdanih certifikata nije uspjelo"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Pouzdani temeljni certifikat za AAA server nije pronađen"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Nije moguće dodati PassPoint konfiguraciju"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"OSU pružatelj usluga nije pronađen"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Povezivanje"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Povezano"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Povezivanje na OSU server"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU server je potvrđen"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Povezano na OSU server"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Prva SOAP razmjena"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Čekanje odgovora za preusmjeravanje"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Primljen je odgovor o preusmjeravanju"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Druga SOAP razmjena"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Treća SOAP razmjena"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Preuzimanje pouzdanih temeljnih certifikata"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Pružanje usluge je završeno"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Veoma sporo"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Sporo"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"UREDU"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Ostani aktivan"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Ekran neće prelaziti u stanje mirovanja tokom punjenja"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Omogući Bluetooth HCI snoop zapis"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Snimi sve Bluetooth HCI pakete u fajl (uključite/isključite Bluetooth nakon promjene ove postavke)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM otključavanje"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Dozvoli otključavanje bootloadera"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Želite li dozvoliti OEM otključavanje?"</string>
diff --git a/packages/SettingsLib/res/values-ca/arrays.xml b/packages/SettingsLib/res/values-ca/arrays.xml
index d26afb5..fd0df04 100644
--- a/packages/SettingsLib/res/values-ca/arrays.xml
+++ b/packages/SettingsLib/res/values-ca/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Utilitza la comprovació HDCP només per a contingut DRM"</item>
     <item msgid="45075631231212732">"Utilitza sempre la comprovació HDCP"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (predeterminada)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 56f55dd..8133559b 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Connectada automàticament a través de: %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Connectada automàticament a través d\'un proveïdor de valoració de xarxes"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Connectada mitjançant %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> de: <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Disponible mitjançant %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Toca per configurar"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connectada, sense Internet"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Sense connexió a Internet"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Cal iniciar la sessió"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"El punt d\'accés està temporalment ple"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Connectat mitjançant %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Disponible mitjançant %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Connexió fallida"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"URL de servidor OSU no vàlid"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"No s\'ha pogut connectar al servidor OSU"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"No s\'ha pogut validar el servidor OSU"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Certificat de servidor OSU no vàlid"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Proveïment anul·lat"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Proveïment no disponible"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"URL de servidor OSU no vàlid"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Tipus d\'ordre inesperada"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Tipus de missatge SOAP inesperat"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"No s\'ha pogut intercanviar el missatge SOAP"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"No s\'ha pogut iniciar el processador de redirecció"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Temps d\'espera de redirecció esgotat"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"No s\'ha trobat cap activitat OSU"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Estat de missatge SOAP inesperat"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"No s\'ha pogut trobar PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"No s\'ha pogut trobar el node arrel de confiança del servidor AAA"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"No s\'ha pogut trobar el node arrel de confiança del servidor de solucions"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"No s\'ha pogut trobar el node arrel de confiança del servidor de polítiques"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"No s\'han pogut recuperar els certificats arrel de confiança"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"No s\'ha pogut trobar el certificat arrel de confiança del servidor AAA"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"No s\'ha pogut afegir la configuració PassPoint"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"No s\'ha pogut trobar el proveïdor OSU"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"S\'està connectant"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Connectat"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"S\'està connectant al servidor OSU"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Servidor OSU validat"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Connectat a un servidor OSU"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Primer intercanvi SOAP"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"S\'està esperant la resposta de redirecció"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Resposta de redirecció rebuda"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Segon intercanvi SOAP"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Tercer intercanvi SOAP"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"S\'estan recuperant els certificats arrel de confiança"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Proveïment complet"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Molt lenta"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Lenta"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"Correcta"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Pantalla sempre activa"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"La pantalla no entra mai en mode de repòs si el dispositiu està carregant-se"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Activa registre de Bluetooth HCI"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Captura tots els paquets de Bluetooth HCI en un fitxer (activa el Bluetooth un cop hagis canviat aquesta opció)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Desbloqueig d\'OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Permet desbloquejar el bootloader"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Permetre el desbloqueig d\'OEM?"</string>
diff --git a/packages/SettingsLib/res/values-cs/arrays.xml b/packages/SettingsLib/res/values-cs/arrays.xml
index 1555720..29beb77 100644
--- a/packages/SettingsLib/res/values-cs/arrays.xml
+++ b/packages/SettingsLib/res/values-cs/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Použít kontrolu HDCP pouze pro obsah DRM"</item>
     <item msgid="45075631231212732">"Vždy používat kontrolu HDCP"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (výchozí)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index edbb358..42e2ad3 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Automaticky připojeno přes poskytovatele %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automaticky připojeno přes poskytovatele hodnocení sítí"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Připojeno prostřednictvím %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>: <xliff:g id="SSID">%1$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Dostupné prostřednictvím %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Nastavíte klepnutím"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Připojeno, není k dispozici internet"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Nejste připojeni k internetu"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Je vyžadováno přihlášení"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Přístupový bod je dočasně zaplněn"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Připojeno prostřednictvím %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Dostupné prostřednictvím %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Připojení se nezdařilo"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Neplatná adresa URL serveru OSU"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Připojení k serveru OSU se nezdařilo"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Ověření serveru OSU se nezdařilo"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Neplatný certifikát serveru OSU"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Zajišťování bylo zrušeno"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Zajišťování není k dispozici"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Neplatná adresa URL serveru OSU"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Neočekávaný typ příkazu"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Neočekávaný typ zprávy SOAP"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Výměna zpráva SOAP se nezdařila"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Poslech za účelem přesměrování se nepodařilo zahájit"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Vypršel časový limit čekání na přesměrování"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Nebyla nalezena žádná aktivita OSU"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Neočekávaný stav zprávy SOAP"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO se nepodařilo najít"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Kořenový uzel důvěry pro server AAA se nepodařilo najít"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Kořenový uzel důvěry pro server nápravy se nepodařilo najít"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Kořenový uzel důvěry pro server zásad se nepodařilo najít"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Kořenové certifikáty důvěry se nepodařilo načíst"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Kořenový uzel důvěry pro server AAA se nepodařilo najít"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Konfiguraci PassPoint se nepodařilo přidat"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Poskytovatele OSU se nepodařilo najít"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Připojování"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Připojeno"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Připojování k serveru OSU"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Server OSU byl ověřen"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Připojeno k serveru OSU"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"První výměna SOAP"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Čekání na odpověď s přesměrováním"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Byla přijata odpověď s přesměrováním"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Druhá výměna SOAP"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Třetí výměna SOAP"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Načítání kořenových certifikátů důvěry"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Zajišťování bylo dokončeno"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Velmi pomalá"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Pomalá"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Nevypínat obrazovku"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Obrazovka se při nabíjení nepřepne do režimu spánku"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Povolit protokol Bluetooth HCI"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Zachytit všechny pakety Bluetooth HCI do souboru (po změně tohoto nastavení přepnout Bluetooth)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Odemknutí OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Povolit odemknutí zavaděče"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Povolit odemknutí OEM?"</string>
diff --git a/packages/SettingsLib/res/values-da/arrays.xml b/packages/SettingsLib/res/values-da/arrays.xml
index 01ae8d2..97e2b05 100644
--- a/packages/SettingsLib/res/values-da/arrays.xml
+++ b/packages/SettingsLib/res/values-da/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Brug kun HDCP-kontrol ved DRM-indhold"</item>
     <item msgid="45075631231212732">"Brug altid HDCP-kontrol"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (standard)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index 1d34579..f504afb 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatisk tilsluttet via %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatisk forbundet via udbyder af netværksvurdering"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Tilsluttet via %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> fra <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Tilgængelig via %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Tryk for at konfigurere"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Tilsluttet – intet internet"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Intet internet"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Login er påkrævet"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Adgangspunktet er midlertidigt fuldt"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Tilsluttet via %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Tilgængelig via %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Der kunne ikke oprettes forbindelse"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Ugyldig webadresse for OSU-serveren"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Der kunne ikke oprettes forbindelse til OSU-serveren"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU-servervalideringen mislykkedes"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Ugyldigt OSU-servercertifikat"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Provisioneringen blev annulleret"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Provisionering er ikke tilgængelig"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Ugyldig webadresse for OSU-serveren"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Uventet kommandotype"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Uventet SOAP-meddelelsestype"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Udvekslingen af SOAP-meddelelser mislykkedes"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Lyttefunktionen til omdirigering kunne ikke starte"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Der opstod timeout under ventetiden for omdirigering"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Der blev ikke fundet nogen OSU-aktivitet"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Uventet SOAP-meddelelsesstatus"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO kunne ikke findes"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Der blev ikke fundet nogen godkendt rodnode til AAA-serveren"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Der blev ikke fundet nogen godkendt rodnode til afhjælpningsserveren"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Der blev ikke fundet nogen godkendt rodnode til politikserveren"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Der kunne ikke hentes godkendte rodcertifikater"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Det lykkedes ikke at finde et godkendt rodcertifikat til AAA-serveren"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Der kunne ikke tilføjes PassPoint-konfiguration"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Der kunne ikke findes en OSU-udbyder"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Opretter forbindelse"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Der er oprettet forbindelse"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Opretter forbindelse til OSU-serveren"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU-serveren blev godkendt"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Der er oprettet forbindelse til OSU-serveren"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Første SOAP-udveksling"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Venter på omdirigeringssvar"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Der blev modtaget et omdirigeringssvar"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Anden SOAP-udveksling"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Tredje SOAP-udveksling"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Henter godkendte rodcertifikater"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Provisioneringen er udført"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Meget langsom"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Langsom"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Lås ikke"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Skærmen går ikke i dvale under opladning"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Aktivér Bluetooth HCI spionlog"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Gem alle Bluetooth HCI-pakker i en fil (slå Bluetooth fra og til igen, når du har ændret denne indstilling)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM-oplåsning"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Tillad, at startindlæseren låses op"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Vil du tillade OEM-oplåsning?"</string>
diff --git a/packages/SettingsLib/res/values-de/arrays.xml b/packages/SettingsLib/res/values-de/arrays.xml
index 6722410..755b6bb 100644
--- a/packages/SettingsLib/res/values-de/arrays.xml
+++ b/packages/SettingsLib/res/values-de/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"HDCP-Prüfung nur für DRM-Inhalte verwenden"</item>
     <item msgid="45075631231212732">"HDCP-Prüfung immer verwenden"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (Standard)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index 1abc359..ad67669 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatisch über %1$s verbunden"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatisch über Anbieter von Netzwerkbewertungen verbunden"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Über %1$s verbunden"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> von <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Verfügbar über %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Zum Einrichten tippen"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Verbunden, kein Internet"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Kein Internet"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Anmeldung erforderlich"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Zugangspunkt vorübergehend voll belegt"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Über %1$s verbunden"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Verfügbar über %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Fehler beim Herstellen der Verbindung"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Ungültige OSU-Server-URL"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Fehler beim Verbinden mit dem OSU-Server"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Fehler bei der OSU-Servervalidierung"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Ungültiges OSU-Serverzertifikat"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Bereitstellung abgebrochen"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Bereitstellung nicht verfügbar"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Ungültige OSU-Server-URL"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Unerwarteter Befehlstyp"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Unerwarteter SOAP-Nachrichtentyp"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Fehler beim SOAP-Nachrichtenaustausch"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Weiterleitungs-Listener konnte nicht gestartet werden"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Zeitüberschreitung beim Warten auf die Weiterleitung"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Es wurde keine OSU-Aktivität gefunden"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Unerwarteter SOAP-Nachrichtenstatus"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO konnte nicht gefunden werden"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Es konnte kein vertrauenswürdiger Root-Knoten für den AAA-Server gefunden werden"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Es konnte kein vertrauenswürdiger Root-Knoten für den Wiederherstellungsserver gefunden werden"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Es konnte kein vertrauenswürdiger Root-Knoten für den Richtlinienserver gefunden werden"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Es konnten keine vertrauenswürdigen Root-Zertifikate abgerufen werden"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Es konnte kein vertrauenswürdiges Root-Zertifikat für den AAA-Server gefunden werden"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"PassPoint-Konfiguration konnte nicht hinzugefügt werden"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Es konnte kein OSU-Anbieter gefunden werden"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Wird verbunden"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Verbunden"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Verbindung zum OSU-Server wird hergestellt"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU-Server validiert"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Mit OSU-Server verbunden"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Erster SOAP-Nachrichtenaustausch"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Warten auf Weiterleitung"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Als Antwort Weiterleitung erhalten"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Zweiter SOAP-Nachrichtenaustausch"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Dritter SOAP-Nachrichtenaustausch"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Vertrauenswürdige Root-Zertifikate werden abgerufen"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Bereitstellung abgeschlossen"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Sehr langsam"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Langsam"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Aktiv lassen"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Display wird beim Laden nie in den Ruhezustand versetzt"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Bluetooth HCI-Snoop-Protokoll aktivieren"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Alle Bluetooth HCI-Pakete in einer Datei erfassen. (Wenn diese Einstellung geändert wurde, muss Bluetooth aus- und wieder eingeschaltet werden.)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM-Entsperrung"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Bootloader-Entsperrung zulassen"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM-Entsperrung zulassen?"</string>
diff --git a/packages/SettingsLib/res/values-el/arrays.xml b/packages/SettingsLib/res/values-el/arrays.xml
index 9bf9f9b..3d91c1d 100644
--- a/packages/SettingsLib/res/values-el/arrays.xml
+++ b/packages/SettingsLib/res/values-el/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Χρήση ελέγχου HDCP μόνο για περιεχόμενο DRM"</item>
     <item msgid="45075631231212732">"Να χρησιμοποιείται πάντα έλεγχος HDCP"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (Προεπιλογή)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index eb57558..370c9c0 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Συνδέθηκε αυτόματα μέσω %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Συνδέθηκε αυτόματα μέσω παρόχου αξιολόγησης δικτύου"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Συνδέθηκε μέσω %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> από <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Διαθέσιμο μέσω %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Πατήστε για ρύθμιση"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Συνδέθηκε, χωρίς σύνδεση στο διαδίκτυο"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Δεν υπάρχει σύνδεση στο διαδίκτυο"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Απαιτείται σύνδεση"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Το σημείο πρόσβασης είναι προσωρινά πλήρες"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Συνδέθηκε μέσω %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Διαθέσιμο μέσω %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Η σύνδεση απέτυχε"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Μη έγκυρο URL διακομιστή OSU"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Η σύνδεση με τον διακομιστή OSU απέτυχε"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Η επαλήθευση του διακομιστή OSU απέτυχε"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Μη έγκυρο πιστοποιητικό διακομιστή OSU"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Η παροχή ακυρώθηκε"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Η παροχή δεν είναι διαθέσιμη"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Μη έγκυρο URL διακομιστή OSU"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Μη αναμενόμενος τύπος εντολής"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Μη αναμενόμενος τύπος μηνύματος SOAP"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Η ανταλλαγή μηνύματος SOAP απέτυχε"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Αποτυχία εκκίνησης λειτουργίας ακρόασης ανακατεύθυνσης"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Έληξε το χρονικό όριο αναμονής για ανακατεύθυνση"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Δεν βρέθηκε δραστηριότητα OSU"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Μη αναμενόμενη κατάσταση μηνύματος SOAP"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Η εύρεση PPS-MO απέτυχε"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Η εύρεση αξιόπιστου ριζικού κόμβου για τον διακομιστή AAA απέτυχε"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Η εύρεση αξιόπιστου ριζικού κόμβου για τον διακομιστή αποκατάστασης απέτυχε"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Η εύρεση αξιόπιστου ριζικού κόμβου για τον διακομιστή πολιτικής απέτυχε"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Η ανάκτηση αξιόπιστων πιστοποιητικών ρίζας απέτυχε"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Η εύρεση αξιόπιστου πιστοποιητικού ρίζας για τον διακομιστή AAA απέτυχε"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Η προσθήκη διαμόρφωσης PassPoint απέτυχε"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Η εύρεση παρόχου OSU απέτυχε"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Σύνδεση"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Συνδέθηκε"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Σύνδεση σε διακομιστή OSU"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Ο διακομιστής OSU επαληθεύτηκε"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Συνδέθηκε σε διακομιστή OSU"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Αρχική ανταλλαγή SOAP"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Αναμονή για απόκριση ανατακατεύθυνσης"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Ελήφθη απόκριση ανακατεύθυνσης"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Δεύτερη ανταλλαγή SOAP"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Τρίτη ανταλλαγή SOAP"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Ανάκτηση αξιόπιστων πιστοποιητικών ρίζας"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Η παροχή ολοκληρώθηκε"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Πολύ αργή"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Αργή"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"ΟΚ"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Παραμονή σε λειτουργία"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Η οθόνη δεν θα μεταβαίνει ποτέ σε κατάσταση αδράνειας κατά τη φόρτιση"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Ενερ/ση καταγρ. Bluetooth HCI"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Καταγραφή όλων των πακέτων Bluetooth HCI σε ένα αρχείο (Εναλλαγή Bluetooth μετά την αλλαγή αυτής της ρύθμισης)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Ξεκλείδωμα OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Να επιτρέπεται το ξεκλείδωμα λειτουργίας εκκίνησης"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Να επιτρέπεται το ξεκλείδωμα OEM;"</string>
diff --git a/packages/SettingsLib/res/values-en-rAU/arrays.xml b/packages/SettingsLib/res/values-en-rAU/arrays.xml
index bd1a78c..e7d0bd4 100644
--- a/packages/SettingsLib/res/values-en-rAU/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rAU/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Use HDCP checking for DRM content only"</item>
     <item msgid="45075631231212732">"Always use HDCP checking"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (Default)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index 1f74d9b1..5684369 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatically connected via %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatically connected via network rating provider"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Connected via %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> by <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Available via %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Tap to set up"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connected, no Internet"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"No Internet"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Sign-in required"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Access point temporarily full"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Connected via %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Available via %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Connection failed"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Invalid OSU server URL"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU server connection failed"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU server validation failed"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Invalid OSU server certificate"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Provisioning aborted"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Provisioning not available"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Invalid OSU server URL"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Unexpected command type"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Unexpected SOAP message type"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP message exchange failed"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Redirect listener failed to start"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Timed out waiting for redirect"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"No OSU activity found"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Unexpected SOAP message status"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Failed to find PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Failed to find trust root node for AAA server"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Failed to find trust root node for remediation server"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Failed to find trust root node for policy server"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Failed to retrieve trust root certificates"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Failed to find trust root certificate for AAA server"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Failed to add PassPoint configuration"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Failed to find an OSU provider"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Connecting"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Connected"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Connecting to OSU server"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU server validated"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Connected to OSU server"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Initial SOAP exchange"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Waiting for redirect response"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Received redirect response"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Second SOAP exchange"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Third SOAP exchange"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Retrieving trust root certificates"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Provisioning complete"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Very slow"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Slow"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Stay awake"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Screen will never sleep while charging"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Enable Bluetooth HCI snoop log"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Capture all Bluetooth HCI packets in a file (toggle Bluetooth after changing this setting)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM unlocking"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Allow the bootloader to be unlocked"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Allow OEM unlocking?"</string>
diff --git a/packages/SettingsLib/res/values-en-rCA/arrays.xml b/packages/SettingsLib/res/values-en-rCA/arrays.xml
index bd1a78c..e7d0bd4 100644
--- a/packages/SettingsLib/res/values-en-rCA/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rCA/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Use HDCP checking for DRM content only"</item>
     <item msgid="45075631231212732">"Always use HDCP checking"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (Default)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml
index 1f74d9b1..5684369 100644
--- a/packages/SettingsLib/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-en-rCA/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatically connected via %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatically connected via network rating provider"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Connected via %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> by <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Available via %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Tap to set up"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connected, no Internet"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"No Internet"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Sign-in required"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Access point temporarily full"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Connected via %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Available via %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Connection failed"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Invalid OSU server URL"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU server connection failed"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU server validation failed"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Invalid OSU server certificate"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Provisioning aborted"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Provisioning not available"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Invalid OSU server URL"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Unexpected command type"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Unexpected SOAP message type"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP message exchange failed"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Redirect listener failed to start"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Timed out waiting for redirect"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"No OSU activity found"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Unexpected SOAP message status"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Failed to find PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Failed to find trust root node for AAA server"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Failed to find trust root node for remediation server"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Failed to find trust root node for policy server"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Failed to retrieve trust root certificates"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Failed to find trust root certificate for AAA server"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Failed to add PassPoint configuration"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Failed to find an OSU provider"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Connecting"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Connected"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Connecting to OSU server"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU server validated"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Connected to OSU server"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Initial SOAP exchange"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Waiting for redirect response"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Received redirect response"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Second SOAP exchange"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Third SOAP exchange"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Retrieving trust root certificates"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Provisioning complete"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Very slow"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Slow"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Stay awake"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Screen will never sleep while charging"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Enable Bluetooth HCI snoop log"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Capture all Bluetooth HCI packets in a file (toggle Bluetooth after changing this setting)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM unlocking"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Allow the bootloader to be unlocked"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Allow OEM unlocking?"</string>
diff --git a/packages/SettingsLib/res/values-en-rGB/arrays.xml b/packages/SettingsLib/res/values-en-rGB/arrays.xml
index bd1a78c..e7d0bd4 100644
--- a/packages/SettingsLib/res/values-en-rGB/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rGB/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Use HDCP checking for DRM content only"</item>
     <item msgid="45075631231212732">"Always use HDCP checking"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (Default)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index 1f74d9b1..5684369 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatically connected via %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatically connected via network rating provider"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Connected via %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> by <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Available via %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Tap to set up"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connected, no Internet"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"No Internet"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Sign-in required"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Access point temporarily full"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Connected via %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Available via %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Connection failed"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Invalid OSU server URL"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU server connection failed"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU server validation failed"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Invalid OSU server certificate"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Provisioning aborted"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Provisioning not available"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Invalid OSU server URL"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Unexpected command type"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Unexpected SOAP message type"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP message exchange failed"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Redirect listener failed to start"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Timed out waiting for redirect"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"No OSU activity found"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Unexpected SOAP message status"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Failed to find PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Failed to find trust root node for AAA server"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Failed to find trust root node for remediation server"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Failed to find trust root node for policy server"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Failed to retrieve trust root certificates"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Failed to find trust root certificate for AAA server"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Failed to add PassPoint configuration"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Failed to find an OSU provider"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Connecting"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Connected"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Connecting to OSU server"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU server validated"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Connected to OSU server"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Initial SOAP exchange"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Waiting for redirect response"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Received redirect response"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Second SOAP exchange"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Third SOAP exchange"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Retrieving trust root certificates"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Provisioning complete"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Very slow"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Slow"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Stay awake"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Screen will never sleep while charging"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Enable Bluetooth HCI snoop log"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Capture all Bluetooth HCI packets in a file (toggle Bluetooth after changing this setting)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM unlocking"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Allow the bootloader to be unlocked"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Allow OEM unlocking?"</string>
diff --git a/packages/SettingsLib/res/values-en-rIN/arrays.xml b/packages/SettingsLib/res/values-en-rIN/arrays.xml
index bd1a78c..e7d0bd4 100644
--- a/packages/SettingsLib/res/values-en-rIN/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rIN/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Use HDCP checking for DRM content only"</item>
     <item msgid="45075631231212732">"Always use HDCP checking"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (Default)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index 1f74d9b1..5684369 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatically connected via %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatically connected via network rating provider"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Connected via %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> by <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Available via %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Tap to set up"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connected, no Internet"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"No Internet"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Sign-in required"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Access point temporarily full"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Connected via %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Available via %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Connection failed"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Invalid OSU server URL"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU server connection failed"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU server validation failed"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Invalid OSU server certificate"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Provisioning aborted"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Provisioning not available"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Invalid OSU server URL"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Unexpected command type"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Unexpected SOAP message type"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP message exchange failed"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Redirect listener failed to start"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Timed out waiting for redirect"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"No OSU activity found"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Unexpected SOAP message status"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Failed to find PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Failed to find trust root node for AAA server"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Failed to find trust root node for remediation server"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Failed to find trust root node for policy server"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Failed to retrieve trust root certificates"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Failed to find trust root certificate for AAA server"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Failed to add PassPoint configuration"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Failed to find an OSU provider"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Connecting"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Connected"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Connecting to OSU server"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU server validated"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Connected to OSU server"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Initial SOAP exchange"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Waiting for redirect response"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Received redirect response"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Second SOAP exchange"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Third SOAP exchange"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Retrieving trust root certificates"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Provisioning complete"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Very slow"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Slow"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Stay awake"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Screen will never sleep while charging"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Enable Bluetooth HCI snoop log"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Capture all Bluetooth HCI packets in a file (toggle Bluetooth after changing this setting)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM unlocking"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Allow the bootloader to be unlocked"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Allow OEM unlocking?"</string>
diff --git a/packages/SettingsLib/res/values-en-rXC/arrays.xml b/packages/SettingsLib/res/values-en-rXC/arrays.xml
index 1f66235..6dd2e0e 100644
--- a/packages/SettingsLib/res/values-en-rXC/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rXC/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‏‎‏‎‎‎‎‏‏‏‏‏‎‎‎‏‏‏‏‏‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‎‏‎‏‏‎‎‏‎‎‎‎‏‎‏‎Use HDCP checking for DRM content only‎‏‎‎‏‎"</item>
     <item msgid="45075631231212732">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‎‎‏‎‏‎‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‎‏‏‎‎‎‎‏‏‏‎‏‏‏‎‎‏‎‎‎‎‎‎‎‏‏‏‎‎‏‎‏‏‏‏‎‎‎Always use HDCP checking‎‏‎‎‏‎"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‎‏‎‎‎‏‏‎‏‏‎‏‏‎‎‎‏‎‏‏‎‏‎‎‎‎‎‏‎‎‎‏‎‎‏‎‏‎‎‏‏‎‏‎‏‏‎‏‏‎‏‎‏‎‎‏‎‏‏‎AVRCP 1.4 (Default)‎‏‎‎‏‎"</item>
     <item msgid="2809759619990248160">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‏‏‎‏‏‏‏‏‏‏‎‎‏‎‎‎‏‎‏‎‏‏‏‏‏‎‎‏‏‎‏‎‏‎‏‏‏‎‎‎‎‎‏‎‏‎‏‏‎‏‎‏‏‏‎‎‎‎‎‎AVRCP 1.3‎‏‎‎‏‎"</item>
diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml
index 082a331..71c14f5 100644
--- a/packages/SettingsLib/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/res/values-en-rXC/strings.xml
@@ -234,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‏‏‏‏‏‎‏‎‎‎‏‏‎‎‏‎‏‏‎‏‎‎‏‎‏‏‏‎‏‏‎‏‏‎‎‏‏‎‎‎‏‏‏‎‏‎‎‏‎‎‎‎‎‏‏‎‎‎‎Stay awake‎‏‎‎‏‎"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‏‏‎‎‎‏‎‏‎‎‎‎‏‏‏‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‎‏‎‎‎‎‎‎‏‏‎‏‏‎‎‏‎‏‎‎‎‏‎‎‎‏‎Screen will never sleep while charging‎‏‎‎‏‎"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‏‏‏‎‎‏‎‏‏‏‎‎‏‎‎‎‏‏‎‎‎‏‎‏‎‎‏‎‏‏‎‏‏‏‏‏‎‎‎‎‎‏‎‎‎‎‏‎‏‏‏‏‎‎‎‎‎‏‏‎‎Enable Bluetooth HCI snoop log‎‏‎‎‏‎"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‏‏‎‏‎‎‎‏‎‏‎‎‏‎‎‏‎‏‏‎‏‏‏‏‏‎‏‏‎‏‎‏‎‎‎‎‎‎‏‎‏‏‎‎‏‎‎‏‏‏‎‎‎‎‎‏‎‎‏‏‎Capture all Bluetooth HCI packets in a file (Toggle Bluetooth after changing this setting)‎‏‎‎‏‎"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‏‎‏‎‏‎‎‎‏‏‎‏‎‎‎‏‏‏‏‎‎‎‏‏‎‏‎‏‎‎‎‎‏‎‎‏‎‎‎‏‏‏‎‎‏‏‏‎‎‏‎‏‏‎OEM unlocking‎‏‎‎‏‎"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‎‎‏‏‎‎‎‎‎‎‏‏‏‎‎‏‏‏‏‎‏‎‏‎‎‎‎‎‏‏‏‎‎‏‎‏‏‎‏‎‎‎‎‏‏‏‎‏‏‎‎‎‏‎‎‏‎‎‎‎Allow the bootloader to be unlocked‎‏‎‎‏‎"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‏‎‎‏‎‎‏‎‏‏‎‎‎‎‏‎‏‎‏‎‎‏‏‎‎‎‎‏‎‏‎‎‎‏‎‎‏‏‎‏‎‎‎‏‎‏‏‎‎‎‏‎‏‎‎Allow OEM unlocking?‎‏‎‎‏‎"</string>
diff --git a/packages/SettingsLib/res/values-es-rUS/arrays.xml b/packages/SettingsLib/res/values-es-rUS/arrays.xml
index 38342e3..4899346 100644
--- a/packages/SettingsLib/res/values-es-rUS/arrays.xml
+++ b/packages/SettingsLib/res/values-es-rUS/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Usar comprobación HDCP para contenido DRM solamente"</item>
     <item msgid="45075631231212732">"Siempre utilizar comprobación HDCP"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (predeterminado)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index 795ad9c..eef0fb1 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Conexión automática mediante %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Conectado automáticamente mediante proveedor de calificación de red"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Conexión a través de %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> de <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Disponible a través de %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Presiona para configurar"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Conectado pero sin conexión a Internet"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Sin Internet"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Acceso obligatorio"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"El punto de acceso está completo temporalmente"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Conexión a través de %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Disponible a través de %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Error de conexión"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"No es válida la URL del servidor OSU"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"No se pudo establecer conexión con el servidor OSU"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"No se pudo validar el servidor OSU"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"No es válido el certificado del servidor OSU"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Se anuló el aprovisionamiento"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"No está disponible el aprovisionamiento"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"No es válida la URL del servidor OSU"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Tipo de comando inesperado"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Tipo de mensaje SOAP inesperado"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"No se pudo realizar el intercambio de mensajes SOAP"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"No se pudo iniciar la recepción de redireccionamiento"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Se agotó el tiempo de espera de redireccionamiento"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"No se encontró actividad OSU"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Estado de mensaje SOAP inesperado"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"No se encontró PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"No se encontró ningún nodo raíz de confianza para el servidor AAA"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"No se encontró ningún nodo raíz de confianza para el servidor de soluciones"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"No se pudo recuperar el nodo raíz de confianza del servidor de políticas"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"No se pudieron recuperar los certificados raíz de confianza"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"No se encontró ningún certificado raíz de confianza para el servidor AAA"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"No se pudo agregar la configuración de PassPoint"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"No se encontró ningún proveedor OSU"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Estableciendo conexión"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Se estableció conexión"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Estableciendo conexión con el servidor OSU"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Se validó el servidor OSU"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Se estableció conexión con el servidor OSU"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Intercambio SOAP inicial"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Esperando respuesta de redireccionamiento"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Se recibió la respuesta de redireccionamiento"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Segundo intercambio SOAP"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Tercer intercambio SOAP"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Recuperando certificados raíz de confianza"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Se completó el aprovisionamiento"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Muy lenta"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Lenta"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"Aceptar"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Permanecer activo"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"La pantalla nunca quedará inactiva mientras el dispositivo se esté cargando."</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Registro de Bluetooth HCI"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Capturar todos los paquetes de Bluetooth HCI de un archivo (Activar o desactivar el Bluetooth después de cambiar esta opción)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Desbloqueo de OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Permitir que el cargador de inicio se desbloquee"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"¿Permitir desbloqueo de OEM?"</string>
@@ -446,9 +410,9 @@
     <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Tiempo restante: aproximadamente <xliff:g id="TIME_REMAINING">%1$s</xliff:g> en función de tu uso"</string>
     <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Tiempo restante: aproximadamente <xliff:g id="TIME_REMAINING">%1$s</xliff:g> en función de tu uso (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
     <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Tiempo restante: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
-    <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Debería durar aproximadamente hasta <xliff:g id="TIME">%1$s</xliff:g> según el uso (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+    <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Duración aproximada hasta <xliff:g id="TIME">%1$s</xliff:g> según el uso (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
     <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Debería durar aproximadamente hasta <xliff:g id="TIME">%1$s</xliff:g> según el uso"</string>
-    <string name="power_discharge_by" msgid="6453537733650125582">"Debería durar aproximadamente hasta <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+    <string name="power_discharge_by" msgid="6453537733650125582">"Duración aproximada hasta: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
     <string name="power_discharge_by_only" msgid="107616694963545745">"Debería durar aproximadamente hasta <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="1372817269546888804">"Hasta <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Tiempo restante: menos de <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
@@ -482,7 +446,7 @@
     <item msgid="1286113608943010849">"100%"</item>
   </string-array>
     <string name="charge_length_format" msgid="8978516217024434156">"Hace <xliff:g id="ID_1">%1$s</xliff:g>"</string>
-    <string name="remaining_length_format" msgid="7886337596669190587">"Falta <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="remaining_length_format" msgid="7886337596669190587">"Tiempo restante: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Pequeño"</string>
     <string name="screen_zoom_summary_default" msgid="2247006805614056507">"Predeterminado"</string>
     <string name="screen_zoom_summary_large" msgid="4835294730065424084">"Grande"</string>
diff --git a/packages/SettingsLib/res/values-es/arrays.xml b/packages/SettingsLib/res/values-es/arrays.xml
index db62655..52362de 100644
--- a/packages/SettingsLib/res/values-es/arrays.xml
+++ b/packages/SettingsLib/res/values-es/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Utilizar comprobación de HDCP solo para contenido DRM"</item>
     <item msgid="45075631231212732">"Utilizar siempre comprobación de HDCP"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (Predeterminada)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index 669871f..64b710a 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Conectada automáticamente a través de %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Conectado automáticamente a través de un proveedor de valoración de redes"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Conectado a través de %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> de <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Disponible a través de %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Toca para configurar"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Conexión sin Internet"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Sin Internet"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Debes iniciar sesión"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Punto de acceso temporalmente lleno"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Conectado a través de %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Disponible a través de %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"No se ha podido establecer conexión"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"URL del servidor OSU no válida"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"No se ha podido establecer conexión con el servidor OSU"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"No se ha podido validar el servidor OSU"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Certificado del servidor OSU no válido"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Aprovisionamiento anulado"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Aprovisionamiento no disponible"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"URL del servidor OSU no válida"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Tipo de comando inesperado"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Tipo de mensaje SOAP inesperado"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"No se ha podido completar el intercambio de mensajes SOAP"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"No se ha podido iniciar la recepción de redirección"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Se ha agotado el tiempo de espera de redirección"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"No se ha encontrado actividad de OSU"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Estado de mensaje SOAP inesperado"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"No se ha podido encontrar PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"No se ha podido encontrar el nodo raíz de confianza del servidor AAA"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"No se ha podido encontrar el nodo raíz de confianza del servidor de soluciones"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"No se ha podido encontrar el nodo raíz de confianza del servidor de políticas"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"No se han podido obtener certificados raíz de confianza"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"No se ha podido encontrar el certificado raíz de confianza del servidor AAA"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"No se ha podido añadir la configuración de PassPoint"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"No se ha podido encontrar ningún servidor OSU"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Conectando"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Conectado"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Estableciendo conexión con el servidor OSU"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Servidor OSU validado"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Se ha establecido conexión con el servidor OSU"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Intercambio SOAP inicial"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Esperando respuesta de redirección"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Respuesta de redirección recibida"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Segundo intercambio SOAP"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Tercer intercambio SOAP"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Obteniendo certificados raíz de confianza"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Aprovisionamiento completado"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Muy lenta"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Lenta"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"Aceptable"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Pantalla siempre encendida al cargar"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"La pantalla nunca entra en modo de suspensión si el dispositivo se está cargando"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Habilitar registro de Bluetooth HCI"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Capturar todos los paquetes de Bluetooth HCI de un archivo (Alterna la conexión Bluetooth después de cambiar esta opción)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Desbloqueo de OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Permitir desbloquear el bootloader"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"¿Permitir desbloqueo de OEM?"</string>
@@ -302,7 +266,7 @@
     <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Streaming: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
     <string name="select_private_dns_configuration_title" msgid="3700456559305263922">"DNS privado"</string>
     <string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Selecciona el modo de DNS privado"</string>
-    <string name="private_dns_mode_off" msgid="8236575187318721684">"No"</string>
+    <string name="private_dns_mode_off" msgid="8236575187318721684">"Desactivado"</string>
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automático"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"Nombre de host del proveedor de DNS privado"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Introduce el host del proveedor de DNS"</string>
diff --git a/packages/SettingsLib/res/values-et/arrays.xml b/packages/SettingsLib/res/values-et/arrays.xml
index 9c7873f..76a972d 100644
--- a/packages/SettingsLib/res/values-et/arrays.xml
+++ b/packages/SettingsLib/res/values-et/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Kasuta HDCP-kontrolli ainult DRM-sisu korral"</item>
     <item msgid="45075631231212732">"Kasuta alati HDCP-kontrollimist"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (vaikeseade)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index 0c9d28e..9008601 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Ühendus loodi automaatselt teenusega %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Ühendus loodi automaatselt võrgukvaliteedi hinnangute pakkuja kaudu"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Ühendatud üksuse %1$s kaudu"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> – <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Saadaval üksuse %1$s kaudu"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Puudutage seadistamiseks"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Ühendatud, Interneti-ühendus puudub"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Interneti-ühendus puudub"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Nõutav on sisselogimine"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Pääsupunkt on ajutiselt täis"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Ühendatud operaatori %1$s kaudu"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Saadaval operaatori %1$s kaudu"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Ühendamine ebaõnnestus"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"OSU serveri kehtetu URL"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU serveriga ühendamine ebaõnnestus"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU serveri valideerimine ebaõnnestus"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"OSU serveri kehtetu sertifikaat"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Ettevalmistamine katkestati"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Ettevalmistamine pole saadaval"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"OSU serveri kehtetu URL"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Ootamatu käsutüüp"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Ootamatu SOAP-sõnumi tüüp"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP-sõnumi saatmine ebaõnnestus"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Kuulaja ümbersuunamist ei saanud käivitada"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Ümbersuunamine aegus"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"OSU tegevusi ei leitud"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"SOAP-sõnumi ootamatu olek"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO-d ei leitud"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"AAA serveri usaldusväärset juursõlme ei leitud"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Abinõude serveri usaldusväärset juursõlme ei leitud"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Eeskirjade serveri usaldusväärset juursõlme ei leitud"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Usaldusväärseid juursertifikaate ei õnnestunud tuua"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"AAA serveri usaldusväärset juursertifikaati ei leitud"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"PassPointi konfiguratsiooni lisamine ebaõnnestus"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"OSU teenusepakkujat ei leitud"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Ühendamine"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Ühendatud"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Ühendamine OSU serveriga"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU server valideeriti"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Ühendatud OSU serveriga"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Esialgne SOAP-andmevahetus"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Otsevastuse ootel"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Saadi otsevastus"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Teine SOAP-andmevahetus"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Kolmas SOAP-andmevahetus"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Usaldusväärsete juursertifikaatide toomine"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Ettevalmistamine on lõpetatud"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Väga aeglane"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Aeglane"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"Hea"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Jää sisselülitatuks"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Ekraan ei lähe kunagi laadimise ajal unerežiimi"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Luba Bluetoothi HCI jälgimise logi"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Jäädvusta kõik failis olevad Bluetoothi HCI-paketid (pärast seade muutmist muutke Bluetoothi olekut)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM-i avamine"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Luba buudilaadur avada"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Kas lubada OEM-i avamine?"</string>
diff --git a/packages/SettingsLib/res/values-eu/arrays.xml b/packages/SettingsLib/res/values-eu/arrays.xml
index 4b76d59..90df354 100644
--- a/packages/SettingsLib/res/values-eu/arrays.xml
+++ b/packages/SettingsLib/res/values-eu/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Erabili HDCP egiaztapena DRM edukirako soilik"</item>
     <item msgid="45075631231212732">"Erabili beti HDCP egiaztapena"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (lehenetsia)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index 2687d1d..ae0fd47 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s bidez automatikoki konektatuta"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatikoki konektatuta sareen balorazioen hornitzailearen bidez"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s bidez konektatuta"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> (<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>)"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s bidez erabilgarri"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Sakatu konfiguratzeko"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Konektatuta; ezin da atzitu Internet"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Ez dago Interneteko konexiorik"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Saioa hasi behar da"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Sarbide-puntua beteta dago aldi baterako"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s bidez konektatuta"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"%1$s bidez erabilgarri"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Ezin izan da konektatu"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"OSU zerbitzariaren URLak ez du balio"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Ezin izan da konektatu OSU zerbitzarira"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Ezin izan da balidatu OSU zerbitzaria"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"OSU zerbitzariaren ziurtagiriak ez du balio"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Bertan behera utzi da hornitze-prozesua"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Ez dago horniketarik erabilgarri"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"OSU zerbitzariaren URLak ez du balio"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Ustekabeko agindu mota"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Ustekabeko SOAP mezu mota"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Ezin izan da trukatu SOAP mezua"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Ezin izan da abiarazi birbideratze-hautemailea"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Birbideratzea jasotzeko denbora-muga gainditu da"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Ez da aurkitu OSU jarduerarik"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"SOAP mezuaren ustekabeko egoera"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Ezin izan da aurkitu PPS-MO objektua"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Ezin izan da aurkitu AAA zerbitzariaren fidagarritasunaren erroko nodoa"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Ezin izan da aurkitu konponketa-zerbitzariaren fidagarritasunaren erroko nodoa"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Ezin izan da aurkitu gidalerro-zerbitzariaren fidagarritasunaren erroko nodoa"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Ezin izan dira eskuratu fidagarritasunaren erroko ziurtagiriak"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Ezin izan da aurkitu AAA zerbitzariaren fidagarritasunaren erroko ziurtagiria"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Ezin izan da gehitu PassPoint konfigurazioa"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Ezin izan da aurkitu OSU hornitzailerik"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Konektatzen"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Konektatuta"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"OSU zerbitzariarekin konektatzen"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Balidatu da OSU zerbitzaria"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"OSU zerbitzarira konektatuta"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Hasierako SOAP trukaketa"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Birbideratze-erantzunaren zain"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Jaso da birbideratze-erantzun bat"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Bigarren SOAP trukaketa"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Hirugarren SOAP trukaketa"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Fidagarritasunaren erroko ziurtagiriak eskuratzen"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Osatu da hornitze-prozesua"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Oso motela"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Motela"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"Ados"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Mantendu aktibo"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Pantaila ez da inoiz inaktibo ezarriko kargatu bitartean"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Gaitu Bluetooth HCI miatze-erregistroa"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Bildu fitxategi bateko Bluetooth HCI pakete guztiak (aldatu Bluetooth konexioaren egoera ezarpen hau aldatu ondoren)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM desblokeoa"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Onartu abiarazlea desblokeatzea"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM desblokeoa onartu nahi duzu?"</string>
diff --git a/packages/SettingsLib/res/values-fa/arrays.xml b/packages/SettingsLib/res/values-fa/arrays.xml
index 1e4d47f..85720e4 100644
--- a/packages/SettingsLib/res/values-fa/arrays.xml
+++ b/packages/SettingsLib/res/values-fa/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"‏استفاده از بررسی HDCP فقط برای محتوای DRM"</item>
     <item msgid="45075631231212732">"‏همیشه از بررسی HDCP استفاده شود"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"‏AVRCP نسخه ۱.۴ (پیش‌فرض)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index ec6200f..e9c9313 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"‏اتصال خودکار ازطریق %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"اتصال خودکار ازطریق ارائه‌دهنده رتبه‌بندی شبکه"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"‏متصل از طریق %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> از <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"‏در دسترس از طریق %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"برای راه‌اندازی ضربه بزنید"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"متصل، بدون اینترنت"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"عدم دسترسی به اینترنت"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"ورود به سیستم لازم است"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ظرفیت نقطه دسترسی موقتاً تکمیل شده است"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"‏متصل ازطریق %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"‏در دسترس ازطریق %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"اتصال ناموفق بود"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"‏نشانی وب سرور OSU نامعتبر است"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"‏اتصال سرور OSU ناموفق بود"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"‏تأییداعتبار سرور OSU ناموفق بود"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"‏گواهینامه سرور OSU نامعتبر است"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"ارائه لغو شد"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"ارائه امکان‌پذیر نیست"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"‏نشانی وب سرور OSU نامعتبر است"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"نوع فرمان غیرمنتظره"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"‏نوع پیام SOAP غیرمنتظره"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"‏تبادل پیام SOAP ناموفق بود"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"هدایت پاسخ تماس غیرهمزمان شروع نشد"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"مهلت انتظار برای هدایت تمام شد"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"‏فعالیت OSU پیدا نشد"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"‏وضعیت پیام SOAP غیرمنتظره"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"‏PPS-MO پیدا نشد"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"‏گره ریشه مطمئن برای سرور AAA پیدا نشد"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"گره ریشه مطمئن برای سرور جبران خسارت پیدا نشد"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"گروه ریشه مطمئن برای سرور خط‌مشی پیدا نشد"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"گواهینامه ریشه مطمئن بازیابی نشد"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"‏گواهینامه ریشه مطمئن برای سرور AAA پیدا نشد"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"‏پیکربندی PassPoint اضافه نشد"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"‏ارائه‌دهنده OSU پیدا نشد"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"درحال برقراری ارتباط"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"متصل"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"‏اتصال به سرور OSU"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"‏سرور OSU تأییداعتبار شد"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"‏متصل به سرور OSU"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"‏تبادل SOAP اولیه"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"درانتظار پاسخ هدایت"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"پاسخ هدایت دریافتی"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"‏تبادل SOAP دوم"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"‏تبادل SOAP سوم"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"بازیابی گواهینامه‌های ریشه مطمئن"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"ارائه کامل شد"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"بسیار آهسته"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"آهسته"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"تأیید"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"بیدار ماندن"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"صفحه هرگز در حین شارژ شدن به حالت خواب نمی‌رود"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"‏فعال کردن گزارش تجسس Bluetooth HCI"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"‏ضبط همه بسته‌های HCI بلوتوث‌ها در یک فایل (بعد از تغییر این تنظیم، بلوتوث را روشن/خاموش کنید)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"بازکردن سازنده تجهیزات اصلی"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"اجازه دهید قفل بوت‌لودر باز شود"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"‏بازکردن سازنده تجهیزات اصلی مجاز (OEM) است؟"</string>
diff --git a/packages/SettingsLib/res/values-fi/arrays.xml b/packages/SettingsLib/res/values-fi/arrays.xml
index 6bbddb2..33b1ffc 100644
--- a/packages/SettingsLib/res/values-fi/arrays.xml
+++ b/packages/SettingsLib/res/values-fi/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Käytä HDCP-tarkistusta vain DRM-suojatulle sisällölle."</item>
     <item msgid="45075631231212732">"Käytä aina HDCP-tarkistusta"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (oletus)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 174caef..3f9afb0 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Automaattinen yhteys muodostettu palvelun %1$s kautta"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Yhdistetty automaattisesti verkon arviointipalvelun kautta"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Yhdistetty seuraavan kautta: %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>: <xliff:g id="SSID">%1$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Käytettävissä seuraavan kautta: %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Määritä napauttamalla"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Yhdistetty, ei internetyhteyttä"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Ei internetyhteyttä"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Sisäänkirjautuminen vaaditaan"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Yhteyspiste tilapäisesti täynnä"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Yhdistetty, verkko: %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Käytettävissä, verkko: %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Yhteys katkesi"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Virheellinen OSU-palvelimen URL-osoite"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU-palvelimen yhteys epäonnistui"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU-palvelimen vahvistus epäonnistui"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Virheellinen OSU-palvelimen varmenne"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Käyttäjien hallinta keskeytetty"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Käyttäjien hallinta ei ole käytettävissä"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Virheellinen OSU-palvelimen URL-osoite"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Odottamaton komentotyyppi"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Odottamaton SOAP-viestityyppi"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP-viestinvaihto epäonnistui"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Uudelleenohjausten seurain ei käynnistynyt"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Aikakatkaistiin odottaessa uudelleenohjausta"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"OSU-toimintaa ei löytynyt"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Odottamaton SOAP-viestin tila"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO:ta ei löytynyt"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"AAA-palvelimelle ei löydetty luotettavaa pääsolmua"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Hyvityskeinopalvelimelle ei löydetty luotettavaa pääsolmua"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Käytäntöpalvelimelle ei löydetty luotettavaa pääsolmua"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Luotettavien juurivarmenteiden nouto epäonnistui"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"AAA-palvelimelle ei löydetty luotettavaa juurivarmennetta"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"PassPoint-määrityksen lisääminen epäonnistui"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"OSU-palveluntarjoajaa ei löytynyt"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Yhdistetään"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Yhdistetty"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Yhdistetään OSU-palvelimeen"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU-palvelin vahvistettu"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Yhdistetty OSU-palvelimeen"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Ensimmäinen SOAP-vaihto"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Odotetaan uudelleenohjausvastausta"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Uudelleenohjausvastaus vastaanotettu"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Toinen SOAP-vaihto"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Kolmas SOAP-vaihto"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Noudetaan luotettavia juurivarmenteita"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Käyttäjien hallinta valmis"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Hyvin hidas"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Hidas"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Pysy käynnissä"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Näyttö ei sammu puhelimen latautuessa."</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Ota Bluetoothin HCI-tarkkailuloki käyttöön"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Tallenna kaikki Bluetoothin HCl-paketit tiedostoon (ota Bluetooth käyttöön tämän asetuksen muuttamisen jälkeen)."</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM:n lukituksen avaus"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Salli käynnistysohjelman lukituksen avaaminen"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Sallitaanko OEM:n lukituksen avaus?"</string>
diff --git a/packages/SettingsLib/res/values-fr-rCA/arrays.xml b/packages/SettingsLib/res/values-fr-rCA/arrays.xml
index 2e7f2b2..145bd98 100644
--- a/packages/SettingsLib/res/values-fr-rCA/arrays.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Utiliser la vérification HDCP uniquement pour le contenu GDN"</item>
     <item msgid="45075631231212732">"Toujours utiliser la vérification HDCP"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (par défaut)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index f189d77..4fbc0ca 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatiquement connecté par %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Connecté automatiquement par le fournisseur d\'avis sur le réseau"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Connecté par %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> de <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Accessible par %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Touchez pour configurer"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connecté, aucun accès à Internet"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Aucune connexion Internet"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Connexion requise"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Le point d\'accès est temporairement plein"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Connecté par %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Accessible par %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Échec de connexion"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"URL de serveur OSU non valide"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Échec de la connexion avec le serveur OSU"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Échec de la validation du serveur OSU"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Certificat de serveur OSU non valide"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"L\'approvisionnement a été abandonné"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"L\'approvisionnement n\'est pas accessible"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"URL de serveur OSU non valide"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Type de commande inattendu"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Type de message SOAP inattendu"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Échec de l\'échange de messages SOAP"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Impossible de démarrer l\'écoute de redirection"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Délai d\'attente pour la redirection"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Aucune activité OSU trouvée"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"État de message SOAP inattendu"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Impossible de trouver PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Impossible de trouver le nœud racine de confiance pour le serveur AAA"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Impossible de trouver le nœud racine de confiance pour le serveur de recours"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Impossible de trouver le nœud racine de confiance pour le serveur de politiques"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Impossible de récupérer les certificats racine de confiance"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Impossible de trouver le certificat racine de confiance pour le serveur AAA"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Impossible d\'ajouter la configuration PassPoint"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Impossible de trouver un fournisseur OSU"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Connexion en cours…"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Connecté"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Connexion au serveur OSU en cours…"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Serveur OSU validé"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Connecté au serveur OSU"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Échange SOAP initial"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"En attente de la réponse de redirection…"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Réponse de redirection reçue"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Deuxième échange SOAP"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Échange SOAP tiers"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Récupération des certificats racine de confiance"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Approvisionnement terminé"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Très lente"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Lente"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Rester activé"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"L\'écran ne se met jamais en veille lors du chargement"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Activer le journal HCI Snoop Bluetooth"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Capturer tous les paquets HCI Bluetooth dans un fichier. (Faites basculer Bluetooth après le changement de ce paramètre.)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Déverrouillage par le fabricant"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Autoriser le déverrouillage du fichier d\'amorce"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Permettre le déverrouillage par le fabricant?"</string>
diff --git a/packages/SettingsLib/res/values-fr/arrays.xml b/packages/SettingsLib/res/values-fr/arrays.xml
index b14cf54..34cedd8 100644
--- a/packages/SettingsLib/res/values-fr/arrays.xml
+++ b/packages/SettingsLib/res/values-fr/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Utiliser la vérification HDCP uniquement pour le contenu DRM"</item>
     <item msgid="45075631231212732">"Toujours utiliser la vérification HDCP"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (par défaut)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index 97cc5aa..c4b8b3f 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Connecté automatiquement via %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Connecté automatiquement via un fournisseur d\'évaluation de l\'état du réseau"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Connecté via %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> par <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Disponible via %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Appuyer pour configurer"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connecté, aucun accès à Internet"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Aucun accès à Internet"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Connexion requise"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Point d\'accès temporairement plein"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Connecté via %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Disponible via %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Échec de la connexion"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"L\'URL du serveur OSU n\'est pas valide"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Échec de la connexion au serveur OSU"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Échec de la validation du serveur OSU"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Certificat du serveur OSU non valide"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Préparation annulée"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Préparation non disponible"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"L\'URL du serveur OSU n\'est pas valide"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Type de commande inattendu"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Type de message SOAP inattendu"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Échec de l\'échange de messages SOAP"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Échec du démarrage de l\'écouteur de redirection"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Délai dépassé ou en attente de redirection"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Aucune activité OSU trouvée"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"État inattendu du message SOAP"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Échec de la recherche de PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Échec de la recherche de nœud racine de confiance pour le serveur AAA"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Échec de la recherche de nœud racine de confiance pour le serveur de réparation"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Échec de la recherche de nœud racine de confiance pour le serveur de règles"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Échec de la récupération des certificats racine de confiance"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Échec de la recherche de certificat racine de confiance pour le serveur AAA"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Échec de l\'ajout de la configuration PassPoint"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Échec de la recherche de fournisseur OSU"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Connexion…"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Connecté"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Connexion au serveur OSU…"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Serveur OSU validé"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Connecté au serveur OSU"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Échange SOAP initial"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"En attente de la réponse de redirection…"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Réponse de redirection reçue"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Deuxième échange SOAP"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Troisième échange SOAP"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Récupération des certificats racine de confiance…"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Préparation terminée"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Très lente"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Lente"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"Correct"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Rester activé"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"L\'écran ne se met jamais en veille lors du chargement."</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Activer journaux HCI Bluetooth"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Enregistrer tous les paquets HCI Bluetooth dans un fichier (Activez/désactivez le Bluetooth après avoir modifié ce paramètre.)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Déverrouillage OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Autoriser le déverrouillage du chargeur d\'amorçage"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Autoriser le déverrouillage OEM ?"</string>
diff --git a/packages/SettingsLib/res/values-gl/arrays.xml b/packages/SettingsLib/res/values-gl/arrays.xml
index f8a69c2..a0bc977 100644
--- a/packages/SettingsLib/res/values-gl/arrays.xml
+++ b/packages/SettingsLib/res/values-gl/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Utiliza a comprobación HDCP só para contido DRM"</item>
     <item msgid="45075631231212732">"Utilizar sempre a comprobación HDCP"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (predeterminado)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index fb63a9d..786e2c5 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Conectouse automaticamente a través de %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Conectada automaticamente a través dun provedor de valoración de rede"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Conectado a través de %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> de <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Dispoñible a través de %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Toca aquí para configuralo"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Conexión sen Internet"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Non hai conexión a Internet"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"É obrigatorio iniciar sesión"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"O punto de acceso está temporalmente cheo"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Conectado a través de %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Dispoñible a través de %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Produciuse un erro coa conexión"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"URL do servidor OSU non-válido"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Produciuse un erro na conexión do servidor OSU"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Non se puido validar o servidor OSU"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Certificado do servidor OSU non-válido"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Abastecemento anulado"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Abastecemento non-dispoñible"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"URL do servidor OSU non-válido"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Tipo de comando inesperado"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Tipo de mensaxe SOAP inesperado"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Produciuse un erro no intercambio da mensaxe SOAP"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Non se puido iniciar a recepción de redirección"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Esgotouse o tempo de espera de redirección"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Non se encontrou a actividade de OSU"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Estado da mensaxe SOAP inesperado"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"No se puido encontrar PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"No se puido encontrar o nodo raíz de confianza do servidor AAA"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"No se puido encontrar o nodo raíz de confianza do servidor de solucións"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Non se puido encontrar o nodo raíz de confianza do servidor da política"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Produciuse un erro ao recuperar os certificados raíz de confianza"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Non se puido encontrar o certificado raíz de confianza do servidor AAA"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Non se puido engadir a configuración de PassPoint"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"No se puido encontrar ningún servidor OSU"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Conectando"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Conectado"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Conectándose ao servidor OSU"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Servidor OSU validado"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Conectado ao servidor OSU"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Intercambio SOAP inicial"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Agardando pola resposta de redirección"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Resposta de redirección recibida"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Segundo intercambio SOAP"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Terceiro intercambio SOAP"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Recuperando certificados raíz de confianza"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Abastecemento completado"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Moi lenta"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Lenta"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"Aceptar"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Pantalla activa"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"A pantalla nunca estará en modo de suspensión durante a carga"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Activar rexistro de busca HCI Bluetooth"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Captura todos os paquetes HCI Bluetooth nun ficheiro (activa/desactiva o Bluetooth despois de cambiar esta opción de configuración)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Desbloqueo do OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Permitir que se desbloqueo o cargador de inicio"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Queres permitir o desbloqueo do OEM?"</string>
diff --git a/packages/SettingsLib/res/values-gu/arrays.xml b/packages/SettingsLib/res/values-gu/arrays.xml
index ecf5525..92f52b8 100644
--- a/packages/SettingsLib/res/values-gu/arrays.xml
+++ b/packages/SettingsLib/res/values-gu/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"ફક્ત DRM કન્ટેન્ટ માટે HDCP તપાસનો ઉપયોગ કરો"</item>
     <item msgid="45075631231212732">"હંમેશા HDCP તપાસનો ઉપયોગ કરો"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (ડિફૉલ્ટ)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index 54fa7d1..492eaf0 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s દ્વારા સ્વત: કનેક્ટ થયેલ"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"નેટવર્ક રેટિંગ પ્રદાતા દ્વારા આપમેળે કનેક્ટ થયું"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s દ્વારા કનેક્ટ થયેલ"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>નું <xliff:g id="SSID">%1$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s દ્વારા ઉપલબ્ધ"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"સેટઅપ કરવા માટે ટૅપ કરો"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"કનેક્ટ કર્યું, કોઈ ઇન્ટરનેટ નથી"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"ઇન્ટરનેટ ઍક્સેસ નથી"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"સાઇન ઇન આવશ્યક"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ઍક્સેસ પૉઇન્ટ અસ્થાયીરૂપે ભરાયેલ છે"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s દ્વારા કનેક્ટ થયેલ"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"%1$s દ્વારા ઉપલબ્ધ"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"કનેક્શન નિષ્ફળ થયું"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"OSU સર્વરનું URL માન્ય નથી"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU સર્વર કનેક્ટ કરવામાં નિષ્ફ્ળતા મળી"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU સર્વર માન્ય કરવામાં નિષ્ફ્ળતા મળી"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"OSU સર્વરનું પ્રમાણપત્ર માન્ય નથી"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"જોગવાઈ કરવાનું રદ કરવામાં આવ્યું"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"જોગવાઈ કરવાનું ઉપલબ્ધ નથી"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"OSU સર્વરનું URL માન્ય નથી"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"આદેશનો અનપેક્ષિત પ્રકાર"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"SOAP સંદેશનો અનપેક્ષિત પ્રકાર"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP સંદેશ વિનિમયમાં નિષ્ફ્ળતા મળી"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"રીડાયરેક્ટ લિસનર શરૂ કરવામાં નિષ્ફ્ળતા મળી"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"રીડાયરેક્ટ કરવાની રાહ જોવાનો સમય સમાપ્ત થયો"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"કોઈ OSU પ્રવૃત્તિ મળી નથી"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"SOAP સંદેશનું અનપેક્ષિત સ્ટેટસ"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO શોધવામાં નિષ્ફ્ળતા મળી"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"AAA સર્વર માટે ટ્રસ્ટ રૂટ નોડ શોધવામાં નિષ્ફ્ળતા મળી"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"રેમિડીયેશન સર્વર માટે ટ્રસ્ટ રૂટ નોડ શોધવામાં નિષ્ફ્ળતા મળી"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"પૉલિસી સર્વર માટે ટ્રસ્ટ રૂટ નોડ શોધવામાં નિષ્ફ્ળતા મળી"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"ટ્રસ્ટ રૂટ પ્રમાણપત્રો ફરી મેળવવામાં નિષ્ફ્ળતા મળી"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"AAA સર્વર માટે ટ્રસ્ટ રૂટ પ્રમાણપત્ર શોધવામાં નિષ્ફ્ળતા મળી"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"PassPoint ગોઠવણી ઉમેરવામાં નિષ્ફ્ળતા મળી"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"OSU પ્રદાતા શોધવામાં નિષ્ફ્ળતા મળી"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"કનેક્ટ થઈ રહ્યું છે"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"કનેક્ટેડ"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"OSU સર્વર સાથે કનેક્ટ કરી રહ્યાં છીએ"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU સર્વર માન્ય કરવામાં આવેલ"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"OSU સર્વર સાથે કનેક્ટ કરેલ છે"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"પ્રારંભિક SOAP વિનિમય"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"રીડાયરેક્ટ કરવા માટેના પ્રતિસાદની રાહ જુએ છે"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"રીડાયરેક્ટ કરવા માટેનો પ્રતિસાદ પ્રાપ્ત થયો"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"દ્વિતીય SOAP વિનિમય"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"તૃતીય SOAP વિનિમય"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"ટ્રસ્ટ રૂટ પ્રમાણપત્રો ફરી મેળવાઈ રહ્યાં છે"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"જોગવાઈ કરવાનું પૂર્ણ થયું"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"ખૂબ જ ધીમી"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"ધીમી"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"ઓકે"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"સક્રિય રાખો"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"ચાર્જિંગ દરમિયાન સ્ક્રીન ક્યારેય નિષ્ક્રિય થશે નહીં"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"બ્લૂટૂથ HCI સ્નૂપ લૉગ ચાલુ કરો"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"ફાઇલમાં બધા બ્લૂટૂથ HCI પૅકેટને કૅપ્ચર કરો (આ સેટિંગ બદલ્યા પછી બ્લૂટૂથને ટૉગલ કરો)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM અનલૉકિંગ"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"બુટલોડર અનલૉક કરવાની મંજૂરી આપો"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM ને અનલૉક કરવાની મંજૂરી આપીએ?"</string>
diff --git a/packages/SettingsLib/res/values-hi/arrays.xml b/packages/SettingsLib/res/values-hi/arrays.xml
index d1d0157..dd5ef6c 100644
--- a/packages/SettingsLib/res/values-hi/arrays.xml
+++ b/packages/SettingsLib/res/values-hi/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"एचडीसीपी जाँच का उपयोग केवल डीआरएम सामग्री के लिए करें"</item>
     <item msgid="45075631231212732">"हमेशा HDCP जाँच का उपयोग करें"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"एवीआरसीपी 1.4 (डिफ़ॉल्ट)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index 0aba3f6..c32a039 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s के ज़रिए ऑटोमैटिक रूप से कनेक्ट है"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"नेटवर्क रेटिंग प्रदाता के ज़रिए अपने आप कनेक्ट है"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s के द्वारा उपलब्ध"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g> का <xliff:g id="SSID">%1$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s के द्वारा उपलब्ध"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"सेट अप करने के लिए टैप करें"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"कनेक्ट हो गया है, लेकिन इंटरनेट नहीं है"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"इंटरनेट कनेक्शन नहीं है"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"साइन इन करना ज़रूरी है"</string>
-    <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"एक्सेस प्वाइंट फ़िलहाल भरा हुआ है"</string>
+    <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"एक्सेस पॉइंट फ़िलहाल भरा हुआ है"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s के ज़रिए कनेक्ट"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"%1$s के ज़रिए उपलब्ध"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"कनेक्‍शन नहीं जोड़ा जा सका"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"अमान्य ओएसयू सर्वर यूआरएल"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"ओएसयू सर्वर कनेक्शन नहीं जुड़ा"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"ओएसयू सर्वर की पुष्टि नहीं हो सकी"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"अमान्य ओएसयू सर्वर सर्टिफ़िकेट"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"प्रावधान रद्द किया गया"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"प्रावधान उपलब्ध नहीं है"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"अमान्य ओएसयू सर्वर यूआरएल"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"ऐसा निर्देश जिसकी उम्मीद नहीं थी"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"ऐसा एसओएपी मैसेज जिसकी उम्मीद नहीं थी"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"एसओएपी मैसेज एक्सचेंज नहीं हो सका"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"रीडायरेक्ट लिसनर चालू नहीं हुआ"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"रीडायरेक्ट के लिए इंतज़ार करते हुए समय खत्म"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"कोई ओएसयू गतिविधि नहीं मिली"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"ऐसी एसओएपी मैसेज स्थिति, जिसकी उम्मीद नहीं थी"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"पीपीएस-एमओ नहीं मिला"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"एएए सर्वर के लिए भरोसेमंद रूट नोड नहीं मिला"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"रिमीडीएशन सर्वर के लिए भरोसेमंद रूट नोड नहीं मिला"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"पॉलिसी सर्वर के लिए भरोसेमंद रूट नोड नहीं मिला"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"भरोसेमंद रूट सर्टिफ़िकेट वापस नहीं लाए जा सके"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"एएए सर्वर के लिए भरोसेमंद रूट सर्टिफ़िकेट नहीं मिला"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"PassPoint कॉन्फ़िगरेशन नहीं जोड़ा जा सका"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"ओएसयू प्रोवाइडर नहीं मिला"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"कनेक्‍ट हो रहा है"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"जुड़ गया है"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"ओएसयू सर्वर से जोड़ा जा रहा है"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"ओएसयू सर्वर की पुष्टि की गई"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"ओएसयू सर्वर से कनेक्ट किया गया है"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"शुरुआती एसओएपी एक्सचेंज"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"रीडायरेक्ट जवाब का इंतज़ार किया जा रहा है"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"रीडायरेक्ट जवाब मिला"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"दूसरा एसओएपी एक्सचेंज"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"तीसरा एसओएपी एक्सचेंज"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"भरोसेमंद रूट सर्टिफ़िकेट वापस लाए जा रहे हैं"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"प्रावधान पूरा हुआ"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"अत्‍यधिक धीमी"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"धीमी"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"ठीक है"</string>
@@ -173,8 +136,8 @@
     <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"फ़ाइल स्‍थानांतरण के लिए उपयोग करें"</string>
     <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"इनपुट के लिए उपयोग करें"</string>
     <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"सुनने में मददगार डिवाइस के लिए इस्तेमाल करें"</string>
-    <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"युग्‍म बनाएं"</string>
-    <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"दूसरे डिवाइस से जोड़ें"</string>
+    <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"जोड़ें"</string>
+    <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"जोड़ें"</string>
     <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"रद्द करें"</string>
     <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"कनेक्ट होने पर, पेयरिंग से आपके संपर्कों और कॉल इतिहास तक पहुंचा जा सकता है."</string>
     <string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> के साथ युग्‍मित नहीं हो सका."</string>
@@ -262,7 +225,7 @@
     <string name="development_settings_not_available" msgid="4308569041701535607">"यह उपयोगकर्ता, डेवलपर के लिए सेटिंग और टूल का इस्तेमाल नहीं कर सकता"</string>
     <string name="vpn_settings_not_available" msgid="956841430176985598">"VPN सेटिंग इस उपयोगकर्ता के लिए उपलब्ध नहीं हैं"</string>
     <string name="tethering_settings_not_available" msgid="6765770438438291012">"टेदरिंग सेटिंग इस उपयोगकर्ता के लिए उपलब्ध नहीं हैं"</string>
-    <string name="apn_settings_not_available" msgid="7873729032165324000">"एक्सेस प्वाइंट नाम सेटिंग इस उपयोगकर्ता के लिए मौजूद नहीं हैं"</string>
+    <string name="apn_settings_not_available" msgid="7873729032165324000">"एक्सेस पॉइंट के नाम की सेटिंग इस उपयोगकर्ता के लिए मौजूद नहीं हैं"</string>
     <string name="enable_adb" msgid="7982306934419797485">"USB डीबग करना"</string>
     <string name="enable_adb_summary" msgid="4881186971746056635">"डीबग मोड जब USB कनेक्‍ट किया गया हो"</string>
     <string name="clear_adb_keys" msgid="4038889221503122743">"USB डीबग करने की मंज़ूरी रद्द करें"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"स्क्रीन को चालू रखें"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"चार्ज करते समय स्‍क्रीन कभी भी कम बैटरी मोड में नहीं जाएगी"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"ब्लूटूथ एचसीआई स्‍नूप लॉग चालू करें"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"सभी ब्लूटूथ एचसीआई पैकेट एक फ़ाइल में कैप्चर करें (यह सेटिंग बदलने के बाद ब्लूटूथ टॉगल करें)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"ओईएम अनलॉक करना"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"बूटलोडर को अनलाॅक किए जाने की अनुमति दें"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM अनलॉक करने की अनुमति दें?"</string>
diff --git a/packages/SettingsLib/res/values-hr/arrays.xml b/packages/SettingsLib/res/values-hr/arrays.xml
index 893a0c1..fcf0e09 100644
--- a/packages/SettingsLib/res/values-hr/arrays.xml
+++ b/packages/SettingsLib/res/values-hr/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Upotrebljavaj HDCP provjeru samo za DRM sadržaj"</item>
     <item msgid="45075631231212732">"Uvijek upotrebljavaj HDCP provjeru"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (zadano)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index 5a48ffd..8b23875 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatski povezan putem %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatski povezan putem ocjenjivača mreže"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Povezano putem %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g>, <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Dostupno putem %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Dodirnite za postavljanje"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Povezano, bez interneta"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Nema interneta"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Obavezna prijava"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Pristupna je točka privremeno puna"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Povezano putem mreže %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Dostupno putem mreže %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Povezivanje nije uspjelo"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Nevažeći URL OSU poslužitelja"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Veza s OSU poslužiteljem nije uspjela"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Ovjera OSU poslužitelja nije uspjela"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Nevažeći certifikat OSU poslužitelja"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Davanje pristupa je prekinuto"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Pružanje usluga nije dostupno"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Nevažeći URL OSU poslužitelja"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Neočekivana vrsta naredbe"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Neočekivana vrsta SOAP poruke"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Razmjena SOAP poruke nije uspjela"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Nije moguće pokrenuti osluškivač preusmjeravanja"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Isteklo je vrijeme čekanja za preusmjeravanje"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Nije pronađena OSU aktivnost"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Neočekivana poruka o statusu SOAP-a"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Nije pronađen PPS MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Nije pronađen pouzdani korijenski čvor za AAA poslužitelj"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Nije pronađen pouzdani korijenski čvor za poslužitelj za popravak"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Nije pronađen pouzdani korijenski čvor za poslužitelj za pravila"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Dohvaćanje pouzdanih korijenskih certifikata nije uspjelo"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Nije pronađen pouzdani korijenski certifikat za AAA poslužitelj"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Dodavanje konfiguracije PassPointa nije uspjelo"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Nije pronađen OSU davatelj usluga"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Povezivanje"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Povezano"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Povezivanje s OSU poslužiteljem"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Potvrđen je OSU poslužitelj"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Povezano s OSU poslužiteljem"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Početna razmjena SOAP-a"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Čekanje na odgovor o preusmjeravanju"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Primljen je odgovor o preusmjeravanju"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Druga razmjena SOAP-a"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Treća razmjena SOAP-a"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Dohvaćanje pouzdanih korijenskih certifikata"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Dovršeno je davanje pristupa"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Vrlo sporo"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Sporo"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"U redu"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Ne pokreći mirovanje"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Zaslon nikad neće prijeći u mirovanje tijekom punjenja"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Zapisi za Bluetooth HCI"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Snimi sve Bluetooth HCI pakete u datoteci (uključite/isključite Bluetooth nakon promjene te postavke)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM otključavanje"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Neka kôd za pokretanje sustava bude otključan"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Želite li dopustiti OEM otključavanje?"</string>
diff --git a/packages/SettingsLib/res/values-hu/arrays.xml b/packages/SettingsLib/res/values-hu/arrays.xml
index bfd70e9..2e02a59 100644
--- a/packages/SettingsLib/res/values-hu/arrays.xml
+++ b/packages/SettingsLib/res/values-hu/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Csak DRM-tartalomhoz használjon HDCP ellenőrzést"</item>
     <item msgid="45075631231212732">"Mindig használjon HDCP ellenőrzést"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (alapértelmezett)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index 1fa7f6a..589aa40 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatikusan csatlakozott a következőn keresztül: %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatikusan csatlakozott a hálózatértékelés szolgáltatóján keresztül"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Csatlakozva a következőn keresztül: %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>: <xliff:g id="SSID">%1$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Elérhető a következőn keresztül: %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Koppintson ide a beállításhoz"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Csatlakozva, nincs internet-hozzáférés"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Nincs internetkapcsolat"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Bejelentkezést igényel"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"A hozzáférési pont átmenetileg megtelt"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Csatlakozva a következőn keresztül: %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Elérhető a következőn keresztül: %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Sikertelen kapcsolódás"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Érvénytelen az OSU-szerver URL-je"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Nem sikerült csatlakozni az OSU-szerverhez"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Nem sikerült az OSU-szerver ellenőrzése"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Érvénytelen az OSU-szerver tanúsítványa"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Hozzárendelés megszakítva"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"A hozzárendelés nem lehetséges"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Érvénytelen az OSU-szerver URL-je"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Váratlan parancstípus"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Váratlan SOAP-üzenettípus"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Sikertelen SOAP-üzenetváltás"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Nem sikerült elindítani az átirányítási eseményfigyelőt"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Időtúllépés az átirányításra várakozás közben"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Nem található OSU-tevékenység"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Váratlan SOAP-üzenetállapot"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Nem található PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Nem található az AAA-szerver megbízható gyökércsomópontja"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Nem található a szerverkiszolgáló megbízható gyökércsomópontja"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Nem található a házirendszerver megbízható gyökércsomópontja"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Nem sikerült a megbízható gyökérszintű tanúsítványok lekérése"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Nem található az AAA-szerver megbízható gyökértanúsítványa"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Nem sikerült a PassPoint-konfiguráció hozzáadása"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Nem található OSU-szolgáltató"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Csatlakozás…"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Csatlakozva"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Csatlakozás az OSU-szerverhez…"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU-szerver ellenőrizve"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Csatlakoztatva az OSU-szerverhez"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Első SOAP-üzenetváltás"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Várakozás az átirányítási válaszra…"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Átirányítási válasz érkezett"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Második SOAP-üzenetváltás"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Harmadik SOAP-üzenetváltás"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Megbízható gyökérszintű tanúsítványok lekérése…"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Hozzárendelés kész"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Nagyon lassú"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Lassú"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"Rendben"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Nem kapcsolódik ki"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"A képernyő soha nem kapcsol ki töltés során"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Bluetooth HCI snoop napló engedélyezése"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Az összes Bluetooth HCI-csomag rögzítése egy fájlban (Bluetooth bekapcsolása a beállítás módosítása után)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM-feloldás"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"A rendszerbetöltő feloldásának engedélyezése"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Engedélyezi az OEM-feloldást?"</string>
diff --git a/packages/SettingsLib/res/values-hy/arrays.xml b/packages/SettingsLib/res/values-hy/arrays.xml
index 08c871c..1e1f4bf 100644
--- a/packages/SettingsLib/res/values-hy/arrays.xml
+++ b/packages/SettingsLib/res/values-hy/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Օգտագործել HDCP-ը` միայն DRM-ի բովանդակությունը ստուգելու համար"</item>
     <item msgid="45075631231212732">"Միշտ օգտագործել HDCP ստուգումը"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (կանխադրված)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index 02a24fe..eb06172 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Ավտոմատ կերպով կապակցվել է %1$s-ի միջոցով"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Ավտոմատ կերպով միացել է ցանցի վարկանիշի ծառայության մատակարարի միջոցով"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Կապակցված է %1$s-ի միջոցով"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"«<xliff:g id="SSID">%1$s</xliff:g>», <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Հասանելի է %1$s-ի միջոցով"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Հպեք՝ կարգավորելու համար"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Միացված է, սակայն ինտերնետ կապ չկա"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Ինտերնետ կապ չկա"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Անհրաժեշտ է մուտք գործել"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Հասանելիության կետը ժամանակավորապես լիքն է"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Միացված է %1$s-ի միջոցով"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Հասանելի է %1$s-ի միջոցով"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Չհաջողվեց միանալ"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"OSU սերվերի անվավեր URL"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Չհաջողվեց միանալ OSU սերվերին"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Չհաջողվեց ստուգել OSU սերվերը"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"OSU սերվերի անվավեր հավաստագիր"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Համաժամեցումն ընդհատվեց"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Համաժամեցումն անհասանելի է"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"OSU սերվերի անվավեր URL"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Հրահանգի անհայտ տեսակ"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"SOAP հաղորդագրության անհայտ տեսակ"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Չհաջողվեց փոխանակել SOAP հաղորդագրությունները"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Չհաջողվեց գործարկել վերահասցեավորվող զանգերի ընդունիչը"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Սպասման ժամանակը լրացել է"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"OSU գործողություններ չեն հայտնաբերվել"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"SOAP հաղորդագրության անհայտ կարգավիճակ"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Չհաջողվեց գտնել PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Չհաջողվեց գտնել AAA սերվերի վստահված արմատային հանգույցը"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Չհաջողվեց գտնել ուղղումների սերվերի վստահված արմատային հանգույցը"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Չհաջողվեց գտնել կանոնների սերվերի վստահված արմատային հանգույցը"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Չհաջողվեց բեռնել վստահված արմատային հավաստագրերը"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Չհաջողվեց գտնել AAA սերվերի վստահված արմատային հավաստագիրը"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Չհաջողվեց ավելացնել PassPoint-ի կարգավորումները"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Չհաջողվեց գտնել OSU-ի մատակարարին"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Միացում"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Միացած է"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Միացում OSU սերվերին"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU սերվերը ստուգված է"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Միացած է OSU սերվերին"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Առաջին փոխանակումը SOAP-ով"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Վերահասցեավորվող պատասխանի սպասում"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Պատասխանը ստացված է"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Երկրորդ փոխանակում SOAP-ով"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Երրորդ փոխանակում SOAP-ով"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Վստահված արմատային հավաստագրերը բեռնվում են"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Համաժամեցումն ավարտված է"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Շատ դանդաղ"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Դանդաղ"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"Հաստատել"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Մնալ արթուն"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Էկրանը երբեք չի քնի լիցքավորման ընթացքում"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Միացնել Bluetooth HCI snoop log-ը"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Բոլոր Bluetooth HCI փաթեթները պահել մեկ ֆայլում (այս կարգավորումը փոխելուց հետո անհրաժեշտ է վերագործարկել Bluetooth-ը)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM ապակողպում"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Թույլ տալ սկզբնաբեռնման բեռնիչի ապակողպումը"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Թույլատրե՞լ OEM ապակողպումը:"</string>
diff --git a/packages/SettingsLib/res/values-in/arrays.xml b/packages/SettingsLib/res/values-in/arrays.xml
index 8b8057b..8d858a5 100644
--- a/packages/SettingsLib/res/values-in/arrays.xml
+++ b/packages/SettingsLib/res/values-in/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Gunakan pemeriksaan HDCP untuk konten DRM saja"</item>
     <item msgid="45075631231212732">"Selalu gunakan pemeriksaan HDCP"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (Default)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index 6b901ff..208508e 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Tersambung otomatis melalui %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Otomatis tersambung melalui penyedia rating jaringan"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Terhubung melalui %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> oleh <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Tersedia melalui %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Tap untuk menyiapkan"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Tersambung, tidak ada internet"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Tidak ada internet"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Perlu login"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Titik akses penuh untuk sementara"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Tersambung melalui %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Tersedia melalui %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Koneksi gagal"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"URL server OSU tidak valid"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Koneksi server OSU gagal"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Validasi server OSU gagal"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Sertifikat server OSU tidak valid"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Provisioning dibatalkan"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Provisioning tidak tersedia"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"URL server OSU tidak valid"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Jenis perintah yang tidak terduga"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Jenis pesan SOAP yang tidak terduga"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Pertukaran pesan SOAP gagal"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Listener pengalihan gagal dimulai"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Waktu tunggu pengalihan habis"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Tidak ditemukan aktivitas OSU"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Status pesan SOAP yang tidak terduga"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Gagal menemukan PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Gagal menemukan node root tepercaya untuk server AAA"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Gagal menemukan node root tepercaya untuk server perbaikan"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Gagal menemukan node root tepercaya untuk server kebijakan"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Gagal mengambil root certificate tepercaya"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Gagal menemukan root certificate tepercaya untuk server AAA"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Gagal menambahkan konfigurasi PassPoint"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Gagal menemukan penyedia OSU"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Menghubungkan"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Tersambung"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Menyambungkan ke server OSU"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Server OSU divalidasi"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Tersambung ke server OSU"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Pertukaran SOAP awal"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Menunggu respons pengalihan"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Respons pengalihan diterima"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Pertukaran SOAP kedua"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Pertukaran SOAP ketiga"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Mengambil root certificate tepercaya"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Provisioning selesai"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Sangat Lambat"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Lambat"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"Oke"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Tetap terjaga"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Layar tidak akan redup selama mengisi daya"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Aktifkan log pengintaian HCI Bluetooth"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Mengambil semua paket HCI Bluetooth dalam satu file (Aktifkan Bluetooth setelah mengubah setelan ini)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Buka kunci OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Izinkan bootloader dibuka kuncinya"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Izinkan buka kunci OEM?"</string>
diff --git a/packages/SettingsLib/res/values-is/arrays.xml b/packages/SettingsLib/res/values-is/arrays.xml
index b073371..16d5b8a4 100644
--- a/packages/SettingsLib/res/values-is/arrays.xml
+++ b/packages/SettingsLib/res/values-is/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Nota HDCP-athugun aðeins fyrir höfundarréttarvarið efni"</item>
     <item msgid="45075631231212732">"Nota alltaf HDCP-eftirlit"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (sjálfgefið)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index ae31d6b..ffa3ddc 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Sjálfkrafa tengt um %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Sjálfkrafa tengt um netgæðaveitu"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Tengt í gegnum %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> með <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Í boði í gegnum %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Ýttu til að setja upp"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Tengt, enginn netaðgangur"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Engin nettenging"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Innskráningar krafist"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Aðgangsstaður tímabundið fullur"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Tengt í gegnum %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Í boði í gegnum %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Tenging mistókst"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Ógild vefslóð OSU-þjóns"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Tenging OSU-þjóns mistókst"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Staðfesting OSU-þjóns mistókst"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Ógilt vottorð OSU-þjóns"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Hætt við úthlutun"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Úthlutun ekki tiltæk"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Ógild vefslóð OSU-þjóns"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Óvænt tegund skipunar"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Óvænt gerð SOAP- skilaboða"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Skipti SOAP-skilaboða mistókust"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Ekki tókst að ræsa framsenda hlustunarþjónustu"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Tímamörk runnu út við að bíða eftir framsendingu"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Engin OSU-virkni fannst"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Óvænt staða SOAP-skilaboða"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Ekki tókst að finna PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Ekki tókst að finna traustan rótarhnút fyrir AAA-þjón"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Ekki tókst að finna traustan rótarhnút fyrir úrbótaþjón"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Ekki tókst að finna traustan rótarhnút fyrir regluþjón"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Ekki tókst að sækja traust rótarvottorð"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Ekki tókst að finna traust rótarvottorð fyrir AAA-þjón"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Ekki tókst að bæta við PassPoint-stillingu"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Ekki tókst að finna OSU-veitu"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Tengist"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Tengt"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Tengist við OSU-þjón"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU-þjónn staðfestur"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Tengt við OSU-þjón"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Fyrstu SOAP-skipti"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Bíður eftir framsendu svari"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Framsent svar móttekið"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Önnur SOAP-skipti"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Þriðju SOAP-skipti"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Sækir traust rótarvottorð"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Úthlutun lokið"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Mjög hægt"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Hægt"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"Í lagi"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Vaka"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Skjárinn fer aldrei í hvíld við hleðslu"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Gera HCI-snuðraraskrá Bluetooth virka"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Fanga alla HCI-pakka Bluetooth í skrá (Velja skal Bluetooth eftir að þessari stillingu er breytt)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Opnun framleiðanda"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Leyfa opnun ræsiforritsins"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Leyfa opnun framleiðanda?"</string>
diff --git a/packages/SettingsLib/res/values-it/arrays.xml b/packages/SettingsLib/res/values-it/arrays.xml
index 6e9628c..555cd1c 100644
--- a/packages/SettingsLib/res/values-it/arrays.xml
+++ b/packages/SettingsLib/res/values-it/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Usa la verifica HDCP solo per contenuti DRM"</item>
     <item msgid="45075631231212732">"Usa sempre la verifica HDCP"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (predefinita)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index 44acbcb..a370ad1 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Collegato automaticamente tramite %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Collegato automaticamente tramite fornitore di servizi di valutazione rete"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Collegato tramite %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> di <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Disponibile tramite %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Tocca per configurare"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connesso, senza Internet"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Nessuna connessione a Internet"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Accesso richiesto"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Punto di accesso momentaneamente al completo"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Connesso tramite %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Disponibile tramite %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Connessione non riuscita"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"URL del server OSU non valido"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Connessione al server OSU non riuscita"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Convalida del server OSU non riuscita"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Certificato server OSU non valido"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Provisioning interrotto"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Provisioning non disponibile"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"URL del server OSU non valido"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Tipo di comando imprevisto"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Tipo di messaggio SOAP imprevisto"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Scambio messaggi SOAP non riuscito"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Avvio del listener di reindirizzamento non riuscito"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Timeout durante l\'attesa del reindirizzamento"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Nessuna attività OSU rilevata"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Stato imprevisto del messaggio SOAP"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Individuazione di PPS-MO non riuscita"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Individuazione del nodo radice di attendibilità per il server AAA non riuscita"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Individuazione del nodo radice di attendibilità per il server di correzione non riuscita"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Individuazione del nodo radice di attendibilità per il server delle norme non riuscita"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Recupero dei certificati radice di attendibilità non riuscito"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Individuazione del certificato radice di attendibilità per il server AAA non riuscita"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Aggiunta della configurazione PassPoint non riuscita."</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Individuazione di un provider OSU non riuscita"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Connessione"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Connesso"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Connessione al server OSU"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Server OSU convalidato"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Connessione con server OSU stabilita"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Scambio SOAP iniziale"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"In attesa della risposta di reindirizzamento"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"È stata ricevuta una risposta di reindirizzamento"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Secondo scambio SOAP"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Terzo scambio SOAP"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Recupero dei certificati radice di attendibilità"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Provisioning completato"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Molto lenta"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Lenta"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Rimani attivo"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Lo schermo non va mai in stand-by se sotto carica"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Attiva log di esame HCI Bluetooth"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Acquisisci tutti i pacchetti HCI Bluetooth in un file (attiva/disattiva il Bluetooth dopo aver modificato questa impostazione)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Sblocco OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Consenti lo sblocco del bootloader"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Consentire lo sblocco OEM?"</string>
diff --git a/packages/SettingsLib/res/values-iw/arrays.xml b/packages/SettingsLib/res/values-iw/arrays.xml
index 8b6b8ca..4ad9b34 100644
--- a/packages/SettingsLib/res/values-iw/arrays.xml
+++ b/packages/SettingsLib/res/values-iw/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"‏השתמש בבדיקת HDCP עבור תוכן DRM בלבד"</item>
     <item msgid="45075631231212732">"‏תמיד השתמש בבדיקת HDCP"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"‏AVRCP 1.4 (ברירת המחדל)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index 5ae1321..04fd750 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"‏מחובר אוטומטית דרך %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"מחובר אוטומטית דרך ספק של דירוג רשת"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"‏מחובר דרך %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> של <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"‏זמינה דרך %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"יש להקיש כדי להגדיר"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"מחובר. אין אינטרנט"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"אין אינטרנט"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"נדרשת כניסה"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"נקודת הגישה מלאה באופן זמני"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"‏מחובר לרשת של %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"‏זמינה דרך %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"החיבור נכשל"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"‏כתובת URL לא חוקית של שרת OSU"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"‏נכשל חיבור לשרת OSU"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"‏נכשל אימות של שרת OSU"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"‏אישור לא חוקי של שרת OSU"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"ניהול תצורה בוטל"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"ניהול תצורה לא זמין"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"‏כתובת URL לא חוקית של שרת OSU"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"סוג פקודה לא צפוי"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"‏סוג הודעה לא צפוי של SOAP"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"‏נכשלו חילופין של הודעת SOAP"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"נכשלה התחלה של הפניה אוטומטית של מאזין"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"תם פרק הזמן הקצוב לתפוגה בהמתנה להפניה אוטומטית"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"‏לא נמצאה פעילות OSU"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"‏סטטוס לא צפוי של הודעת SOAP"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"‏נכשלה מציאה של PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"‏נכשלה מציאה של צומת בסיס למהימנות עבור שרת AAA"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"נכשלה מציאה של צומת בסיס למהימנות עבור שרת תיקון"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"נכשלה מציאה של צומת בסיס למהימנות עבור שרת מדיניות"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"נכשל אחזור של אישורי בסיס למהימנות"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"‏נכשלה מציאה של אישור בסיס למהימנות עבור שרת AAA"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"‏נכשלה הוספה של הגדרת PassPoint"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"‏נכשלה מציאה של ספק OSU"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"מתבצעת התחברות"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"מחובר"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"‏מתבצע חיבור לשרת OSU"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"‏שרת OSU אומת"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"‏יש חיבור לשרת OSU"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"‏חילופי SOAP ראשוניים"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"בהמתנה לתגובה להפניה אוטומטית"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"התקבלה תגובה להפניה אוטומטית"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"‏חילופי SOAP בפעם השנייה"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"‏חילופי SOAP בפעם השלישית"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"מתבצע אחזור של אישורי בסיס למהימנות"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"ניהול תצורה הושלם"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"איטית מאוד"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"איטית"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"אישור"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"השאר פועל"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"המסך לעולם לא יהיה במצב שינה במהלך טעינה"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"‏הפעלת Snoop Log של Bluetooth HCI"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"‏איחוד של כל חבילות Bluetooth HCI בקובץ (יש להחליף מצב Bluetooth לאחר שינוי הגדרה זו)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"‏ביטול נעילה של OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"אפשר ביטול של נעילת מנהל האתחול"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"‏האם לאפשר ביטול נעילה של OEM (יצרן ציוד מקורי)?"</string>
diff --git a/packages/SettingsLib/res/values-ja/arrays.xml b/packages/SettingsLib/res/values-ja/arrays.xml
index e860b42..978f6da 100644
--- a/packages/SettingsLib/res/values-ja/arrays.xml
+++ b/packages/SettingsLib/res/values-ja/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"DRMコンテンツにのみHDCPチェックを使用する"</item>
     <item msgid="45075631231212732">"HDCPチェックを常に使用する"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4(デフォルト)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index 25308cf..9699e86 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s 経由で自動的に接続しています"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"ネットワーク評価プロバイダ経由で自動的に接続しています"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s経由で接続"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g>(<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>)"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s経由で使用可能"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"設定するにはタップします"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"接続済み、インターネット接続なし"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"インターネット未接続"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"ログインが必要"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"アクセス ポイントが一時的にいっぱいです"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s 経由で接続済み"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"%1$s 経由で使用可能"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"接続できませんでした"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"OSU サーバーの URL が無効です"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU サーバーに接続できませんでした"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU サーバーの検証に失敗しました"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"OSU サーバー証明書が無効です"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"プロビジョニングが中断されました"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"プロビジョニングは利用できません"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"OSU サーバーの URL が無効です"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"予期しないコマンドタイプです"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"予期しない SOAP メッセージ タイプです"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP メッセージの交換に失敗しました"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"リダイレクト リスナーを起動できませんでした"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"リダイレクトの待機中にタイムアウトになりました"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"OSU アクティビティが見つかりませんでした"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"予期しない SOAP メッセージ ステータスです"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO が見つかりませんでした"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"AAA サーバー用の信頼できるルートノードが見つかりませんでした"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"修復サーバー用の信頼できるルートノードが見つかりませんでした"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"ポリシー サーバー用の信頼できるルートノードが見つかりませんでした"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"信頼できるルート証明書を取得できませんでした"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"AAA サーバー用の信頼できるルート証明書が見つかりませんでした"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"PassPoint 設定を追加できませんでした"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"OSU プロバイダが見つかりませんでした"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"接続しています"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"接続しました"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"OSU サーバーに接続しています"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU サーバーの検証が完了しました"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"OSU サーバーに接続しました"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"1 回目の SOAP 交換です"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"リダイレクト レスポンスを待機しています"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"リダイレクト レスポンスを受信しました"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"2 回目の SOAP 交換です"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"3 回目の SOAP 交換です"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"信頼できるルート証明書を取得しています"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"プロビジョニングが完了しました"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"とても遅い"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"遅い"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"スリープモードにしない"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"充電中に画面をスリープにしない"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Bluetooth HCIスヌープログをON"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Bluetooth HCI パケットをすべてファイルにキャプチャする(この設定を変更した場合は Bluetooth を切り替えてください)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEMロック解除"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"ブートローダーによるロック解除を許可する"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEMロック解除の許可"</string>
diff --git a/packages/SettingsLib/res/values-ka/arrays.xml b/packages/SettingsLib/res/values-ka/arrays.xml
index a92ecef..73dbdfa 100644
--- a/packages/SettingsLib/res/values-ka/arrays.xml
+++ b/packages/SettingsLib/res/values-ka/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"HDCP შემოწმების გამოყენება მხოლოდ DRM კონტენტის შემთხვევაში"</item>
     <item msgid="45075631231212732">"ყოველთვის გამოიყენე HDCP შემოწმება"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (ნაგულისხმევი)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index b38dcc6..64d78bb 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"ავტომატურად დაკავშირდა %1$s-ის მეშვეობით"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"ავტომატურად დაკავშირდა ქსელის ხარისხის შეფასების პროვაიდერის მეშვეობით"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s-ით დაკავშირებული"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g>, უზრუნველყოფს <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"ხელმისაწვდომია %1$s-ით"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"შეეხეთ დასაყენებლად"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"დაკავშირებულია, ინტერნეტის გარეშე"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"ინტერნეტ-კავშირი არ არის"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"აუცილებელია სისტემაში შესვლა"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"წვდომის წერტილი დროებით გადატვირთულია"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s-ით დაკავშირებული"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"ხელმისაწვდომია %1$s-ით"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"დაკავშირება ვერ მოხერხდა"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"OSU სერვერის URL არასწორია"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU სერვერთან დაკავშირება ვერ მოხერხდა"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU სერვერის დადასტურება ვერ მოხერხდა"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"OSU სერვერის სერტიფიკატი არასწორია"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"უზრუნველყოფა შეწყვეტილია"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"უზრუნველყოფა მიუწვდომელია"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"OSU სერვერის URL არასწორია"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"ბრძანების ტიპი მოულოდნელია"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"SOAP-შეტყობინების ტიპი მოულოდნელია"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP-შეტყობინებების მიმოცვლა ვერ მოხერხდა"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"გადამისამართებების მიმღების გაშვება ვერ მოხერხდა"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"გადამისამართების მოლოდინის დრო ამოიწურა"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"OSU აქტივობა ვერ მოიძებნა"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"SOAP-შეტყობინების სტატუსი მოულოდნელია"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO ვერ მოიძებნა"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"AAA სერვერისთვის ნდობით აღჭურვილი ძირეული კვანძი ვერ მოიძებნა"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"გამართვების სერვერისთვის ნდობით აღჭურვილი ძირეული კვანძი ვერ მოიძებნა"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"წესების სერვერისთვის ნდობით აღჭურვილი ძირეული კვანძი ვერ მოიძებნა"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"ნდობით აღჭურვილი ძირეული სერტიფიკატების მოძიება ვერ მოხერხდა"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"AAA სერვერისთვის ნდობით აღჭურვილი ძირეული სერტიფიკატი ვერ მოიძებნა"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"PassPoint კონფიგურაციის დამატება ვერ მოხერხდა"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"OSU პროვაიდერი ვერ მოიძებნა"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"მიმდინარეობს დაკავშირება"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"დაკავშირებულია"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"მიმდინარეობს დაკავშირება OSU სერვერთან"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU სერვერი დადასტურებულია"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"დაკავშირებულია OSU სერვერთან"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"SOAP-შეტყობინებების საწყისი მიმოცვლა"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"გადამისამართების პასუხის მოლოდინში"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"მიღებულია გადამისამართების პასუხი"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"SOAP-შეტყობინებების მეორე მიმოცვლა"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"SOAP-შეტყობინებების მესამე მიმოცვლა"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"მინდინარეობს ნდობით აღჭურვილი ძირეული სერტიფიკატების მოძიება"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"უზრუნველყოფა დასრულებულია"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"ძალიან ნელი"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"ნელი"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"კარგი"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"არ დაიძინო"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"დატენვისას ეკრანი არ დაიძინებს"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Bluetooth HCI snoop ჟურნალის ჩართვა"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"ყველა Bluetooth HCI პაკეტის ფაილში ჩაწერა (ამ პარამეტრის ჩართვის შემდეგ Bluetooth უნდა გადართოთ)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM განბლოკვა"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"ნება დართოს განბლოკოს ჩამტვირთველმა"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"მისცეს ნება OEM განბლოკვას?"</string>
diff --git a/packages/SettingsLib/res/values-kk/arrays.xml b/packages/SettingsLib/res/values-kk/arrays.xml
index ae9a679..0f06e39 100644
--- a/packages/SettingsLib/res/values-kk/arrays.xml
+++ b/packages/SettingsLib/res/values-kk/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"HDCP тексерісін DRM мазмұны үшін ғана қолдану"</item>
     <item msgid="45075631231212732">"Әрқашан HDCP (жоғары кең жолақты сандық мазмұн қорғаушы) тексерулерін қолданыңыз"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (әдепкі)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index 54087a0..58f10ac 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s арқылы автоматты қосылды"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Желі рейтингі провайдері арқылы автоматты түрде қосылған"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s арқылы қосылған"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g> ұсынған <xliff:g id="SSID">%1$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s арқылы қолжетімді"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Реттеу үшін түртіңіз"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Қосылған, интернет жоқ"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Интернетпен байланыс жоқ"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Есептік жазбаға кіру керек"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Кіру нүктесі уақытша бос емес"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s арқылы қосылды"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"%1$s арқылы қолжетімді"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Байланыс орнатылмады"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"OSU серверінің URL мекенжайы жарамсыз"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU серверімен байланыс қатесі шықты"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU сервері тексеруден өтпеді"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"OSU серверінің сертификаты жарамсыз"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Дайындық процесі үзілді"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Дайындықты жүзеге асыру мүмкін емес"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"OSU серверінің URL мекенжайы жарамсыз"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Күтпеген пәрмен түрі"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"SOAP хабарының белгісіз түрі"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP хабарын алмасу мүмкін болмады"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Тыңдаушының бағытын ауыстыру мүмкін болмады"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Бағыттың ауыстырылуын күту уақыты бітті"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Ешқандай OSU әрекеті табылмады"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"SOAP хабарының белгісіз күйі"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO табылмады"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"AAA сервері үшін сенімді түбір табылмады"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Жөндеулер сервері үшін сенімді түбір табылмады"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Саясат сервері үшін сенімді түбір табылмады"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Сенімді түбірлік сертификаттар алынбады"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"AAA сервері үшін сенімді түбірлік сертификатты табу мүмкін болмады"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"PassPoint конфигурациясы енгізілмеді"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"OSU провайдері табылмады"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Жалғануда"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Жалғанды"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"OSU серверіне жалғануда"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU сервері тексерілді"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"OSU серверіне жалғанды"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Бастапқы SOAP алмасуы"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Бағытты ауыстыру туралы жауап күтілуде"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Бағытты ауыстыру туралы жауап алынды"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Екінші SOAP алмасуы"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Үшінші SOAP алмасуы"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Сенімді түбірлік сертификаттар алынуда"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Дайындық аяқталды"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Өте баяу"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Баяу"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"Жарайды"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Ояу тұру"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Зарядтау кезінде экран ұйықтамайды"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Bluetooth HCI snoop тіркелімін қосу"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Барлық Bluetooth HCI жинақтарын файлға сақтау (бұл параметр өзгергеннен кейін Bluetooth функциясын қосыңыз)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM бекітпесін ашу"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Жүктеуші бекітпесін ашуға рұқсат ету"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM бекітпесін ашуға рұқсат ету керек пе?"</string>
diff --git a/packages/SettingsLib/res/values-km/arrays.xml b/packages/SettingsLib/res/values-km/arrays.xml
index beb3147..4867c8f 100644
--- a/packages/SettingsLib/res/values-km/arrays.xml
+++ b/packages/SettingsLib/res/values-km/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"ប្រើ​ការ​ពិនិត្យ HDCP សម្រាប់​តែ​មាតិកា DRM ប៉ុណ្ណោះ"</item>
     <item msgid="45075631231212732">"ប្រើ​ការ​ពិនិត្យ HDCP ជា​និច្ច"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (លំនាំដើម)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index 3fc609f..45723ed 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"បានភ្ជាប់ដោយស្វ័យប្រវត្តិតាមរយៈ %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"បានភ្ជាប់​ដោយស្វ័យប្រវត្តិ​តាម​រយៈក្រុមហ៊ុនផ្តល់​ការ​វាយ​តម្លៃលើ​បណ្តាញ"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"បានភ្ជាប់តាមរយៈ %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> ដោយ <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"មានតាមរយៈ %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"ចុច​ដើម្បី​រៀបចំ"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"បាន​ភ្ជាប់ ប៉ុន្តែ​គ្មាន​អ៊ីនធឺណិត​ទេ"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"គ្មាន​អ៊ីនធឺណិតទេ"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"តម្រូវ​ឱ្យ​ចូល​គណនី"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ចំណុចចូលប្រើពេញជាបណ្តោះអាសន្ន"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"បានភ្ជាប់តាមរយៈ %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"មានតាមរយៈ %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"ការតភ្ជាប់​មិនបាន​សម្រេច"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"URL ម៉ាស៊ីនមេ OSU មិន​ត្រឹមត្រូវទេ"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"មិនអាច​ផ្ទៀងផ្ទាត់​ការតភ្ជាប់​ម៉ាស៊ីនមេ OSU បានទេ"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"មិនអាច​ផ្ទៀងផ្ទាត់​ម៉ាស៊ីនមេ OSU បានទេ"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"វិញ្ញាបនបត្រ​ម៉ាស៊ីនមេ OSU មិនត្រឹមត្រូវទេ"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"បាន​បោះបង់​ការផ្ដល់ជូន"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"គ្មាន​ការផ្ដល់​ជូនទេ"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"URL ម៉ាស៊ីនមេ OSU មិន​ត្រឹមត្រូវទេ"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"ប្រភេទការបញ្ជា​ដែល​មិនបាន​រំពឹងទុក"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"ប្រភេទ​សារ SOAP ដែល​មិនបាន​រំពឺងទុក"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"មិនអាច​ផ្លាស់ប្ដូរ​សារ SOAP បានទេ"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"មិនអាច​ចាប់ផ្ដើម​ការបញ្ជូន​អ្នកស្ដាប់​បន្តបានទេ"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"ការរង់ចាំ​ដើម្បី​បញ្ជូនបន្ត​អស់ម៉ោង​ហើយ"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"រកមិនឃើញ​សកម្មភាព OSU ទេ"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"ស្ថានភាព​សារ SOAP ដែល​មិនបាន​រំពឺងទុក"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"រកមិនឃើញ PPS-MO ទេ"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"រកមិនឃើញ​ថ្នាំងឫស​ដែលទុកចិត្ត​សម្រាប់​ម៉ាស៊ីនមេ AAA ទេ"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"រកមិនឃើញ​ថ្នាំងឫស​ដែលទុកចិត្ត​សម្រាប់​ម៉ាស៊ីនមេកែបញ្ហាទេ"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"រកមិនឃើញ​ថ្នាំងឫស​ដែលទុកចិត្ត​សម្រាប់​ម៉ាស៊ីនមេ​ដែលផ្អែកតាម​គោលការណ៍ទេ"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"មិនអាច​ទាញយក​វិញ្ញាបនបត្រគោល​ដែល​ទុកចិត្ត​បានទេ"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"រកមិនឃើញ​វិញ្ញាបនបត្រគោល​ដែលទុកចិត្ត​សម្រាប់​ម៉ាស៊ីនមេ AAA ទេ"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"មិនអាច​បញ្ចូល​ការកំណត់​រចនាសម្ព័ន្ធ PassPoint បានទេ"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"រកមិនឃើញ​បណ្ដាញផ្ដល់ OSU ទេ"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"កំពុងភ្ជាប់"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"បានភ្ជាប់"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"កំពុងភ្ជាប់​ទៅ​ម៉ាស៊ីនមេ OSU"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"បាន​ផ្ទៀងផ្ទាត់​ម៉ាស៊ីនមេ OSU ហើយ"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"បានភ្ជាប់​ទៅ​ម៉ាស៊ីនមេ OSU"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"ការផ្លាស់ប្ដូរ SOAP ដំបូង"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"កំពុង​រង់ចាំ​ការឆ្លើយតប​បន្ត"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"បាន​ទទួល​ការឆ្លើយ​តបបន្ត"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"ការផ្លាស់ប្ដូរ SOAP ទីពីរ"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"ការផ្លាស់ប្ដូរ SOAP ទីបី"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"កំពុង​ទាញយក​វិញ្ញាបនបត្រគោល​ដែល​ទុកចិត្ត"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"ការផ្ដល់ជូន​បានបញ្ចប់"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"យឺតណាស់"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"យឺត"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"យល់ព្រម"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"ទុកឲ្យបើកចោល"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"អេក្រង់​នឹង​មិន​ដេក​ពេល​បញ្ចូល​ថ្ម"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"បើក​កំណត់​ហេតុ HCI snoop ប៊្លូធូស"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"ចាប់​យក​កញ្ចប់ HCI ប៊្លូធូស​ទាំងអស់​នៅ​ក្នុង​ឯកសារ​ (បិទ/​បើក​ប៊្លូធូស ​បន្ទាប់ពី​ប្តូរ​ការកំណត់​នេះ)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"ការដោះសោ OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"អនុញ្ញាតឲ្យដោះសោកម្មវិធីចាប់ផ្តើមប្រព័ន្ធ"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"អនុញ្ញាតការដោះសោ OEM?"</string>
diff --git a/packages/SettingsLib/res/values-kn/arrays.xml b/packages/SettingsLib/res/values-kn/arrays.xml
index 75d5dcb..4ac8d56 100644
--- a/packages/SettingsLib/res/values-kn/arrays.xml
+++ b/packages/SettingsLib/res/values-kn/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"DRM ವಿಷಯಗಳಿಗೆ ಮಾತ್ರ HDCP ಪರೀಕ್ಷಿಸುವಿಕೆಯನ್ನು ಬಳಸು"</item>
     <item msgid="45075631231212732">"HDCP ಪರಿಶೀಲನೆಯನ್ನು ಯಾವಾಗಲೂ ಬಳಸು"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (ಡಿಫಾಲ್ಟ್)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index bc1150d..bb889e9 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s ಮೂಲಕ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"ನೆಟ್‌ವರ್ಕ್ ರೇಟಿಂಗ್ ಒದಗಿಸುವವರ ಮೂಲಕ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s ಮೂಲಕ ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g> ಮೂಲಕ <xliff:g id="SSID">%1$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s ಮೂಲಕ ಲಭ್ಯವಿದೆ"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"ಸೆಟಪ್‌ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ, ಇಂಟರ್ನೆಟ್ ಇಲ್ಲ"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"ಇಂಟರ್ನೆಟ್ ಇಲ್ಲ"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"ಸೈನ್ ಇನ್ ಮಾಡುವ ಅಗತ್ಯವಿದೆ"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ಪ್ರವೇಶ ಕೇಂದ್ರ ತಾತ್ಕಾಲಿಕವಾಗಿ ಭರ್ತಿಯಾಗಿದೆ"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s ಮೂಲಕ ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"%1$s ಮೂಲಕ ಲಭ್ಯವಿದೆ"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"ಸಂಪರ್ಕ ವಿಫಲವಾಗಿದೆ"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"ಅಮಾನ್ಯ OSU ಸರ್ವರ್ URL"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU ಸರ್ವರ್ ಸಂಪರ್ಕ ವಿಫಲಗೊಂಡಿದೆ"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU ಸರ್ವರ್ ಮೌಲ್ಯಮಾಪನ ವಿಫಲವಾಗಿದೆ"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"ಅಮಾನ್ಯ OSU ಸರ್ವರ್ ಪ್ರಮಾಣಪತ್ರ"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"ಪೂರೈಕೆಯನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"ಪೂರೈಕೆ ಲಭ್ಯವಿಲ್ಲ"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"ಅಮಾನ್ಯ OSU ಸರ್ವರ್ URL"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"ಅನಿರೀಕ್ಷಿತ ಕಮಾಂಡ್ ಪ್ರಕಾರ"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"ಅನಿರೀಕ್ಷಿತ SOAP ಸಂದೇಶ ಪ್ರಕಾರ"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP ಸಂದೇಶ ವಿನಿಮಿಯ ವಿಫಲವಾಗಿದೆ"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"ಮರುನಿರ್ದೇಶನ ಆಲಿಸುವವರು ಪ್ರಾರಂಭಿಸುವಲ್ಲ ವಿಫಲರಾಗಿದ್ದಾರೆ"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"ಮರುನಿರ್ದೇಶನಕ್ಕಾಗಿ ನಿರೀಕ್ಷಿಸುತ್ತಿರುವ ಅವಧಿ ಮೀರಿದೆ"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"OSU ಚಟುವಟಿಕೆ ಕಂಡುಬಂದಿಲ್ಲ"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"ಅನಿರೀಕ್ಷಿತ SOAP ಸಂದೇಶ ಸ್ಥಿತಿ"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO ಹುಡುಕಲು ವಿಫಲವಾಗಿದೆ"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"AAA ಸರ್ವರ್‌ಗಾಗಿ ವಿಶ್ವಾಸಾರ್ಹ ರೂಟ್ ನೋಡ್ ಹುಡುಕಲು ವಿಫಲವಾಗಿದೆ"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"ಪರಿಹಾರ ಸರ್ವರ್‌ಗಾಗಿ ವಿಶ್ವಾಸಾರ್ಹ ರೂಟ್ ನೋಡ್ ಅನ್ನು ಹುಡುಕಲು ವಿಫಲವಾಗಿದೆ"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"ಕಾರ್ಯನೀತಿ ಸರ್ವರ್‌ಗಾಗಿ ವಿಶ್ವಾಸಾರ್ಹ ರೂಟ್ ನೋಡ್ ಅನ್ನು ಹುಡುಕಲು ವಿಫಲವಾಗಿದೆ"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"ವಿಶ್ವಾಸಾರ್ಹ ರೂಟ್ ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ಹಿಂಪಡೆಯಲು ವಿಫಲವಾಗಿದೆ"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"AAA ಸರ್ವರ್‌ಗಾಗಿ ವಿಶ್ವಾಸಾರ್ಹ ರೂಟ್ ಪ್ರಮಾಣಪತ್ರವನ್ನು ಹುಡುಕಲು ವಿಫಲವಾಗಿದೆ"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"PassPoint ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ಸೇರಿಸಲು ವಿಫಲವಾಗಿದೆ"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"OSU ಒದಗಿಸುವವರನ್ನು ಹುಡುಕಲು ವಿಫಲವಾಗಿದೆ"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"ಸಂಪರ್ಕಿಸಲಾಗಿದೆ"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"OSU ಸರ್ವರ್‌ಗೆ ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU ಸರ್ವರ್ ಮೌಲ್ಯಮಾಪನ ಮಾಡಲಾಗಿದೆ"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"OSU ಸರ್ವರ್‌ಗೆ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"ಆರಂಭಿಕ SOAP ವಿನಿಮಯ"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"ಮರುನಿರ್ದೇಶನ ಪ್ರತಿಕ್ರಿಯೆಗಾಗಿ ನಿರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"ಮರುನಿರ್ದೇಶನ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಸ್ವೀಕರಿಸಲಾಗಿದೆ"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"ಎರಡನೇ SOAP ವಿನಿಮಯ"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"ಮೂರನೇ SOAP ವಿನಿಮಯ"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"ವಿಶ್ವಾಸಾರ್ಹ ರೂಟ್ ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ಮರುಪಡೆಯಲಾಗುತ್ತಿದೆ"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"ಪೂರೈಸುವಿಕೆ ಪೂರ್ಣಗೊಂಡಿದೆ"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"ತುಂಬಾ ನಿಧಾನವಾಗಿದೆ"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"ನಿಧಾನ"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"ಸರಿ"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"ಎಚ್ಚರವಾಗಿರು"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"ಚಾರ್ಜ್ ಮಾಡುವಾಗ ಪರದೆಯು ಎಂದಿಗೂ ನಿದ್ರಾವಸ್ಥೆಗೆ ಹೋಗುವುದಿಲ್ಲ"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"ಬ್ಲೂಟೂತ್‌‌ HCI ಸ್ನೂಪ್‌ ಲಾಗ್ ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"ಫೈಲ್‌ನಲ್ಲಿ ಎಲ್ಲ ಬ್ಲೂಟೂತ್ HCI ಪ್ಯಾಕೆಟ್‌ಗಳನ್ನು ಸೆರೆಹಿಡಿಯಿರಿ (ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬದಲಾಯಿಸಿದ ನಂತರ ಬ್ಲೂಟೂತ್ ಟಾಗಲ್ ಮಾಡಿ)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM ಅನ್‌ಲಾಕ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"ಬೂಟ್‌ಲೋಡರ್‌ ಅನ್‌ಲಾಕ್‌ ಮಾಡಲು ಅನುಮತಿಸಿ"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM ಅನ್‌ಲಾಕ್‌ ಮಾಡುವಿಕೆಯನ್ನು ಅನುಮತಿಸುವುದೇ?"</string>
diff --git a/packages/SettingsLib/res/values-ko/arrays.xml b/packages/SettingsLib/res/values-ko/arrays.xml
index d784858..7330843 100644
--- a/packages/SettingsLib/res/values-ko/arrays.xml
+++ b/packages/SettingsLib/res/values-ko/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"DRM 콘텐츠에 대해서만 HDCP 확인 사용"</item>
     <item msgid="45075631231212732">"항상 HDCP 확인 사용"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4(기본)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index 035c24b..f6409d9 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s을(를) 통해 자동으로 연결됨"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"네트워크 평가 제공업체를 통해 자동으로 연결됨"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s을(를) 통해 연결됨"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>의 <xliff:g id="SSID">%1$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s을(를) 통해 사용 가능"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"설정하려면 탭하세요."</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"연결됨, 인터넷 사용 불가"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"인터넷 연결 없음"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"로그인 필요"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"액세스 포인트가 일시적으로 가득 참"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s을(를) 통해 연결됨"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"%1$s을(를) 통해 사용 가능"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"연결에 실패했습니다."</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"잘못된 OSU 서버 URL입니다."</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU 서버 연결에 실패했습니다."</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU 서버 인증에 실패했습니다."</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"잘못된 OSU 서버 인증서입니다."</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"프로비저닝이 취소되었습니다."</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"프로비저닝을 사용할 수 없습니다."</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"잘못된 OSU 서버 URL입니다."</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"예상치 못한 명령어 유형입니다."</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"예상치 못한 SOAP 메시지 유형입니다."</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP 메시지 교환에 실패했습니다."</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"리스너 리디렉션을 시작하지 못했습니다."</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"리디렉션을 기다리는 중에 타임아웃되었습니다."</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"OSU 활동이 없습니다."</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"예상치 못한 SOAP 메시지 상태입니다."</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO를 찾지 못했습니다."</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"AAA 서버의 공인 루트 노드를 찾지 못했습니다."</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"복구 서버의 공인 루트 노드를 찾지 못했습니다."</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"정책 서버의 공인 루트 노드를 찾지 못했습니다."</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"공인 루트 인증서를 가져오지 못했습니다."</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"AAA 서버의 공인 루트 인증서를 찾지 못했습니다."</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"PassPoint 설정을 추가하지 못했습니다."</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"OSU 제공업체를 찾지 못했습니다."</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"연결 중입니다."</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"연결되었습니다."</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"OSU 서버에 연결하는 중입니다."</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU 서버가 인증되었습니다."</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"OSU 서버에 연결되었습니다."</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"첫 SOAP 교환"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"리디렉션 응답을 기다리는 중입니다."</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"리디렉션 응답이 수신되었습니다."</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"2번째 SOAP 교환"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"3번째 SOAP 교환"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"공인 루트 인증서를 가져오는 중입니다."</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"프로비저닝이 완료되었습니다."</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"매우 느림"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"느림"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"보통"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"화면 켜짐 상태 유지"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"충전하는 동안 화면이 꺼지지 않음"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"블루투스 HCI 스누프 로그 사용"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"모든 블루투스 HCI 패킷을 하나의 파일에 캡처(설정 변경 후 블루투스 전환)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM 잠금 해제"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"부트로더 잠금 해제 허용"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM 잠금 해제를 허용하시겠습니까?"</string>
diff --git a/packages/SettingsLib/res/values-ky/arrays.xml b/packages/SettingsLib/res/values-ky/arrays.xml
index 73b24b1..da0248d 100644
--- a/packages/SettingsLib/res/values-ky/arrays.xml
+++ b/packages/SettingsLib/res/values-ky/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"HDCP текшерүү DRM мазмунуна гана колдонулат"</item>
     <item msgid="45075631231212732">"Ар дайым HDCP текшерүү колдонулсун"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (Демейки)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index 8a68c78..c30f96c 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s аркылуу автоматтык түрдө туташты"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Тармактар рейтингинин автору аркылуу автоматтык түрдө туташты"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s аркылуу жеткиликтүү"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g>, <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g> аркылуу туташтырылган"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s аркылуу жеткиликтүү"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Жөндөө үчүн таптаңыз"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Туташып турат, Интернет жок"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Интернет жок"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Аккаунтка кирүү талап кылынат"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Байланыш түйүнүнө өтө көп түзмөк туташып турат"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s аркылуу туташты"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"%1$s аркылуу иштейт"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Туташпай койду"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"OSU серверинин URL\'и жараксыз"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU серверине туташкан жок"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU сервери текшерилген жок"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"OSU серверинин тастыктамасы жараксыз"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Камсыздоо жоюлду"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Камсыздоо жеткиликтүү эмес"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"OSU серверинин URL\'и жараксыз"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Күтүлбөгөн буйрук түрү"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Күтүлбөгөн SOAP билдирүү түрү"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP билдирүүсү алмаштырылган жок"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Багыттоо тыңшагычы башталган жок"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Багыттоону күтүү мөөнөтү аяктады"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"OSU аракети табылган жок"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Күтүлбөгөн SOAP билдирүү абалы"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO табылган жок"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"AAA сервери үчүн ишеним негизги түйүнү табылган жок"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Оңдоо сервери үчүн ишеним негизги түйүнү табылган жок"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Саясат сервери үчүн ишеним негизги түйүнү табылган жок"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Ишеним негизги тастыктамалары алынган жок"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"AAA сервери үчүн ишеним негизги тастыктамасы табылган жок"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"PassPoint конфигурациясы кошулган жок"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"OSU камсыздоочусу табылган жок"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Туташууда"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Туташты"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"OSU серверине туташууда"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU сервери текшерилди"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"OSU серверине туташты"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Баштапкы SOAP алмаштыруу"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Багыттоо жообу күтүлүүдө"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Багыттоо жообу кабыл алынды"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Экинчи SOAP алмаштыруу"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Үчүнчү SOAP алмаштыруу"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Ишеним негизги тастыктамалары алынууда"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Камсыздоо аягына чыкты"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Өтө жай"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Жай"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"Жарайт"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Ойгоо туруу"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Түзмөк кубатталып жатканда экран өчпөйт"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Bluetooth HCI журналын иштетүү"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Bluetooth HCI топтомдору файлда сакталат (Бул жөндөөнү өзгөрткөндөн кийин Bluetooth\'ду өчүрүп-күйгүзүңүз)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM бөгөттөн чыгаруу"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Кайра жүктөгүчтү бөгөттөн чыгарууга уруксат берүү"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM бөгөттөн чыгарууга уруксатпы?"</string>
diff --git a/packages/SettingsLib/res/values-lo/arrays.xml b/packages/SettingsLib/res/values-lo/arrays.xml
index 9d602e8..7f56494 100644
--- a/packages/SettingsLib/res/values-lo/arrays.xml
+++ b/packages/SettingsLib/res/values-lo/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"ໃຊ້ການກວດສອບ HDCP ສຳລັບເນື້ອຫາ DRM ເທົ່ານັ້ນ"</item>
     <item msgid="45075631231212732">"ໃຊ້ການກວດສອບ HDCP ສະເໝີ"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (Default)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index 009f44f..edb6b12 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"ເຊື່ອມຕໍ່ຜ່ານທາງ %1$s ໂດຍອັດຕະໂນມັດ"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"ເຊື່ອມຕໍ່ກັບອັດຕະໂນມັດແລ້ວຜ່ານຜູ້ໃຫ້ບໍລິການຄະແນນເຄືອຂ່າຍ"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"​ເຊື່ອມຕໍ່​ຜ່ານ %1$s ​ແລ້ວ"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> ໂດຍ <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"ມີ​ໃຫ້​ຜ່ານ %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"ແຕະເພື່ອຕັ້ງຄ່າ"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"ເຊື່ອມຕໍ່ແລ້ວ, ບໍ່ມີອິນເຕີເນັດ"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"ບໍ່ມີອິນເຕີເນັດ"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"ຈຳເປັນຕ້ອງເຂົ້າສູ່ລະບົບ"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ຈຸດການເຂົ້າເຖິງເຕັມຊົ່ວຄາວ"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"ເຊື່ອມຕໍ່ຜ່ານ %1$s ແລ້ວ"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"ໃຊ້ໄດ້ຜ່ານ %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"ການເຊື່ອມຕໍ່ບໍ່ສຳເລັດ"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"URL ເຊີບເວີ OSU ບໍ່ຖືກຕ້ອງ"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"ການເຊື່ອມຕໍ່ເຊີບເວີ OSU ບໍ່ສຳເລັດ"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"ການກວດສອບເຊີບເວີ OSU ບໍ່ສຳເລັດ"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"ໃບຮັບຮອງເຊີບເວີ OSU ບໍ່ຖືກຕ້ອງ"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"ຍົກເລີກການຈັດຫາແລ້ວ"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"ບໍ່ສາມາດໃຊ້ການຈັດຫາໄດ້"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"URL ເຊີບເວີ OSU ບໍ່ຖືກຕ້ອງ"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"ປະເພດຄຳສັ່ງທີ່ບໍ່ຄາດຄິດ"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"ປະເພດຂໍ້ຄວາມ SOAP ທີ່ບໍ່ຄາດຄິດ"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"ການແລກປ່ຽນຂໍ້ຄວາມ SOAP ບໍ່ສຳເລັດ"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"ເລີ່ມການປ່ຽນເສັ້ນທາງຕົວຟັງບໍ່ສຳເລັດ"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"ໝົດເວລາລໍຖ້າການປ່ຽນເສັ້ນທາງແລ້ວ"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"ບໍ່ພົບການເຄື່ອນໄຫວ OSU"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"ສະຖານະຂໍ້ຄວາມ SOAP ທີ່ບໍ່ຄາດຄິດ"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"ຊອກຫາ PPS-MO ບໍ່ສຳເລັດ"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"ຊອກຫາ root node ທີ່ເຊື່ອຖືໄດ້ສຳລັບເຊີບເວີ AAA ບໍ່ສຳເລັດ"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"ຊອກຫາ root node ທີ່ເຊື່ອຖືໄດ້ສຳລັບເຊີບເວີການແກ້ໄຂບໍ່ສຳເລັດ"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"ຊອກຫາ root node ທີ່ເຊື່ອຖືໄດ້ສຳລັບເຊີບເວີນະໂຍບາຍບໍ່ສຳເລັດ"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"ໂຫຼດໃບຮັບຮອງ root ທີ່ເຊື່ອຖືໄດ້ບໍ່ສຳເລັດ"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"ຊອກຫາໃບຮັບຮອງ root ທີ່ເຊື່ອຖືໄດ້ສຳລັບເຊີບເວີ AAA ບໍ່ສຳເລັດ"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"ເພີ່ມການຕັ້ງຄ່າ PassPoint ບໍ່ສຳເລັດ"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"ຊອກຫາຜູ້ໃຫ້ບໍລິການ OSU ບໍ່ສຳເລັດ"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"ກຳລັງເຊື່ອມຕໍ່"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"ເຊື່ອມຕໍ່ແລ້ວ"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"ກຳລັງເຊື່ອມຕໍ່ຫາເຊີບເວີ OSU"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"ກວດສອບເຊີບເວີ OSU ແລ້ວ"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"ເຊື່ອມຕໍ່ຫາເຊີບເວີ OSU ແລ້ວ"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"ການແລກປ່ຽນ SOAP ເບື້ອງຕົ້ນ"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"ກຳລັງລໍຖ້າການຕອບກັບປ່ຽນເສັ້ນທາງ"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"ໄດັຮັບການຕອບກັບປ່ຽນເສັ້ນທາງແລ້ວ"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"ການແລກປ່ຽນ SOAP ທີສອງ"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"ການແລກປ່ຽນ SOAP ທີສາມ"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"ກຳລັງໂຫຼດໃບຮັບຮອງ root ທີ່ເຊື່ອຖືໄດ້"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"ການຈັດຫາສຳເລັດແລ້ວ"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"ຊ້າຫຼາຍ"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"ຊ້າ"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"ຕົກລົງ"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"ເປີດໜ້າຈໍຕະຫຼອດ"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"ໜ້າຈໍຈະບໍ່ປິດໃນຂະນະທີ່ສາກໄຟຢູ່"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"ບັນທຶກການເຮັດວຽກຂອງ Bluetooth HCI"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"ບັນທຶກແພັກເກັດ Bluetooth HCI ທັງໝົດໃນໄຟລ໌ (ສະຫຼັບການໃຊ້ Bluetooth ຫຼັງຈາກການປ່ຽນແປງການຕັ້ງຄ່ານີ້)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"ການ​ປົດ​ລັອກ OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"ອະ​ນຸ​ຍາດ​ໃຫ້​ປົດ​ລັອກ​ບູດ​ໂຫຼດ​ເດີ"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"ອະ​ນຸ​ຍາດ​ການ​ປົກ​ລັອກ OEM ບໍ?"</string>
diff --git a/packages/SettingsLib/res/values-lt/arrays.xml b/packages/SettingsLib/res/values-lt/arrays.xml
index 7576ab3..b78988a 100644
--- a/packages/SettingsLib/res/values-lt/arrays.xml
+++ b/packages/SettingsLib/res/values-lt/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Taikyti HDCP tikrinimą tik DRM turiniui"</item>
     <item msgid="45075631231212732">"Visada naudoti HDCP tikrinimą"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (numatytoji)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index f08a78b..0938463 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatiškai prisijungta naudojant „%1$s“"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatiškai prisijungta naudojant tinklo įvertinimo paslaugos teikėjo paslaugomis"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Prisijungta naudojant „%1$s“"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g>, <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Pasiekiama naudojant „%1$s“"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Palieskite, kad nustatytumėte"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Prisijungta, nėra interneto"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Nėra interneto ryšio"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Reikia prisijungti"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Prieigos taškas laikinai visiškai užimtas"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Prisijungta naudojant „%1$s“"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Pasiekiama naudojant „%1$s“"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Nepavyko užmegzti ryšio"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Netinkamas OSU serverio URL"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Nepavyko užmegzti OSU serverio ryšio"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Nepavyko patvirtinti OSU serverio"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Netinkamas OSU serverio sertifikatas"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Aprūpinimas nutrauktas"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Negalima aprūpinti"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Netinkamas OSU serverio URL"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Nenumatytas komandos tipas"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Nenumatytas SOAP pranešimo tipas"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Nepavyko atlikti SOAP pranešimo mainų operacijos"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Nepavyko paleisti peradresavimo apdorojimo priemonės"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Laukiant peradresavimo baigėsi skirtasis laikas"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Nerasta OSU veiklos duomenų"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Nenumatyta SOAP pranešimo būsena"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Nepavyko rasti PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Nepavyko rasti patikimo AAA serverio šakninio mazgo"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Nepavyko rasti patikimo problemų sprendimo serverio šakninio mazgo"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Nepavyko rasti patikimo politikos serverio šakninio mazgo"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Nepavyko gauti patikimų šakninių sertifikatų"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Nepavyko rasti patikimo AAA serverio šakninio sertifikato"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Nepavyko pridėti „PassPoint“ konfigūracijos"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Nepavyko rasti OSU teikėjo"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Sujungiama"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Sujungta"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Prisijungiama prie OSU serverio"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU serveris patvirtintas"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Prisijungta prie OSU serverio"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Pradinė SOAP mainų operacija"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Laukiama tiesioginio atsakymo"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Gautas tiesioginis atsakymas"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Antroji SOAP mainų operacija"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Trečioji SOAP mainų operacija"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Gaunami patikimi šakniniai sertifikatai"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Aprūpinta"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Labai lėtas"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Lėtas"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"Gerai"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Veikti"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Kraunant ekranas niekada neveiks miego režimu"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Įgalinti „Bluetooth“ HCI šnipinėjimo žurnalą"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Užfiksuoti visus faile esančius „Bluetooth“ HCI paketus (pakeitę nustatymą išjunkite ir vėl įjunkite „Bluetooth“)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OĮG atrakinimas"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Leisti atrakinti oper. sistemos paleidimo progr."</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Leisti OĮG atrakinimą?"</string>
diff --git a/packages/SettingsLib/res/values-lv/arrays.xml b/packages/SettingsLib/res/values-lv/arrays.xml
index 3d7f77a..3812c20 100644
--- a/packages/SettingsLib/res/values-lv/arrays.xml
+++ b/packages/SettingsLib/res/values-lv/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Izmantot HDCP pārbaudi tikai DRM saturam"</item>
     <item msgid="45075631231212732">"Vienmēr izmantot HDCP pārbaudi"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (noklusējuma)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index c768d11..84d42c2 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Automātiski savienots, izmantojot %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automātiski izveidots savienojums, izmantojot tīkla vērtējuma sniedzēju"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Savienots, izmantojot %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> — <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Pieejams, izmantojot %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Pieskarieties, lai iestatītu"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Savienojums izveidots, nav piekļuves internetam"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Nav piekļuves internetam"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Nepieciešama pierakstīšanās"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Piekļuves punkts īslaicīgi ir pilns"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Savienojums izveidots, izmantojot %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Pieejams, izmantojot %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Neizdevās izveidot savienojumu"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Nederīgs OSU servera URL"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Neizdevās izveidot savienojumu ar OSU serveri"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Neizdevās apstiprināt OSU serveri"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Nederīgs OSU servera sertifikāts"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Nodrošinājums priekšlaikus pārtraukts"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Nodrošinājums nav pieejams"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Nederīgs OSU servera URL"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Neparedzēts komandas veids"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Neparedzēts SOAP ziņojuma veids"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP ziņojumu apmaiņa neizdevās"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Neizdevās palaist novirzīšanas uztvērēju"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Gaidot novirzīšanu, iestājās noildze"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Netika konstatēta OSU aktivitāte"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Neparedzēts SOAP ziņojuma statuss"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Neizdevās atrast PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Neizdevās atrast uzticamu saknes mezglu AAA serverim"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Neizdevās atrast uzticamu saknes mezglu koriģēšanas serverim"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Neizdevās atrast uzticamu saknes mezglu noteikumu serverim"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Neizdevās izgūt uzticamus saknes sertifikātus"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Neizdevās atrast uzticamu saknes sertifikātu AAA serverim"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Neizdevās pievienot PassPoint konfigurāciju"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Neizdevās atrast OSU nodrošinātāju"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Notiek savienojuma izveide"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Savienojums izveidots"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Notiek savienojuma izveide ar OSU serveri"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU serveris apstiprināts"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Izveidots savienojums ar OSU serveri"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Sākotnējā SOAP apmaiņa"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Tiek gaidīta novirzīšanas atbilde"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Saņemta novirzīšanas atbilde"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Otrā SOAP apmaiņa"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Trešā SOAP apmaiņa"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Notiek uzticamu saknes sertifikātu izgūšana"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Nodrošinājums pabeigts"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Ļoti lēns"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Lēns"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"Labi"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Atstāt nomodā"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Uzlādes laikā ekrāns nekad nepārslēgsies miega režīmā"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Iespējot Bluetooth HCI analizētāja žurnālu"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Tvert visas Bluetooth HCI paketes failā (pārslēgt Bluetooth pēc šī iestatījuma mainīšanas)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM atbloķēšana"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Atļaut palaišanas ielādētāja atbloķēšanu"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Vai atļaut OEM atbloķēšanu?"</string>
diff --git a/packages/SettingsLib/res/values-mk/arrays.xml b/packages/SettingsLib/res/values-mk/arrays.xml
index e2dbc7e..797e017 100644
--- a/packages/SettingsLib/res/values-mk/arrays.xml
+++ b/packages/SettingsLib/res/values-mk/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Користи HDCP проверка само за DRM содржина"</item>
     <item msgid="45075631231212732">"Секогаш користи HDCP проверка"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (Стандардно)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index 85430a6..9fca9c1c 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Автоматски поврзано преку %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Автоматски поврзано преку оператор за оценување мрежа"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Поврзано преку %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> од <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Достапно преку %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Допрете за поставување"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Поврзана, нема интернет"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Нема интернет"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Потребно е најавување"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Пристапната точка привремено е преоптоварена"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Поврзано преку %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Достапно преку %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Поврзувањето беше неуспешно"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Неважечка URL-адреса на OSU-серверот"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Неуспешно поврзување со OSU-серверот"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Неуспешна проверка на OSU-серверот"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Неважечки сертификат на OSU-серверот"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Доделувањето е прекинато"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Доделувањето не е достапно"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Неважечка URL-адреса на OSU-серверот"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Неочекуван тип наредба"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Неочекуван тип SOAP-порака"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Неуспешна размена на SOAP-пораката"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Пренасочувањето на слушателот не успеа да се стартува"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Истечено чекање за пренасочување"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Не е најдена OSU-активност"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Неочекуван статус на SOAP-пораката"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Не успеа да се најде PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Не успеа да се најде доверлив јазол со администраторски права за серверот за AAA"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Не успеа да се најде доверлив јазол со администраторски права за серверот за санација"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Не успеа да се најде доверлив јазол со администраторски права за серверот на правилото"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Не успеаја да се преземат доверливи сертификати за администраторски права"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Не успеа да се најде доверлив сертификат со администраторски права за серверот за AAA"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Не успеа да се додаде конфигурација за PassPoint"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Не успеа да се најде давател на OSU"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Се поврзува"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Поврзано"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Се поврзува со OSU-серверот"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU-серверот е потврден"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Поврзано со OSU-сервер"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Првична размена на SOAP"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Се чека одговор за пренасочување"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Примен е одговор за пренасочување"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Втора размена на SOAP"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Трета размена на SOAP"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Се преземаат доверливи сертификати за администраторски права"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Доделувањето е завршено"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Многу бавна"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Бавна"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"Во ред"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Остани во активен режим"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Екранот никогаш нема да биде во режим на штедење додека се полни"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Овозможи Bluetooth HCI за евиденција на пресретнување пакети"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Сними ги сите Bluetooth HCI пакети во датотека (Вклучи Bluetooth откако ќе се смени поставкава)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Отклучување со OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Дозволи да се отклучи подигнувачот"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Дозволете отклучување со OEM?"</string>
diff --git a/packages/SettingsLib/res/values-ml/arrays.xml b/packages/SettingsLib/res/values-ml/arrays.xml
index 3337913..f977ad2 100644
--- a/packages/SettingsLib/res/values-ml/arrays.xml
+++ b/packages/SettingsLib/res/values-ml/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"DRM ഉള്ളടക്കത്തിനുമാത്രമായി HDCP പരിശോധന ഉപയോഗിക്കുക"</item>
     <item msgid="45075631231212732">"എല്ലായ്‌പ്പോഴും HDCP പരിശോധന ഉപയോഗിക്കുക"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (ഡിഫോൾട്ട്)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index c3438dc..cda04cc 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s വഴി സ്വയമേവ ബന്ധിപ്പിച്ചു"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"നെറ്റ്‌വർക്ക് റേറ്റിംഗ് ദാതാവുമായി സ്വയം കണക്‌റ്റുചെയ്‌തു"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s വഴി ബന്ധിപ്പിച്ചു"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g> നല്‍കുന്ന <xliff:g id="SSID">%1$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s വഴി ലഭ്യം"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"സജ്ജീകരിക്കാന്‍ ടാപ്പ് ചെയ്യുക"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"കണക്റ്റ് ചെയ്‌തു, ഇന്റർനെറ്റ് ഇല്ല"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"ഇന്റർനെറ്റ് ഇല്ല"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"സൈൻ ഇൻ ചെയ്യേണ്ടത് ആവശ്യമാണ്"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ആക്‌സസ് പോയിന്റ് താൽക്കാലികമായി നിറഞ്ഞിരിക്കുന്നു"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s വഴി ബന്ധിപ്പിച്ചു"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"%1$s വഴി ലഭ്യം"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"കണക്ഷന്‍ പരാജയപ്പെട്ടു"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"അസാധുവായ OSU സെര്‍‌വര്‍ URL"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU സെര്‍‌വര്‍ കണക്ഷന്‍ പരാജയപ്പെട്ടു"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU സെര്‍‌വര്‍ മൂല്യനിര്‍ണ്ണയം പരാജയപ്പെട്ടു"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"അസാധുവായ OSU സെര്‍‌വര്‍ സര്‍ട്ടിഫിക്കറ്റ്"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"പ്രൊവിഷനിംഗ് റദ്ദാക്കി"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"പ്രൊവിഷനിംഗ് ലഭ്യമല്ല"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"അസാധുവായ OSU സെര്‍‌വര്‍ URL"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"അപ്രതീക്ഷിത കമാന്‍ഡ് തരം"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"അപ്രതീക്ഷിത SOAP സന്ദേശ തരം"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP സന്ദേശ എക്‌സ്‌ചേഞ്ച് പരാജയപ്പെട്ടു"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"റീഡയറക്‌റ്റ് ചെയ്‌ത ശ്രോതാവ്‌ ആരംഭിക്കുന്നതില്‍ പരാജയപ്പെട്ടു"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"കാലഹരണപ്പെടല്‍, റീഡയറക്‌റ്റിനായി കാത്തിരിക്കുന്നു"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"OSU ആക്‌റ്റിവിറ്റിയൊന്നും കണ്ടെത്തിയില്ല"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"അപ്രതീക്ഷിത SOAP സന്ദേശ നില"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO കണ്ടെത്തുന്നതില്‍ പരാജയപ്പെട്ടു"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"AAA സെര്‍‌വറിനായുള്ള വിശ്വസനീയ റൂട്ട് നോഡ് കണ്ടെത്തുന്നതില്‍ പരാജയപ്പെട്ടു"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"പരിഹാര സെര്‍‌വറിനുള്ള വിശ്വസനീയ റൂട്ട് നോഡ് കണ്ടെത്തുന്നതില്‍ പരാജയപ്പെട്ടു"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"നയ സെര്‍‌വറുകള്‍‌ക്കായുള്ള വിശ്വസനീയ റൂട്ട് നോഡ് കണ്ടെത്തുന്നതില്‍ പരാജയപ്പെട്ടു"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"വിശ്വസനീയ റൂട്ട് സര്‍ട്ടിഫിക്കറ്റുകള്‍ വീണ്ടെടുക്കുന്നതില്‍ പരാജയപ്പെട്ടു"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"AAA സെര്‍‌വറിനുള്ള വിശ്വസനീയ റൂട്ട് സര്‍ട്ടിഫിക്കറ്റ് കണ്ടെത്തുന്നതില്‍ പരാജയപ്പെട്ടു"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"PassPoint കോണ്‍‌ഫിഗറേഷന്‍ ചേര്‍ക്കുന്നതില്‍ പരാജയപ്പെട്ടു"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"OSU പ്രൊവൈഡര്‍ കണ്ടെത്തുന്നതില്‍ പരാജയപ്പെട്ടു"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"കണക്‌റ്റ് ചെയ്യുന്നു"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"കണക്‌റ്റ് ചെയ്‌തു"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"OSU സെര്‍‌വറിലേക്ക് കണക്‌റ്റ് ചെയ്യുന്നു"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU സെര്‍‌വര്‍ സാധൂകരിച്ചു"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"OSU സെര്‍‌വറിലേക്ക് കണക്‌റ്റ് ചെയ്‌തു"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"പ്രാരംഭ SOAP എക്‌സ്‌ചേഞ്ച്"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"റീഡയറക്‌റ്റ് ചെയ്യുന്ന പ്രതികരണത്തിനായി കാത്തിരിക്കുന്നു"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"റീഡയറക്‌റ്റ് ചെയ്‌ത പ്രതികരണം ലഭിച്ചു"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"രണ്ടാമത്തെ SOAP എക്‌സ്‌ചേഞ്ച്"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"മൂന്നാമത്തെ SOAP എക്‌സ്‌ചേഞ്ച്"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"വിശ്വസനീയ റൂട്ട് സര്‍ട്ടിഫിക്കറ്റുകള്‍ വീണ്ടെടുക്കുന്നു"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"പ്രൊവിഷനിംഗ് പൂര്‍ത്തിയായി"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"വളരെ കുറഞ്ഞ വേഗത്തിൽ"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"കുറഞ്ഞ വേഗത്തിൽ"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"ശരി"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"സജീവമായി തുടരുക"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"ചാർജ്ജ് ചെയ്യുമ്പോൾ സ്‌ക്രീൻ ഒരിക്കലും ഉറങ്ങില്ല"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"ബ്ലൂടൂത്ത് HCI സ്‌നൂപ്പ് ലോഗ് സജീവമാക്കൂ"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"എല്ലാ Bluetooth HCI പാക്കറ്റുകളും ഒരു ഫയലിൽ ക്യാപ്‌ചർ ചെയ്യുക (ഈ ക്രമീകരണം മാറ്റിയ ശേഷം Bluetooth മാറ്റുക)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM അൺലോക്കുചെയ്യൽ"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"അൺലോക്കാകാൻ ബൂട്ട്‌ലോഡറിനെ അനുവദിക്കുക"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM അൺലോക്കുചെയ്യൽ അനുവദിക്കണോ?"</string>
diff --git a/packages/SettingsLib/res/values-mn/arrays.xml b/packages/SettingsLib/res/values-mn/arrays.xml
index 9b057fb..4ed99c6 100644
--- a/packages/SettingsLib/res/values-mn/arrays.xml
+++ b/packages/SettingsLib/res/values-mn/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"HDCP шалгахыг зөвхөн DRM контентэд ашиглах"</item>
     <item msgid="45075631231212732">"Байнга HDCP шалгахыг ашиглах"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (Өгөгдмөл)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index 7c8aa8b..46415e2 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s-р автоматаар холбогдсон"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Сүлжээний үнэлгээ үзүүлэгчээр автоматаар холбогдох"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s-р холбогдсон"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>-н <xliff:g id="SSID">%1$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s-р боломжтой"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Тохируулахын тулд товшино уу"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Холбогдсон хэдий ч интернет алга"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Интернэт алга"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Нэвтрэх шаардлагатай"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Хандах цэг түр хугацаанд дүүрсэн байна"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s-р холбогдсон"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"%1$s-р боломжтой"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Холбогдож чадсангүй"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"OSU серверийн URL хүчингүй байна"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU серверт холбогдож чадсангүй"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU серверийг бататгаж чадсангүй"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"OSU серверийн гэрчилгээ хүчингүй байна"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Хангамжийг тасаллаа"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Хангамж боломжгүй байна"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"OSU серверийн URL хүчингүй байна"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Тушаалын тооцоолоогүй төрөл байна"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"SOAP мессежийн тооцоолоогүй төрөл байна"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP мессежийг солилцож чадсангүй"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Дахин чиглүүлэх сонсогчийг эхлүүлж чадсангүй"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Завсарлагыг дахин чиглүүлэхээр хүлээж байна"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"OSU үйл ажиллагаа олдсонгүй"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"SOAP мессежийн тооцоолоогүй төлөв байна"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO-г олж чадсангүй"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"AAA серверийн итгэмжлэлийн үндсэн зангилаа цэгийг олж чадсангүй"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Сайжруулалтын серверийн итгэмжлэлийн үндсэн зангилаа цэгийг олж чадсангүй"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Удирдамжийн серверийн итгэмжлэлийн үндсэн зангилааны цэгийг олж чадсангүй"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Итгэмжлэлийн үндсэн гэрчилгээг сэргээж чадсангүй"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"AAA серверийн итгэмжлэлийн үндсэн гэрчилгээг олж чадсангүй"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"PassPoint-н тохируулгыг нэмж чадсангүй"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"OSU нийлүүлэгчийг олж чадсангүй"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Холбогдож байна"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Холбогдсон"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"OSU серверт холбогдож байна"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU серверийг баталлаа"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"OSU серверт холбогдлоо"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"SOAP-г анх удаа солилцож байна"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Дахин чиглүүлэх хариу үйлдлийг хүлээж байна"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Дахин чиглүүлэх хариу үйлдлийг хүлээн авлаа"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"SOAP-г хоёр дахь удаагаа солилцож байна"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"SOAP-г гурав дахь удаагаа солилцож байна"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Итгэмжлэлийн үндсэн гэрчилгээг сэргээж байна"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Хангаж дууслаа"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Маш удаан"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Удаан"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"ЗА"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Идэвхтэй байлгах"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Цэнэглэж байх үед дэлгэц хэзээ ч амрахгүй"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Bluetooth HCI снүүп логыг идэвхжүүлэх"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Файлд Bluetooth HCI-н бүх багцыг авах (Энэ тохиргоог өөрчилсний дараа Bluetooth-г унтраах/асаах)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM түгжээ тайлагч"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Bootloader-н түгжээг тайлахыг зөвшөөрөх"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM түгжээ тайлагчийг зөвшөөрөх үү?"</string>
diff --git a/packages/SettingsLib/res/values-mr/arrays.xml b/packages/SettingsLib/res/values-mr/arrays.xml
index f5bf2ea..9fc6970 100644
--- a/packages/SettingsLib/res/values-mr/arrays.xml
+++ b/packages/SettingsLib/res/values-mr/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"केवळ DRM सामग्रीसाठी HDCP तपासणी वापरा"</item>
     <item msgid="45075631231212732">"नेहमी HDCP तपासणी वापरा"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (डीफॉल्ट)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index 3ab2a4b..47757e4 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s द्वारे स्वयंचलितपणे कनेक्ट केले"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"नेटवर्क रेटिंग प्रदात्याद्वारे स्वयंचलितपणे कनेक्ट केले"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s द्वारे कनेक्‍ट केले"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g> चे <xliff:g id="SSID">%1$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s द्वारे उपलब्‍ध"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"सेट करण्यासाठी टॅप करा"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"कनेक्‍ट केले, इंटरनेट नाही"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"इंटरनेट नाही"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"साइन इन करणे आवश्यक आहे"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"अॅक्सेस पॉइंट तात्पुरते भरलेले"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s ने कनेक्‍ट केले"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"%1$s ने उपलब्‍ध"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"कनेक्शन झाले नाही"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"चुकीचे OSU सर्व्हर URL"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU सर्व्हर कनेक्शन करता आले नाही"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU सर्व्हर पडताळणी करता आली नाही"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"चुकीचे OSU सर्व्हर सर्टिफिकेट"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"तरतूद निरस्त केली"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"तरतूद उपलब्ध नाही"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"चुकीचे OSU सर्व्हर URL"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"अनपेक्षित कमांड प्रकार"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"अनपेक्षित SOAP संदेश प्रकार"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP मेसेज एक्सचेंज करता आले नाही"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"रीडिरेक्ट श्रोता सुरू करता आले नाही"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"रीडिरेक्टसाठी पाहाण्याची वेळ संपली"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"कोणतीही OSU अ‍ॅक्टिव्हिटी आढळली नाही"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"अनपेक्षित SOAP मेसेज स्थिती"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO शोधता आले नाही"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"AAA सर्व्हरसाठी विश्वासू रूट नोड शोधता आले नाही"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"उपाय सर्व्हरसाठी विश्वासू रूट नोड शोधता आले नाही"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"धोरण सर्व्हरसाठी विश्वासू रूट नोड शोधता आले नाही"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"विश्वासू रूट सर्टिफिकेट परत मिळवता आली नाहीत"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"AAA सर्व्हरसाठी विश्वासू रूट सर्टिफिकेट शोधता आले नाही"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"PassPoint कॉन्फिगरेशन जोडता आले नाही"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"OSU पुरवठादार शोधता आला नाही"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"कनेक्ट करत आहे"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"कनेक्ट केले"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"OSU शी कनेक्‍ट करत आहे"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU सर्व्हर पडताळण्यात आले"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"OSU सर्व्हरशी कनेक्ट केले"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"सुरुवातीचे SOAP एक्सचेंज"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"रीडिरेक्ट प्रतिसादासाठी वाट पाहत आहे"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"रीडिरेक्ट प्रतिसाद मिळाला"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"द्वितीय SOAP एक्‍सचेंज"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"तृतीय SOAP एक्‍सचेंज"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"विश्वासू रूट सर्टिफिकेट परत मिळवत आहे"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"तरतूद पूर्ण झाली"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"खूप हळू"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"हळू"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"ठीक आहे"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"सक्रिय रहा"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"चार्ज होत असताना स्क्रीन कधीही निष्क्रिय होणार नाही"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"ब्लूटूथ HCI स्नूप लॉग सुरू करा"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"फाइलमध्ये सर्व ब्लूटूथ HCI पॅकेट्स कॅप्चर करा (हे सेटिंग बदलल्यानंतर ब्ल्यूटूथ टॉगल करा)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM अनलॉक करणे"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"बूटलोडर अनलॉक करण्यासाठी अनुमती द्या"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM अनलॉक करण्यास अनुमती द्यायची?"</string>
diff --git a/packages/SettingsLib/res/values-ms/arrays.xml b/packages/SettingsLib/res/values-ms/arrays.xml
index ad12a77..3ecd792 100644
--- a/packages/SettingsLib/res/values-ms/arrays.xml
+++ b/packages/SettingsLib/res/values-ms/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Gunakan penyemakan HDCP untuk kandungan DRM sahaja"</item>
     <item msgid="45075631231212732">"Sentiasa gunakan penyemakan HDCP"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (Lalai)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index 5459b80..12e463c 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Disambungkan secara automatik melalui %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Disambungkan secara automatik melalui pembekal penilaian rangkaian"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Disambungkan melalui %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> oleh <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Tersedia melalui %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Ketik untuk menyediakan"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Disambungkan, tiada Internet"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Tiada Internet"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Log masuk diperlukan"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Titik akses penuh buat sementara waktu"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Disambungkan melalui %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Tersedia melalui %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Sambungan gagal"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"URL pelayan OSU tidak sah"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Sambungan pelayan OSU gagal"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Pengesahan pelayan OSU gagal"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Sijil pelayan OSU tidak sah"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Peruntukan dihenti paksa"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Peruntukan tidak tersedia"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"URL pelayan OSU tidak sah"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Jenis perintah tidak dijangka"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Jenis mesej SOAP tidak dijangka"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Pertukaran mesej SOAP gagal"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Ubah hala pendengar gagal dimulakan"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Tamat masa menunggu ubah hala"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Tiada aktiviti OSU yang ditemukan"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Status mesej SOAP tidak dijangka"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Gagal menemukan PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Gagal menemukan nod akar amanah untuk pelayan AAA"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Gagal menemukan nod akar amanah untuk pelayan pemulihan"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Gagal menemukan nod akar amanah untuk pelayan dasar"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Gagal mengambil sijil akar amanah"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Gagal menemukan sijil akar amanah untuk pelayan AAA"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Gagal menambah konfigurasi PassPoint"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Gagal menemukan pembekal OSU"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Menyambung"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Disambungkan"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Menyambung ke pelayan OSU"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Pelayan OSU disahkan"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Disambungkan ke pelayan OSU"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Pertukaran SOAP permulaan"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Menunggu respons ubah hala"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Menerima respons ubah hala"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Pertukaran SOAP kedua"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Pertukaran SOAP ketiga"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Mengambil sijil akar amanah"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Peruntukan selesai"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Sangat Perlahan"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Perlahan"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Tetap berjaga"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Skrin tidak sekali-kali akan tidur semasa pengecasan"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Dayakan log intip HCI Bluetooth"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Tangkap semua paket HCI Bluetooth dalam fail (Togol Bluetooth selepas menukar tetapan ini)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Pembukaan kunci OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Benarkan pemuat but untuk dibuka kunci"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Benarkan pembukaan kunci OEM?"</string>
diff --git a/packages/SettingsLib/res/values-my/arrays.xml b/packages/SettingsLib/res/values-my/arrays.xml
index 62b3cc5..75ee0cb 100644
--- a/packages/SettingsLib/res/values-my/arrays.xml
+++ b/packages/SettingsLib/res/values-my/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"DRM အကြောင်းအရာအတွက်သာ HDCP စစ်ဆေးမည်"</item>
     <item msgid="45075631231212732">"HDCP checkingအားအမြဲသုံးပါ"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (မူလ)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index 254de2a..c9896f0 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s မှတစ်ဆင့် အလိုအလျောက် ချိတ်ဆက်ထားပါသည်"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"ကွန်ရက်အဆင့်သတ်မှတ်ပေးသူ မှတစ်ဆင့် အလိုအလျောက် ချိတ်ဆက်ထားပါသည်"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s မှတစ်ဆင့် ချိတ်ဆက်ထားသည်"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g> ၏ <xliff:g id="SSID">%1$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s မှတစ်ဆင့်ရနိုင်သည်"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"စနစ်ထည့်သွင်းရန် တို့ပါ"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"ချိတ်ဆက်ထားသည်၊ အင်တာနက်မရှိ"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"အင်တာနက် မရှိပါ"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"လက်မှတ်ထိုးဝင်ရန် လိုအပ်သည်"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ကွန်ရက်ချိတ်ဆက်မှု ယာယီပြည့်နေသည်"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s မှတစ်ဆင့် ချိတ်ဆက်ထားသည်"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"%1$s မှတစ်ဆင့် ရနိုင်သည်"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"ချိတ်ဆက်၍ မရပါ"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"မမှန်ကန်သည့် OSU ဆာဗာ URL"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU ဆာဗာသို့ ချိတ်ဆက်၍ မရပါ"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU ဆာဗာကို အတည်ပြု၍မရပါ"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"မမှန်ကန်သည့် OSU ဆာဗာအသိအမှတ်ပြုလက်မှတ်"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"ပံ့ပိုးခြင်းကို ဖျက်သိမ်းလိုက်ပါပြီ"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"ပံ့ပိုးမှု မရနိုင်ပါ"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"မမှန်ကန်သည့် OSU ဆာဗာ URL"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"မျှော်လင့်မထားသော ကွန်မန်းအမျိုးအစား"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"မမျှော်လင့်ထားသည့် SOAP မက်ဆေ့ဂျ်အမျိုးအစား"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP မက်ဆေ့ဂျ်ကို ဖလှယ်၍ မရပါ"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"တစ်ဆင့်ပြန်ညွှန်ချက်ကို စောင့်ကြည့်သည့်စနစ်ကို စတင်၍မရပါ"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"တစ်ဆင့်ပြန်ညွှန်ချက်ကို စောင့်ရာတွင် အချိန်ကုန်သွားပါပြီ"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"မည်သည့် OSU လုပ်ဆောင်ချက်ကိုမျှ မတွေ့ပါ"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"မျှော်လင့်မထားသော SOAP မက်ဆေ့ဂျ်အခြေအနေ"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO ကို ရှာမတွေ့ပါ"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"AAA ‌ဆာဗာအတွက် ယုံကြည်ချက်ဆိုင်ရာ အရင်းအမြစ်စက် နုတ်ကို ရှာမတွေ့ပါ"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"ပြောင်း‌ရွှေ့ခြင်းဆာဗာအတွက် ယုံကြည်ချက်ဆိုင်ရာ အရင်းအမြစ် နုတ်ကို ရှာ‌မတွေ့ပါ"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"မူဝါဒဆာဗာအတွက် ယုံကြည်ချက်ဆိုင်ရာ အရင်းအမြစ် နုတ်ကို ရှာ‌မတွေ့ပါ"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"ယုံကြည်ချက်ဆိုင်ရာ အရင်းအမြစ်အသိအမှတ်ပြုလက်မှတ်များကို ယူ၍မရပါ"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"AAA ဆာဗာအတွက် ယုံကြည်ချက်ဆိုင်ရာ အရင်းအမြစ် အသိအမှတ်ပြုလက်မှတ်ကို ရှာမတွေ့ပါ"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"PassPoint စီစဉ်သတ်မှတ်ချက်ကို ထည့်၍မရပါ"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"OSU ‌ဝန်ဆောင်မှုထောက်ပံ့သူကို ရှာမတွေ့ပါ"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"ချိတ်ဆက်နေသည်"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"ချိတ်ဆက်ထားသည်"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"OSU ဆာဗာသို့ ချိတ်ဆက်နေသည်"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU ဆာဗာကို အတည်ပြုထားသည်"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"OSU ဆာဗာသို့ ချိတ်ဆက်ထားသည်"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"ကနဦး SOAP ဖလှယ်မှု"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"တစ်ဆင့်ပြန်ညွှန်သည့် တုံ့ပြန်ချက်ကို စောင့်နေသည်"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"တစ်ဆင့်ပြန်ညွှန်ထားသည့် တုံ့ပြန်မှုကို ရရှိထားသည်"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"ဒုတိယ SOAP ဖလှယ်မှု"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"တတိယ SOAP ဖလှယ်မှု"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"ယုံကြည်မှုဆိုင်ရာ အရင်းအမြစ်အသိအမှတ်ပြုလက်မှတ်များ ရယူနေသည်"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"ပံ့ပိုးပြီးပါပြီ"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"အလွန်နှေး"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"နှေး"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"ဖွင့်လျက်သား"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"အားသွင်းနေစဉ် ဖန်သားပြင်မှာဘယ်သောအခါမှ ပိတ်မည်မဟုတ်ပါ။"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"ဘလူးတုသ် HCI snoop မှတ်တမ်းကို ဖွင့်ခြင်း"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"ဖိုင်တစ်ခုတွင် ဘလူးတုသ် HCI အစုလိုက်များကို သိမ်းယူရန် (ဤဆက်တင်ကို ပြောင်းပြီးသည့်အခါ ဘလူးတုသ် ဖွင့်/ပိတ် လုပ်ပါ)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM သော့ဖွင့်ခြင်း"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"အစပြုခြင်းကိရိယာအား သော့ဖွင့်ရန် ခွင့်ပြုမည်"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM သော့ဖွင့်ခြင်း ခွင့်ပြုမလား?"</string>
diff --git a/packages/SettingsLib/res/values-nb/arrays.xml b/packages/SettingsLib/res/values-nb/arrays.xml
index 68e864a..214e2d5 100644
--- a/packages/SettingsLib/res/values-nb/arrays.xml
+++ b/packages/SettingsLib/res/values-nb/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Bruk HDCP-kontroll kun for DRM-innhold"</item>
     <item msgid="45075631231212732">"Bruk alltid HDCP-kontroll"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (standard)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index 5d5568f..86f5347 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatisk tilkoblet via %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatisk tilkoblet via leverandør av nettverksvurdering"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Tilkoblet via %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> fra <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Tilgjengelig via %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Trykk for å konfigurere"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Tilkoblet – ingen Internett-tilgang"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Ingen internettilkobling"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Pålogging kreves"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Tilgangspunktet er midlertidig fullt"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Tilkoblet via %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Tilgjengelig via %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Kunne ikke koble til"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Ugyldig nettadresse for OSU-tjener"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Tilkoblingen til OSU-tjeneren mislyktes"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Godkjenning av OSU-tjeneren mislyktes"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Ugyldig sertifikat for OSU-tjener"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Identitetshåndtering ble avbrutt"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Identitetshåndtering er ikke tilgjengelig"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Ugyldig nettadresse for OSU-tjener"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Uventet kommandotype"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Uventet SOAP-meldingstype"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Utveksling av SOAP-melding mislyktes"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Lytteren for viderekoblinger kunne ikke starte"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Tidsavbrudd ved venting for viderekobling"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Fant ingen OSU-aktivitet"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Uventet status for SOAP-melding"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Kunne ikke finne PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Kunne ikke finne rotnode for klarering for AAA-tjeneren"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Kunne ikke finne rotnode for klarering for tjeneren for utbedringer"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Kunne ikke finne rotnode for klarering for tjeneren for retningslinjer"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Kunne ikke hente rotsertifikatene for klarering"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Kunne ikke finne rotsertifikat for klarering for AAA-tjeneren"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Kunne ikke legge til PassPoint-konfigurering"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Kunne ikke finne en OSU-leverandør"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Kobler til"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Tilkoblet"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Kobler til OSU-tjeneren"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU-tjeneren er godkjent"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Koblet til OSU-tjener"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Første SOAP-utveksling"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Venter på viderekoblingssvar"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Har mottatt viderekoblingssvar"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Andre SOAP-utveksling"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Tredje SOAP-utveksling"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Henter rotsertifikater for klarering"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Identitetshåndtering er fullført"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Veldig treg"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Treg"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"Ok"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Forbli våken"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Skjermen blir aldri svart under lading"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Slå på Bluetooth HCI snoop-logg"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Samle alle Bluetooth HCI-pakker i en fil (slå Bluetooth av/på etter at du har endret denne innstillingen)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM-opplåsing"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Tillat at oppstartsinnlasteren låses opp"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Vil du tillate OEM-opplåsing?"</string>
diff --git a/packages/SettingsLib/res/values-ne/arrays.xml b/packages/SettingsLib/res/values-ne/arrays.xml
index 4ed55cc..a246d606 100644
--- a/packages/SettingsLib/res/values-ne/arrays.xml
+++ b/packages/SettingsLib/res/values-ne/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"DRM सामग्रीको लागि मात्र HDCP जाँचको प्रयोग गर्नुहोस्"</item>
     <item msgid="45075631231212732">"सधैँ HDCP जाँच प्रयोग गर्नुहोस्"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP १.४ (पूर्वनिर्धारित)"</item>
     <item msgid="2809759619990248160">"AVRCP १.३"</item>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index f63e9d7..eb6d9d3 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s मार्फत् स्वतः जडान गरिएको"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"नेटवर्कको दर्जा प्रदायक मार्फत स्वत: जडान गरिएको"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s मार्फत जडित"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g> को <xliff:g id="SSID">%1$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s मार्फत उपलब्ध"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"सेटअप गर्न ट्याप गर्नुहोस्"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"जडान गरियो तर इन्टरनेट छैन"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"इन्टरनेटमाथिको पहुँच छैन"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"साइन इन गर्न आवश्यक छ"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"पहुँचसम्बन्धी स्थान अस्थायी रूपमा भरिएको छ"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s मार्फत जडान गरियो"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"%1$s मार्फत उपलब्ध"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"जडान गर्न सकिएन"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"OSU सर्भरको अमान्य URL"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU सर्भरमा जडान गर्न सकिएन"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU सर्भर प्रमाणीकरण गर्न सकिएन"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"अमान्य OSU सर्भरको प्रमाणपत्र"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"प्रावधानीकरण रद्द गरियो"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"प्रावधानीकरण गर्ने कार्य उपलब्ध छैन"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"OSU सर्भरको अमान्य URL"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"अनपेक्षित आदेशको प्रकार"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"अनपेक्षित प्रकारको SOAP सन्देश"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP सन्देशको विनिमय असफल भयो"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"रिडिरेक्ट श्रोता सुरु गर्न सकिएन"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"रिडिरेक्ट गर्नका लागि प्रतीक्षा गर्ने समय सकियो"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"कुनै पनि OSU क्रियाकलाप फेला परेन"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"अनपेक्षित SOAP सन्देशको स्थिति"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO फेला पार्न सकिएन"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"AAA सर्भरको विश्वसनीय मूल नोड फेला पार्न सकिएन"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"समाधान गर्ने काम हुने सर्भरका लागि विश्वसनीय मूल नोड फेला पार्न सकिएन"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"नीतिको सर्भरका लागि विश्वसनीय मूल नोड फेला पार्न सकिएन"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"विश्वसनीय मूल प्रमाणपत्रहरू फेला पार्न सकिएन"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"AAA सर्भरका लागि विश्वसनीय मूल प्रमाणपत्र फेला पार्न सकिएन"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"PassPoint कन्फिगुरेसन थप्न सकिएन"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"कुनै OSU प्रदायक फेला पार्न सकिएन"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"जडान गर्दै"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"जडान गरिएको छ"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"OSU सर्भरमा जडान गर्दै"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU सर्भर प्रमाणीकरण गरियो"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"OSU सर्भरमा जडान गरियो"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"प्रारम्भिक SOAP विनिमय"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"रिडिरेक्ट प्रतिक्रियाको प्रतिक्षा गर्दै"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"रिडिरेक्ट प्रतिक्रिया प्राप्त गरियो"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"दोस्रो SOAP विनिमय"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"तेस्रो SOAP विनिमय"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"विश्वसनीय मूल प्रमाणपत्रहरू प्राप्त गर्दै"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"प्रावधानीकरण गर्ने प्रक्रिया सम्पन्न भयो"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"धेरै ढिलो"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"बिस्तारै"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"ठिक छ"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"जागा रहनुहोस्"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"चार्ज गर्ने बेलामा स्क्रिन कहिल्यै सुत्दैन।"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"ब्लुटुथ HCI snoop लग सक्षम पार्नुहोस्"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"फाइलका सबै ब्लुटुथ HCI प्याकेटहरू समावेश गर्नुहोस्‌ (यो सेटिङ परिवर्तन गरेपछि ब्लुटुथ टगल गर्नुहोस्)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM अनलक गर्दै"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"अनलक हुन बूटलोडरलाई अनुमति दिनुहोस्"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM अनलक गर्न अनुमति दिने?"</string>
diff --git a/packages/SettingsLib/res/values-nl/arrays.xml b/packages/SettingsLib/res/values-nl/arrays.xml
index 621e3065..4aa4eae 100644
--- a/packages/SettingsLib/res/values-nl/arrays.xml
+++ b/packages/SettingsLib/res/values-nl/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"HDCP-controle alleen voor DRM-content gebruiken"</item>
     <item msgid="45075631231212732">"HDCP-controle altijd gebruiken"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (standaard)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index 798dc7c..019f225 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatisch verbonden via %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatisch verbonden via provider van netwerkbeoordelingen"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Verbonden via %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> via <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Beschikbaar via %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Tik om in te stellen"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Verbonden, geen internet"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Geen internet"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Inloggen vereist"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Toegangspunt tijdelijk vol"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Verbonden via %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Beschikbaar via %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Verbinding mislukt"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Ongeldige URL voor OSU-server"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Verbinding met OSU-server mislukt"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Validatie van OSU-server mislukt"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Ongeldig OSU-servercertificaat"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Registratie afgebroken"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Registratie niet beschikbaar"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Ongeldige URL voor OSU-server"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Onverwacht opdrachttype"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Onverwacht SOAP-berichttype"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP-berichtuitwisseling mislukt"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Kan listener voor omleiding niet starten"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Time-out bij wachten op omleiding"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Geen OSU-activiteit gevonden"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Onverwachte SOAP-berichtstatus"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Kan PPS-MO niet vinden"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Kan geen vertrouwde root-node vinden voor AAA-server"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Kan geen vertrouwde root-node vinden voor herstelserver"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Kan geen vertrouwde root-node vinden voor beleidsserver"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Kan vertrouwde rootcertificaten niet ophalen"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Kan geen vertrouwd rootcertificaat vinden voor AAA-server"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Kan PassPoint-configuratie niet toevoegen"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Kan geen OSU-provider vinden"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Verbinden"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Verbonden"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Verbinden met OSU-server"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU-server gevalideerd"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Verbonden met OSU-server"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Eerste SOAP-uitwisseling"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Wachten op omleidingsreactie"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Omleidingsreactie ontvangen"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Tweede SOAP-uitwisseling"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Derde SOAP-uitwisseling"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Vertrouwde rootcertificaten ophalen"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Registratie voltooid"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Zeer langzaam"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Langzaam"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"Redelijk"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Stand-by"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Scherm gaat nooit uit tijdens het opladen"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Snoop-logbestand voor Bluetooth-HCI inschakelen"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Alle Bluetooth-HCI-pakketten tot één bestand samenvoegen. (Schakel Bluetooth in nadat je deze instelling hebt gewijzigd.)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM-ontgrendeling"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Toestaan dat de bootloader wordt ontgrendeld"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM-ontgrendeling toestaan?"</string>
diff --git a/packages/SettingsLib/res/values-or/arrays.xml b/packages/SettingsLib/res/values-or/arrays.xml
index 18de8f9..15c3ee5 100644
--- a/packages/SettingsLib/res/values-or/arrays.xml
+++ b/packages/SettingsLib/res/values-or/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"କେବଳ DRM କଣ୍ଟେଣ୍ଟ ପାଇଁ HDCP ଯାଞ୍ଚ ବ୍ୟବହାର କରନ୍ତୁ"</item>
     <item msgid="45075631231212732">"ସର୍ବଦା HDCP ଯାଞ୍ଚ ବ୍ୟବହାର କରନ୍ତୁ"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (ଡିଫଲ୍ଟ)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index 9491af3..b1d1179 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s ମାଧ୍ୟମରେ ଅଟୋମେଟିକାଲୀ ସଂଯୁକ୍ତ"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"ନେଟୱର୍କ ମୂଲ୍ୟାୟନ ପ୍ରଦାତାଙ୍କ ମାଧ୍ୟମରେ ଅଟୋମେଟିକାଲ୍ୟ ସଂଯୁକ୍ତ"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s ମାଧ୍ୟମରେ ସଂଯୁକ୍ତ"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g> ଦ୍ଵାରା <xliff:g id="SSID">%1$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s ମାଧ୍ୟମରେ ଉପଲବ୍ଧ"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"ସେଟ୍‌ଅପ୍‌ କରିବାକୁ ଟାପ୍‌ କରନ୍ତୁ"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"ସଂଯୁକ୍ତ, ଇଣ୍ଟର୍‌ନେଟ୍‌ ନାହିଁ"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"କୌଣସି ଇଣ୍ଟରନେଟ୍‌ ନାହିଁ"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"ସାଇନ୍-ଇନ୍ ଆବଶ୍ୟକ"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ଆକ୍ସେସ୍ ପଏଣ୍ଟ ସାମୟିକ ଭାବେ ପୂର୍ଣ୍ଣ"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s ମାଧ୍ୟମରେ ସଂଯୁକ୍ତ"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"%1$s ମାଧ୍ୟମରେ ଉପଲବ୍ଧ"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"ସଂଯୋଗ ହେଇପାରିଲା ନାହିଁ"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"ଅବୈଧ OSU ସର୍ଭର୍ URL"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU ସର୍ଭର୍ ସଂଯୋଗ ପ୍ରକ୍ରିୟା ବିଫଳ ହେଲା"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU ସର୍ଭର୍ ବୈଧକରଣ ବିଫଳ ହେଲା"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"ଅବୈଧ OSU ସର୍ଭର୍ ସାର୍ଟିଫିକେଟ୍"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"ପ୍ରାବଧାନ ବାତିଲ୍ କରାଯାଇଛି"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"ପ୍ରାବଧନ ଉପଲବ୍ଧ ନାହିଁ"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"ଅବୈଧ OSU ସର୍ଭର୍ URL"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"ଅପ୍ରତ୍ୟାଶିତ ନିର୍ଦ୍ଦେଶ ପ୍ରକାର"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"ଅପ୍ରତ୍ୟାଶିତ SOAP ମେସେଜ୍ ପ୍ରକାର"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP ମେସେଜ୍ ଏକ୍ସଚେଞ୍ଜ ବିଫଳ ହେଲା"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"ପୁନଃନିର୍ଦ୍ଦେଶ ଶ୍ରୋତା ଆରମ୍ଭ କରିବାରେ ବିଫଳ ହେଲା"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"ସମୟ ଶେଷ ହୋଇଛି, ପୁନଃନିର୍ଦ୍ଦେଶ ପାଇଁ ଅପେକ୍ଷାରତ"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"କୌଣସି OSU ଗତିବିଧି ମିଳିଲା ନାହିଁ"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"ଅପ୍ରତ୍ୟାଶିତ SOAP ମେସେଜ୍ ସ୍ଥିତି"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO ଖୋଜିବାରେ ବିଫଳ ହେଲା"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"AAA ସର୍ଭର୍ ପାଇଁ ଟ୍ରଷ୍ଟ ରୁଟ୍ ନୋଡ୍ ଖୋଜିବାରେ ବିଫଳ ହେଲା"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"ରିମେଡିଟେସନ୍ ସର୍ଭର୍ ପାଇଁ ଟ୍ରଷ୍ଟ ରୁଟ୍ ନୋଡ୍ ଖୋଜିବାରେ ବିଫଳ ହେଲା"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"ପଲିସି ସର୍ଭର୍ ପାଇଁ ଟ୍ରଷ୍ଟ ରୁଟ୍ ନୋଡ୍ ଖୋଜିବାରେ ବିଫଳ ହେଲା"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"ଟ୍ରଷ୍ଟ ରୁଟ୍ ସାର୍ଟିଫିକେଟ୍‌କୁ ପୁନରୁଦ୍ଧାର କରିହେଲା ନାହିଁ"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"AAA ସର୍ଭର୍ ପାଇଁ ଟ୍ରଷ୍ଟ ରୁଟ୍ ସାର୍ଟିଫିକେଟ୍ ଖୋଜିବାରେ ବିଫଳ ହେଲା"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"PassPoint କନ୍‌ଫିଗ୍‌ରେସନ୍ ଯୋଗ କରିବାରେ ବିଫଳ ହେଲା"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"ଏକ OSU ପ୍ରଦାତା ଖୋଜିବାରେ ବିଫଳ ହେଲା"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"ସଂଯୋଗ କରୁଛି"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"ସଂଯୋଗ ହୋଇଛି"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"OSU ସର୍ଭର୍‌ରେ ସଂଯୋଗ କରାଯାଉଛି"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU ସର୍ଭର୍‍ ବୈଧକରଣ କରାଗଲା"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"OSU ସର୍ଭର ସହ ସଂଯୋଗ କରାଯାଇଛି"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"ପ୍ରାରମ୍ଭିକ SOAP ଏକ୍ସଚେଞ୍ଜ"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"ପୁନଃନିର୍ଦ୍ଦେଶ ପ୍ରତିକ୍ରିୟା ପାଇଁ ଅପେକ୍ଷାରତ"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"ପୁନଃନିର୍ଦ୍ଦେଶିତ ପ୍ରତିକ୍ରିୟା ପ୍ରାପ୍ତ ହୋଇଛି"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"ଦ୍ଵିତୀୟ SOAP ଏକ୍ସଚେଞ୍ଜ"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"ତୃତୀୟ SOAP ଏକ୍ସଚେଞ୍ଜ"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"ଟ୍ରଷ୍ଟ ରୁଟ୍ ସାର୍ଟିଫିକେଟ୍‌କୁ ପୁନରୁଦ୍ଧାର କରାଯାଉଛି"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"ପ୍ରାବଧାନ ସମ୍ପୂର୍ଣ୍ଣ ହୋଇଛି"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"ବହୁତ ମନ୍ଥର"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"କମ୍‌ ବେଗ"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"ଠିକ୍‌ ଅଛି"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"ଜାଗ୍ରତ ରଖନ୍ତୁ"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"ଚାର୍ଜ ହେବାବେଳେ ସ୍କ୍ରୀନ୍‌ ଆଦୌ ବନ୍ଦ ହେବନାହିଁ"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"ବ୍ଲୁ-ଟୂଥ୍‍‌ HCI ସ୍ନୁପ୍‌ ଲଗ୍‌ ସକ୍ଷମ କରନ୍ତୁ"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"ଗୋଟିଏ ଫାଇଲ୍‌ରେ ସମସ୍ତ ବ୍ଲୁ-ଟୂଥ୍‍‌ HCI ପ୍ୟାକେଟ୍‌ଗୁଡ଼ିକୁ କ୍ୟାପଚର୍‌ କରନ୍ତୁ (ଏହି ସେଟିଙ୍ଗ ବଦଳାଇବା ପରେ ବ୍ଲୁ-ଟୂଥ୍‍‌କୁ ଟୋଗଲ୍ କରନ୍ତୁ)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM ଅନଲକ୍‌ କରିବା"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"bootloaderକୁ ଅନ୍‌ଲକ୍‌ ହେବାର ଅନୁମତି ଦିଅନ୍ତୁ"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM ଅନଲକ୍‌ କରିବା ଅନୁମତି ଦେବେ?"</string>
diff --git a/packages/SettingsLib/res/values-pa/arrays.xml b/packages/SettingsLib/res/values-pa/arrays.xml
index 047dcb1..45d96b7 100644
--- a/packages/SettingsLib/res/values-pa/arrays.xml
+++ b/packages/SettingsLib/res/values-pa/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"ਸਿਰਫ਼ DRM ਸਮੱਗਰੀ ਲਈ HDCP ਜਾਂਚ ਦੀ ਵਰਤੋਂ ਕਰੋ"</item>
     <item msgid="45075631231212732">"ਹਮੇਸਾਂ HDCP ਜਾਂਚ ਵਰਤੋ"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (ਪੂਰਵ-ਨਿਰਧਾਰਤ)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index eadc554..6ba9de7 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s ਰਾਹੀਂ ਆਪਣੇ-ਆਪ ਕਨੈਕਟ ਹੋਇਆ"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"ਨੈੱਟਵਰਕ ਰੇਟਿੰਗ ਪ੍ਰਦਾਨਕ ਰਾਹੀਂ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਕਨੈਕਟ ਹੋਇਆ"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s ਰਾਹੀਂ ਕਨੈਕਟ ਕੀਤਾ"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g> ਵੱਲੋਂ <xliff:g id="SSID">%1$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s ਰਾਹੀਂ ਉਪਲਬਧ"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"ਸੈੱਟਅੱਪ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"ਕਨੈਕਟ ਕੀਤਾ, ਕੋਈ ਇੰਟਰਨੈੱਟ ਨਹੀਂ"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"ਇੰਟਰਨੈੱਟ ਨਹੀਂ"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"ਸਾਈਨ-ਇਨ ਲੋੜੀਂਦਾ ਹੈ"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ਐਕਸੈੱਸ ਪੁਆਇੰਟ ਅਸਥਾਈ ਤੌਰ \'ਤੇ ਸੰਪੂਰਨ ਰੁਝੇਂਵੇਂ ਵਿੱਚ ਹੈ"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s ਰਾਹੀਂ ਕਨੈਕਟ ਕੀਤਾ"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"%1$s ਰਾਹੀਂ ਉਪਲਬਧ"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"ਕਨੈਕਸ਼ਨ ਅਸਫਲ ਰਿਹਾ"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"ਅਵੈਧ OSU ਸਰਵਰ URL"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU ਸਰਵਰ ਕਨੈਕਸ਼ਨ ਸਫਲ ਰਿਹਾ"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU ਸਰਵਰ ਪ੍ਰਮਾਣਿਕਤਾ ਅਸਫਲ ਰਹੀ"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"ਅਵੈਧ OSU ਸਰਵਰ ਸਰਟੀਫੀਕੇਟ"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"ਵਿਵਸਥਾਕਰਨ ਰੱਦ ਕੀਤਾ ਗਿਆ"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"ਵਿਵਸਥਾਕਰਨ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"ਅਵੈਧ OSU ਸਰਵਰ URL"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"ਅਚਾਨਕ ਆਦੇਸ਼ ਦੀ ਕਿਸਮ"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"ਅਚਾਨਕ SOAP ਦੀ ਸੁਨੇਹਾ ਕਿਸਮ"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP ਸੁਨੇਹੇ ਦਾ ਵਟਾਂਦਰਾ ਅਸਫਲ ਰਿਹਾ"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"ਰੀਡਾਇਰੈਕਟ ਲਿਸਨਰ ਨੂੰ ਸ਼ੁਰੂ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"ਰੀਡਾਇਰੈਕਟ ਦੀ ਉਡੀਕ ਕਰਨ ਦਾ ਸਮਾਂ ਸਮਾਪਤ ਹੋਇਆ"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"ਕੋਈ OSU ਸਰਗਰਮੀ ਨਹੀਂ ਮਿਲੀ"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"ਅਚਾਨਕ SOAP ਦੀ ਸੁਨੇਹੇ ਦੀ ਸਥਿਤੀ"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO ਨੂੰ ਲੱਭਣਾ ਅਸਫਲ ਰਿਹਾ"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"AAA ਸਰਵਰ ਲਈ ਭਰੋਸੇਯੋਗ ਰੂਟ ਨੋਡ ਲੱਭਣਾ ਅਸਫਲ ਰਿਹਾ"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"ਰੇਮੇਡੀਅਸ਼ਨ ਸਰਵਰ ਲਈ ਭਰੋਸੇਯੋਗ ਰੂਟ ਨੋਡ ਲੱਭਣਾ ਅਸਫਲ ਰਿਹਾ"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"ਨੀਤੀ ਸਰਵਰ ਲਈ ਭਰੋਸੇਯੋਗ ਰੂਟ ਨੋਡ ਲੱਭਣਾ ਅਸਫਲ ਰਿਹਾ"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"ਭਰੋਸੇਯੋਗ ਰੂਟ ਸਰਟੀਫਿਕੇਟਾਂ ਨੂੰ ਮੁੜ-ਪ੍ਰਾਪਤ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"AAA ਸਰਵਰ ਲਈ ਭਰੋਸੇਯੋਗ ਰੂਟ ਸਰਟੀਫਿਕੇਟ ਲੱਭਣਾ ਅਸਫਲ ਰਿਹਾ"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"PassPoint ਸੰਰੂਪਣ ਨੂੰ ਸ਼ਾਮਲ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"OSU ਪ੍ਰਦਾਨਕ ਲੱਭਣਾ ਅਸਫਲ ਰਿਹਾ"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"ਕਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"ਕਨੈਕਟ ਹੈ"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"OSU ਸਰਵਰ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU ਸਰਵਰ ਪ੍ਰਮਾਣਿਤ ਕੀਤਾ ਗਿਆ"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"OSU ਸਰਵਰ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"ਸ਼ੁਰੂਆਤੀ SOAP ਦਾ ਵਟਾਂਦਰਾ"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"ਰੀਡਾਇਰੈਕਟ ਜਵਾਬ ਲਈ ਉਡੀਕ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"ਰੀਡਾਇਰੈਕਟ ਜਵਾਬ ਪ੍ਰਾਪਤ ਹੋਇਆ"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"ਦੂਜੇ SOAP ਦਾ ਵਟਾਂਦਰਾ"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"ਤੀਜੇ SOAP ਦਾ ਵਟਾਂਦਰਾ"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"ਭਰੋਸੇਯੋਗ ਰੂਟ ਸਰਟੀਫਿਕੇਟਾਂ ਨੂੰ ਮੁੜ-ਪ੍ਰਾਪਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"ਵਿਵਸਥਾਕਰਨ ਪੂਰਾ ਹੋਇਆ"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"ਬਹੁਤ ਹੌਲੀ"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"ਹੌਲੀ"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"ਠੀਕ ਹੈ"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"ਸੁਚੇਤ ਰਹੋ"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"ਸਕ੍ਰੀਨ ਚਾਰਜਿੰਗ ਦੇ ਸਮੇਂ ਕਦੇ ਵੀ ਸਲੀਪ ਨਹੀਂ ਹੋਵੇਗੀ"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"ਬਲੂਟੁੱਥ HCI ਸਨੂਪ ਲੌਗ ਨੂੰ ਚਾਲੂ ਕਰੋ"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"ਇੱਕ ਫ਼ਾਈਲ ਵਿੱਚ ਸਾਰੇ ਬਲੂਟੁੱਥ HCI ਪੈਕੇਟਾਂ ਨੂੰ ਕੈਪਚਰ ਕਰੋ (ਇਹ ਸੈਟਿੰਗ ਬਦਲਣ ਤੋਂ ਬਾਅਦ ਬਲੂਟੁੱਥ ਟੌਗਲ ਕਰੋ)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM ਅਣਲਾਕ ਕਰਨਾ"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"ਬੂਟਲੋਡਰ ਨੂੰ ਅਣਲਾਕ ਕੀਤੇ ਜਾਣ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"ਕੀ OEM ਨੂੰ ਅਣਲਾਕ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
diff --git a/packages/SettingsLib/res/values-pl/arrays.xml b/packages/SettingsLib/res/values-pl/arrays.xml
index 4a55a99..6221793 100644
--- a/packages/SettingsLib/res/values-pl/arrays.xml
+++ b/packages/SettingsLib/res/values-pl/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Użyj sprawdzania HDCP tylko w przypadku treści chronionych DRM"</item>
     <item msgid="45075631231212732">"Zawsze używaj sprawdzania HDCP"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (domyślna)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index f94308a..609ed2a 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatycznie połączono przez: %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatycznie połączono przez dostawcę ocen jakości sieci"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Połączono przez %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g> – <xliff:g id="SSID">%1$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Dostępne przez %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Kliknij, by skonfigurować"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Połączono, brak internetu"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Brak internetu"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Musisz się zalogować"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Punkt dostępu jest tymczasowo zajęty"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Połączono przez: %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Dostępna przez: %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Nie udało się nawiązać połączenia"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Nieprawidłowy adres URL serwera OSU"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Nie udało się połączyć z serwerem OSU"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Niepowodzenie weryfikacji przez serwer OSU"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Nieprawidłowy certyfikat serwera OSU"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Udostępnianie zostało przerwane"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Udostępnianie niedostępne"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Nieprawidłowy adres URL serwera OSU"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Nieoczekiwany typ polecenia"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Nieoczekiwany typ komunikatu SOAP"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Nie udało się wymienić komunikatów SOAP"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Nie udało się uruchomić procesu nasłuchującego przekierowań"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Przekroczony limit czasu oczekiwania na przekierowanie"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Brak aktywności OSU"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Nieoczekiwany stan komunikatu SOAP"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Nie można znaleźć PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Nie można znaleźć głównego węzła zaufania dla serwera AAA"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Nie udało się znaleźć głównego węzła zaufania dla serwera naprawczego"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Nie udało się znaleźć głównego węzła zaufania dla serwera zasad"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Nie udało się pobrać głównych certyfikatów zaufania"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Nie udało się znaleźć głównego certyfikatu zaufania dla serwera AAA"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Nie można dodać konfiguracji PassPoint"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Nie udało się znaleźć dostawcy OSU"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Łączę"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Połączono"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Nawiązuję połączenie z serwerem OSU"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Pomyślna weryfikacja przez serwer OSU"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Połączono z serwerem OSU"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Początkowa wymiana SOAP"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Czekam na odpowiedź przekierowującą"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Odebrano odpowiedź przekierowującą"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Druga wymiana SOAP"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Trzecia wymiana SOAP"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Pobieram główne certyfikaty zaufania"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Zakończono udostępnianie"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Bardzo wolna"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Wolna"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Pozostaw włączony ekran"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Ekran nie będzie gaszony podczas ładowania telefonu"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Włącz dziennik snoop Bluetooth HCI"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Przechwyć wszystkie pakiety Bluetooth HCI do pliku (przełącz Bluetooth po zmianie tego ustawienia)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Zdjęcie blokady OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Zezwalaj na odblokowanie programu rozruchowego"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Zezwolić na zdjęcie blokady OEM?"</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/arrays.xml b/packages/SettingsLib/res/values-pt-rBR/arrays.xml
index 563698a..b8bb563 100644
--- a/packages/SettingsLib/res/values-pt-rBR/arrays.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Usar a verificação HDCP somente para conteúdo DRM"</item>
     <item msgid="45075631231212732">"Sempre usar a verificação HDCP"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (padrão)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index f1b043b..ef9e61d 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Conectado automaticamente via %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Conectado automaticamente via provedor de avaliação de rede"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Conectado via %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> de <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Disponível via %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Toque para configurar"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Conectada, sem Internet"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Sem Internet"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"É necessário fazer login"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Ponto de acesso temporariamente cheio"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Conectado via %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Disponível via %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Falha na conexão"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"URL do servidor OSU inválido"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Falha na conexão do servidor OSU"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Falha ao validar o servidor OSU"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Certificado do servidor OSU inválido"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Provisionamento cancelado"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Provisionamento indisponível"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"URL do servidor OSU inválido"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Tipo de comando inesperado"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Tipo de mensagem SOAP inesperado"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Falha na troca de mensagens SOAP"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Falha ao iniciar o listener de redirecionamento"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Tempo limite esgotado ao aguardar redirecionamento"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Nenhuma atividade OSU encontrada"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Status de mensagem SOAP inesperado"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Não foi possível encontrar o PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Não foi possível encontrar um nó raiz confiável para o servidor AAA"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Não foi possível encontrar um nó raiz confiável para o servidor de atualizações"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Não foi possível encontrar um nó raiz confiável para o servidor da política"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Falha ao recuperar certificados raiz confiáveis"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Não foi possível encontrar um certificado raiz confiável para o servidor AAA"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Falha ao adicionar a configuração do PassPoint"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Falha ao localizar um provedor OSU"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Conectando"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Conectado"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Conectando-se ao servidor OSU"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Servidor OSU validado"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Conectado ao servidor OSU"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Troca de SOAP inicial"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Aguardando resposta de redirecionamento"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Resposta de redirecionamento recebida"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Segunda troca de SOAP"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Terceira troca de SOAP"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Recuperando certificados raiz confiáveis"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Provisionamento concluído"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Muito lenta"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Lenta"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"Ok"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Permanecer ativo"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"A tela nunca entrará em suspensão enquanto estiver carregando."</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Ativar registro de rastreamento Bluetooth HCI"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Capturar todos os pacotes Bluetooth HCI em um arquivo (ative o Bluetooth depois de alterar esta configuração)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Desbloqueio de OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Permitir que o bootloader seja desbloqueado"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Permitir desbloqueio de OEM?"</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/arrays.xml b/packages/SettingsLib/res/values-pt-rPT/arrays.xml
index 7edad9b..b580317 100644
--- a/packages/SettingsLib/res/values-pt-rPT/arrays.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Utilizar a verificação HDCP para conteúdo DRM apenas"</item>
     <item msgid="45075631231212732">"Utilizar sempre a verificação HDCP"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (predefinição)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index b0694d1..bb1dcc4 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Ligado automaticamente através de %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Ligado automaticamente através do fornecedor de classificação de rede"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Ligado através de %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> de <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Disponível através de %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Toque para configurar"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Ligado, sem Internet."</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Sem Internet"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"É necessário iniciar sessão"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Ponto de acesso temporariamente cheio"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Ligado através de %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Disponível através de %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Falha na ligação"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"URL do servidor OSU inválido"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Falha ao ligar ao servidor OSU"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Falha ao validar o servidor OSU"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Certificado do servidor OSU inválido"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Aprovisionamento interrompido"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Aprovisionamento não disponível"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"URL do servidor OSU inválido"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Tipo de comando inesperado"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Tipo de mensagem SOAP inesperado"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Falha ao trocar mensagens SOAP"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Falha ao iniciar o redirecionamento do listener"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"O tempo limite foi excedido ao aguardar o redirecionamento"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Nenhuma atividade do OSU encontrada"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Estado da mensagem SOAP inesperado"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Falha ao localizar o PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Falha ao localizar um nó raiz fidedigno para o servidor AAA"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Falha ao localizar um nó raiz fidedigno para o servidor de soluções"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Falha ao localizar um nó raiz fidedigno para o servidor de políticas"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Falha ao obter certificados de raiz fidedignos"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Falha ao localizar um certificado de raiz fidedigno para o servidor AAA"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Falha ao adicionar a configuração PassPoint"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Falha ao localizar um fornecedor de OSU"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"A ligar…"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Ligado"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"A ligar ao servidor OSU…"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Servidor OSU validado"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Ligado ao servidor OSU"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Troca SOAP inicial"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"A aguardar a resposta de redirecionamento…"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Resposta de redirecionamento recebida"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Segunda troca SOAP"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Terceira troca SOAP"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"A obter certificados de raiz fidedignos…"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Aprovisionamento concluído"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Muito lenta"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Lenta"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Manter ativo"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"O ecrã nunca entrará em suspensão durante o carregamento"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Ativar registo de monit. Bluetooth HCI"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Capturar todos os pacotes Bluetooth HCI num ficheiro (ative/desative o Bluetooth após alterar esta definição)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Desbloqueio de OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Permitir o desbloqueio do carregador de arranque"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Pretende permitir o desbloqueio de OEM?"</string>
diff --git a/packages/SettingsLib/res/values-pt/arrays.xml b/packages/SettingsLib/res/values-pt/arrays.xml
index 563698a..b8bb563 100644
--- a/packages/SettingsLib/res/values-pt/arrays.xml
+++ b/packages/SettingsLib/res/values-pt/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Usar a verificação HDCP somente para conteúdo DRM"</item>
     <item msgid="45075631231212732">"Sempre usar a verificação HDCP"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (padrão)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index f1b043b..ef9e61d 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Conectado automaticamente via %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Conectado automaticamente via provedor de avaliação de rede"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Conectado via %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> de <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Disponível via %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Toque para configurar"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Conectada, sem Internet"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Sem Internet"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"É necessário fazer login"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Ponto de acesso temporariamente cheio"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Conectado via %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Disponível via %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Falha na conexão"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"URL do servidor OSU inválido"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Falha na conexão do servidor OSU"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Falha ao validar o servidor OSU"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Certificado do servidor OSU inválido"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Provisionamento cancelado"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Provisionamento indisponível"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"URL do servidor OSU inválido"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Tipo de comando inesperado"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Tipo de mensagem SOAP inesperado"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Falha na troca de mensagens SOAP"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Falha ao iniciar o listener de redirecionamento"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Tempo limite esgotado ao aguardar redirecionamento"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Nenhuma atividade OSU encontrada"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Status de mensagem SOAP inesperado"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Não foi possível encontrar o PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Não foi possível encontrar um nó raiz confiável para o servidor AAA"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Não foi possível encontrar um nó raiz confiável para o servidor de atualizações"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Não foi possível encontrar um nó raiz confiável para o servidor da política"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Falha ao recuperar certificados raiz confiáveis"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Não foi possível encontrar um certificado raiz confiável para o servidor AAA"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Falha ao adicionar a configuração do PassPoint"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Falha ao localizar um provedor OSU"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Conectando"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Conectado"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Conectando-se ao servidor OSU"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Servidor OSU validado"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Conectado ao servidor OSU"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Troca de SOAP inicial"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Aguardando resposta de redirecionamento"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Resposta de redirecionamento recebida"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Segunda troca de SOAP"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Terceira troca de SOAP"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Recuperando certificados raiz confiáveis"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Provisionamento concluído"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Muito lenta"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Lenta"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"Ok"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Permanecer ativo"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"A tela nunca entrará em suspensão enquanto estiver carregando."</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Ativar registro de rastreamento Bluetooth HCI"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Capturar todos os pacotes Bluetooth HCI em um arquivo (ative o Bluetooth depois de alterar esta configuração)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Desbloqueio de OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Permitir que o bootloader seja desbloqueado"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Permitir desbloqueio de OEM?"</string>
diff --git a/packages/SettingsLib/res/values-ro/arrays.xml b/packages/SettingsLib/res/values-ro/arrays.xml
index 7935a2a..c7d0e2f 100644
--- a/packages/SettingsLib/res/values-ro/arrays.xml
+++ b/packages/SettingsLib/res/values-ro/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Utilizează verificarea HDCP numai pentru conținut DRM"</item>
     <item msgid="45075631231212732">"Utilizează întotdeauna verificarea HDCP"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (prestabilit)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index 032fceb..a1298c9 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Conectată automat prin %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Conectată automat prin furnizor de evaluări ale rețelei"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Conectată prin %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> de la <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Disponibilă prin %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Atingeți pentru a configura"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Conectată, fără internet"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Fără conexiune la internet"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Trebuie să vă conectați"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Punctul de acces este temporar plin"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Conectată prin %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Disponibilă prin %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Conectare eșuată"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"URL invalid pentru serverul OSU"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Conectarea la serverul OSU a eșuat"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Validarea serverului OSU a eșuat"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Certificat nevalid pentru serverul OSU"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Asigurarea accesului a fost întreruptă"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Asigurarea accesului nu este disponibilă"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"URL invalid pentru serverul OSU"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Tip de comandă neprevăzut"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Tip de mesaj SOAP neprevăzut"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Schimbul de mesaje SOAP a eșuat"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"„Listenerul” redirecționării nu a pornit"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"A expirat așteptând redirecționarea"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Nu s-a găsit nicio activitate OSU"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Status mesaj SOAP neprevăzut"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Nu a fost găsit PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Certificatul rădăcină de certificare pentru serverul AAA nu a fost găsit"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Nodul rădăcină de certificare pentru serverul de remediere nu a fost găsit"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Nodul rădăcină de certificare pentru serverul de politici nu a fost găsit"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Certificatele rădăcină de certificare nu s-au putut prelua"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Certificatul rădăcină de certificare pentru serverul AAA nu a fost găsit"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Configurarea PassPoint nu a fost adăugată"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Nu a fost găsit niciun furnizor OSU"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Se conectează"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Conectat"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Se conectează la serverul OSU"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Server OSU validat"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Conectat la serverul OSU"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Schimb SOAP inițial"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Se așteaptă răspunsul redirecționării"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Răspunsul redirecționat a fost primit"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Al doilea schimb SOAP"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Al treilea schimb SOAP"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Se preiau certificatele rădăcină de certificare"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Asigurarea accesului finalizată"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Foarte lentă"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Lentă"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"Bine"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Activ permanent"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Ecranul nu va fi inactiv pe durata încărcării"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Activați jurnalul de examinare HCI Bluetooth"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Înregistrați toate pachetele HCI Bluetooth într-un fișier (Comutați Bluettoth după modificarea setării)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Deblocarea OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Permiteți deblocarea bootloaderului"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Permiteți deblocarea OEM?"</string>
diff --git a/packages/SettingsLib/res/values-ru/arrays.xml b/packages/SettingsLib/res/values-ru/arrays.xml
index 7603a0e..bf27fc9 100644
--- a/packages/SettingsLib/res/values-ru/arrays.xml
+++ b/packages/SettingsLib/res/values-ru/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Использовать проверку HDCP только для DRM-контента"</item>
     <item msgid="45075631231212732">"Всегда использовать проверку HDCP"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (по умолчанию)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index a280285..c71d29b 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Автоматически подключено к %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Автоматически подключено через автора рейтинга сетей"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Подключено к %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g>, <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Доступно через %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Нажмите, чтобы настроить"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Подключено, без доступа к Интернету"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Нет подключения к Интернету"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Требуется выполнить вход."</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"К точке доступа подключено слишком много устройств"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Подключено к %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Доступно через %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Ошибка подключения"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Недействительный URL сервера OSU"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Не удалось подключиться к серверу OSU"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Не удалось выполнить проверку сервера OSU"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Недействительный сертификат сервера OSU"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Синхронизация прервана"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Синхронизация недоступна"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Недействительный URL сервера OSU"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Неизвестный тип команды"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Неизвестный тип сообщения SOAP"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Не удалось провести обмен сообщениями SOAP"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Не удалось запустить приемник обратных вызовов"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Превышено время ожидания"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Действий OSU не обнаружено"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Неизвестный статус сообщения SOAP"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Не удалось найти PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Не удалось найти доверенный корневой узел сервера AAA"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Не удалось найти доверенный корневой узел сервера исправлений"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Не удалось найти доверенный корневой узел сервера правил"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Не удалось получить доверенные корневые сертификаты"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Не удалось найти доверенный корневой сертификат для сервера AAA"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Не удалось добавить настройки Passpoint"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Не удалось найти поставщика OSU"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Подключение…"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Подключено"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Подключение к серверу OSU…"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Сервер OSU проверен"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Соединение с сервером OSU установлено"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Первый обмен по SOAP"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Ожидание ответа для перенаправления…"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Ответ получен"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Второй обмен по SOAP"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Третий обмен по SOAP"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Получение доверенных корневых сертификатов…"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Синхронизация завершена"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Очень медленная"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Медленная"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"ОК"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Не выключать экран"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Во время зарядки экран будет всегда включен"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Включить журнал HCI Bluetooth"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Сохранять все пакеты HCI Bluetooth в файле (перезапустите Bluetooth после изменения этой настройки)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Заводская разблокировка"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Разрешить разблокировку загрузчика ОС"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Разрешить заводскую разблокировку?"</string>
diff --git a/packages/SettingsLib/res/values-si/arrays.xml b/packages/SettingsLib/res/values-si/arrays.xml
index 00beb00..6d8e15b 100644
--- a/packages/SettingsLib/res/values-si/arrays.xml
+++ b/packages/SettingsLib/res/values-si/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"DRM අන්තර්ගත සඳහා පමණක් HDCP පරික්ෂාව භාවිතා කරන්න"</item>
     <item msgid="45075631231212732">"සැමවිටම HDCP පිරික්සුම භාවිතා කරන්න"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (පෙරනිමි)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index c143c76..1daffd9 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s හරහා ස්වයංක්‍රියව සම්බන්ධ විය"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"ජාල ශ්‍රේණිගත සපයන්නා හරහා ස්වයංක්‍රියව සම්බන්ධ විය"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s හරහා සම්බන්ධ විය"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g> මඟින් <xliff:g id="SSID">%1$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s හරහා ලබා ගැනීමට හැකිය"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"පිහිටුවීමට තට්ටු කරන්න"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"සම්බන්ධයි, අන්තර්ජාලය නැත"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"අන්තර්ජාලය නැත"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"පිරීම අවශ්‍යයි"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ප්‍රවේශ ලක්ෂ්‍ය තාවකාලිකව පිරී ඇත"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s හරහා සම්බන්ධ විය"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"%1$s හරහා ලබා ගැනීමට හැකිය"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"සබැඳුම අසමත් විය"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"අවලංගු OSU සේවාදායක URL"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU සේවාදායක සබැඳුම අසමත් විය"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU සේවාදායකය වලංගුකරණය අසමත් විය"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"අවලංගු OSU සේවාදායක සහතිකය"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"ප්‍රතිපාදනය රෝධනය කෙරිණි"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"ප්‍රතිපාදනය නොමැත"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"අවලංගු OSU සේවාදායක URL"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"අනපේක්ෂිත විධාන වර්ගය"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"අනපේක්ෂිත SOAP පණිවිඩ වර්ගය"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP පණිවිඩ හුවමාරුව අසමත් විය"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"ප්‍රතියොමු සවන් දෙන්නා ඇරඹීමට අසමත් විය"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"ප්‍රතියොමුව සඳහා රැඳීම් කාලය ඉක්මවා ඇත"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"OSU ක්‍රියාකාරකමක් හමු නොවිණි"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"අනපේක්ෂිත SOAP පණිවිඩ තත්ත්වය"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO සොයා ගැනීමට අසමත් විය"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"AAA සේවාදායකය සඳහා විශ්වාසී මූල නෝඩුව සොයා ගැනීමට අසමත් විය"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"ප්‍රතිව්‍යවධාන සේවාදායකය සඳහා විශ්වාසී මූල නෝඩුව සොයා ගැනීමට අසමත් විය"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"ප්‍රතිපත්ති සේවාදායකය සඳහා විශ්වාසී මූල නෝඩුව සොයා ගැනීමට අසමත් විය"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"විශ්වාසී මූල සහතික ලබා ගැනීමට අසමත් විය"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"AAA සේවාදායකය සඳහා විශ්වාසී මූල සහතිකය සොයා ගැනීමට අසමත් විය"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"PassPoint වින්‍යාසය එක් කිරීමට අසමත් විය"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"OSU සපයන්නෙකු සොයා ගැනීමට අසමත් විය"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"සබැඳෙමින්"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"සම්බන්ධයි"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"OSU සේවාදායකයට සබැඳෙමින්"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU සේවාදායකය වලංගු කෙරිණි"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"OSU සේවාදායකයට සම්බන්ධිතයි"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"ආරම්භක SOAP හුවමාරුව"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"ප්‍රතියොමු ප්‍රතිචාරය සඳහා රැඳෙමින්"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"ප්‍රතියොමු ප්‍රතිචාරය ලැබුණි"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"දෙවන SOAP හුවමාරුව"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"තුන්වන SOAP හුවමාරුව"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"විශ්වාසී මූල සහතික ලබා ගනිමින්"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"ප්‍රතිපාදනය සම්පූර්ණයි"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"ඉතා මන්දගාමී"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"මන්දගාමී"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"හරි"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"අවදියෙන් සිටින්න"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"ආරෝපණය වන අතර තුර තීරය නිද්‍රාවට නොයනු ඇත"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"බ්ලූටූත් HCI ස්නුප් ලොගය සබල කරන්න"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"ගොනුවක ඇති බ්ලූටූත් HCI පැකට්ටු සියල්ලම ග්‍රහණය කර ගන්න (මෙම සැකසීම වෙනස් කිරීමෙන් පසු බ්ලූටූත් ටොගල කරන්න)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM අඟුල ඇරීම"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"බුට්ලොඩරයට අගුළු ඇර තිබීමට ඉඩ දෙන්න"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM අඟුල ඇරීමට ඉඩ දෙන්න?"</string>
diff --git a/packages/SettingsLib/res/values-sk/arrays.xml b/packages/SettingsLib/res/values-sk/arrays.xml
index 8e1dec0..dfa6994 100644
--- a/packages/SettingsLib/res/values-sk/arrays.xml
+++ b/packages/SettingsLib/res/values-sk/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Použiť kontrolu HDCP len pre obsah DRM"</item>
     <item msgid="45075631231212732">"Vždy používať kontrolu HDCP"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (predvolené)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index b41d5d3..e6047bb 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Automaticky pripojené prostredníctvom %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automaticky pripojené prostredníctvom poskytovateľa hodnotenia siete"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Pripojené prostredníctvom %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> – <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"K dispozícii prostredníctvom %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Klepnutím nastavíte"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Pripojené, žiadny internet"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Žiadny internet"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Vyžaduje sa prihlásenie"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Prístupový bod je dočasne plný"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Pripojené prostredníctvom operátora %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"K dispozícii prostredníctvom operátora %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Nepodarilo sa pripojiť"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Neplatná webová adresa servera OSU"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Pripojenie servera OSU zlyhalo"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Server OSU sa nepodarilo overiť"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Neplatný certifikát servera OSU"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Údržba bolo prerušená"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Údržba nie je k dispozícii"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Neplatná webová adresa servera OSU"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Neočakávaný typ príkazu"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Neočakávaný typ správy SOAP"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Výmena správ SOAP sa nepodarila"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Prijímač presmerovania sa nespustil"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Časový limit čakania na presmerovanie vypršal"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Nenašla sa žiadna aktivita OSU"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Neočakávaný stav správy SOAP"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Objekt PPS-MO sa nenašiel"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Nepodarilo sa nájsť dôveryhodný koreňový uzol pre server AAA"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Nepodarilo sa nájsť dôveryhodný koreňový uzol pre server opráv"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Nepodarilo sa nájsť dôveryhodný koreňový uzol pre server pravidiel"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Nepodarilo sa načítať dôveryhodné koreňové certifikáty"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Nepodarilo sa nájsť dôveryhodný koreňový certifikát pre server AAA"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Konfiguráciu PassPoint sa nepodarilo pridať"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Poskytovateľ OSU sa nenašiel"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Pripája sa"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Pripojené"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Pripája sa k serveru OSU"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Server OSU bol overený"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Pripojené k serveru OSU"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Počiatočná výmena SOAP"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Čaká sa na odpoveď presmerovania"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Bola prijatá odpoveď presmerovania"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Druhá výmena SOAP"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Tretia výmena SOAP"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Načítavajú sa dôveryhodné koreňové certifikáty"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Poskytovanie bolo dokončené"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Veľmi nízka"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Nízka"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Nevypínať obrazovku"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Obrazovka sa pri nabíjaní neprepne do režimu spánku"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Povoliť denník Bluetooth HCI"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Zachytávať všetky pakety Bluetooth HCI do súboru (po zmene tohto nastavenia prepnúť Bluetooth)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Odblokovať OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Povoliť odblokovanie ponuky bootloader"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Povoliť odblokovanie OEM?"</string>
diff --git a/packages/SettingsLib/res/values-sl/arrays.xml b/packages/SettingsLib/res/values-sl/arrays.xml
index 11f99c5..fdadbff 100644
--- a/packages/SettingsLib/res/values-sl/arrays.xml
+++ b/packages/SettingsLib/res/values-sl/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Preverjanje HDCP uporabi samo za vsebino DRM"</item>
     <item msgid="45075631231212732">"Vedno uporabi preverjanje HDCP"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (privzeto)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index 298acb9..3099f12 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Samodejno vzpostavljena povezava prek: %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Samodejno vzpostavljena povezava prek ponudnika ocenjevanja omrežij"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Vzpostavljena povezava prek: %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> zagotavlja <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Na voljo prek: %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Dotaknite se za nastavitev"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Vzpostavljena povezava, brez interneta"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Brez internetne povezave"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Zahtevana je prijava"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Dostopna točka je trenutno zasedena"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Vzpostavljena povezava prek: %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Na voljo prek: %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Vzpostavitev povezave ni uspela"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Neveljaven URL strežnika OSU"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Vzpostavitev povezave s strežnikom OSU ni uspela"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Preverjanje veljavnosti strežnika OSU ni uspelo"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Neveljavno potrdilo strežnika OSU"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Omogočanje uporabe je preklicano"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Omogočanje uporabe ni na voljo"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Neveljaven URL strežnika OSU"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Nepričakovana vrsta ukaza"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Nepričakovana vrsta sporočila SOAP"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Izmenjava sporočila SOAP ni uspela"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Zagon prisluškovalca preusmeritev ni uspel"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Časovna omejitev čakanja na preusmeritev je potekla"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Najdena ni bila nobena aktivnost OSU"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Nepričakovano stanje sporočila SOAP"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO ni bilo mogoče najti"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Zaupanja vrednega korenskega vozlišča za strežnik AAA ni bilo mogoče najti"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Zaupanja vrednega korenskega vozlišča za strežnik za odpravljanje težav ni bilo mogoče najti"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Zaupanja vrednega korenskega vozlišča za strežnik pravilnikov ni bilo mogoče najti"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Zaupanja vrednih korenskih potrdil ni bilo mogoče pridobiti"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Zaupanja vrednega korenskega potrdila za strežnik AAA ni bilo mogoče najti"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Konfiguracije PassPoint ni bilo mogoče dodati"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Ponudnika OSU ni bilo mogoče najti"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Vzpostavljanje povezave"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Povezava je vzpostavljena"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Vzpostavljanje povezave s strežnikom OSU"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Strežnik OSU je preverjen"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Povezava s strežnikom OSU je vzpostavljena"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Začetna izmenjava SOAP"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Čakanje na odgovor za preusmeritev"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Prejet je odgovor za preusmeritev"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Druga izmenjava SOAP"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Tretja izmenjava SOAP"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Pridobivanje zaupanja vrednih korenskih potrdil"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Omogočanje uporabe je končano"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Zelo počasna"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Počasna"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"V redu"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Brez zaklepanja"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Med polnjenjem se zaslon ne bo nikoli zaklenil"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Omogoči zajem dnevnika Bluetooth HCI"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Zajemi vse pakete Bluetooth HCI v datoteko (preklopi Bluetooth po spremembi te nastavitve)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Odklepanje OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Dovoli odklepanje zagonskega nalagalnika"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Želite omogočiti odklepanje OEM?"</string>
diff --git a/packages/SettingsLib/res/values-sq/arrays.xml b/packages/SettingsLib/res/values-sq/arrays.xml
index 70786e7..3128eb7 100644
--- a/packages/SettingsLib/res/values-sq/arrays.xml
+++ b/packages/SettingsLib/res/values-sq/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Përdor kontrollin e HDCP-së vetëm për përmbajtjet DRM"</item>
     <item msgid="45075631231212732">"Përdor gjithmonë kontrollin e HDCP-së"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (I parazgjedhur)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index 569b4d9..6716cfc 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Lidhur automatikisht përmes %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Lidhur automatikisht nëpërmjet ofruesit të vlerësimit të rrjetit"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"E lidhur përmes %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> nga <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"E mundshme përmes %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Trokit për ta konfiguruar"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"U lidh, por nuk ka internet"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Nuk ka internet"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Kërkohet identifikimi"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Pika e qasjes është përkohësisht plot"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"E lidhur përmes %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"E disponueshme përmes %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Lidhja dështoi"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"URL e pavlefshme e serverit të OSU-së"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Lidhja e serverit të OSU-së dështoi"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Verifikimi i serverit të OSU-së dështoi"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Certifikatë e pavlefshme e serverit të OSU-së"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Përgatitja u ndërpre"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Përgatitja nuk ofrohet"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"URL e pavlefshme e serverit të OSU-së"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Lloj i papritur komande"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Lloji i papritur i mesazhit SOAP"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Mesazhi i shkëmbimit të SOAP-it dështoi"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Dështoi nisja e dëgjuesit të ridrejtimit"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Pritja për ridrejtim skadoi"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Nuk u gjet aktivitet i OSU-së"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Status i papritur i mesazhit të SOAP-it"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Dështoi gjetja e PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Dështoi gjetja e nyjës rrënjë të besuar për serverin e AAA-së"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Dështoi gjetja e nyjës rrënjë të besuar për serverin e zgjidhjes"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Dështoi gjetja e nyjës rrënjë të besuar për serverin e politikës"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Dështoi marrja e certifikatave rrënjë të besuara"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Dështoi gjetja e certifikatës rrënjë të besuar për serverin e AAA-së"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Dështoi shtimi i konfigurimit të PassPoint"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Dështoi gjetja e një ofruesi të OSU-së"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Po lidhet"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Lidhur"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Po lidhe me serverin e OSU-së"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Serveri i OSU-së u verifikua"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Lidhur me serverin e OSU-së"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Shkëmbimi fillestar i SOAP-it"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Në pritje të përgjigjes së ridrejtimit"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"U mor përgjigje ridrejtimi"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Shkëmbimi i dytë i SOAP-it"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Shkëmbimi i tretë i SOAP-it"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Po merr certifikatat rrënjë të besuara"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Përgatitja përfundoi"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Shumë e ulët"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"E ngadaltë"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"Në rregull"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Qëndro zgjuar"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Ekrani nuk do të kalojë asnjëherë në gjendje gjumi gjatë ngarkimit"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Aktivizo regjistrin testues të paketave HCI të Bluetooth-it"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Kap të gjitha paketat HCI të Bluetooth-it në një skedar (ndryshoje Bluetooth-in pas ndryshimit të këtij cilësimi)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Shkyçja e OEM-së"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Lejo shkyçjen e ngarkimit të sistemit"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Të lejohet shkyçja e OEM-së?"</string>
diff --git a/packages/SettingsLib/res/values-sr/arrays.xml b/packages/SettingsLib/res/values-sr/arrays.xml
index 190f502..b735b47 100644
--- a/packages/SettingsLib/res/values-sr/arrays.xml
+++ b/packages/SettingsLib/res/values-sr/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Користи HDCP проверу само за DRM садржај"</item>
     <item msgid="45075631231212732">"Увек користи HDCP проверу"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (подразумевано)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index bf5e311..0285605 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Аутоматски повезано преко %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Аутоматски повезано преко добављача оцене мреже"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Веза је успостављена преко приступне тачке %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> – <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Доступна је преко приступне тачке %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Додирните да бисте подесили"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Веза је успостављена, нема интернета"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Нема интернета"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Треба да се пријавите"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Приступна тачка је привремено заузета"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Повезано преко %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Доступно преко %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Повезивање није успело"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Неважећи URL OSU сервера"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Повезивање са OSU сервером није успело"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Потврда OSU сервера није успела"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Неважећи сертификат OSU сервера"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Додела је отказана"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Додела није доступна"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Неважећи URL OSU сервера"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Неочекивани тип команде"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Неочекивани тип SOAP поруке"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Размена SOAP порука није успела"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Покретање обрађивача преусмеравања није успело"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Време чекања преусмеравања је истекло"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Није пронађена ниједна OSU активност"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Неочекивани статус SOAP поруке"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO није пронађен"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Поуздани чвор основног нивоа за AAA сервер није пронађен"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Поуздани чвор основног нивоа за сервер за отклањање пропуста није пронађен"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Поуздани чвор основног нивоа за сервер за смернице није пронађен"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Преузимање поузданих сертификата основног нивоа није успело"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Поуздани сертификат основног нивоа за сервер AAA није пронађен"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Додавање PassPoint конфигурације није успело"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"OSU добављач није пронађен"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Повезује се"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Повезан"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Повезујете се са OSU сервером"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Потврђен је OSU сервер"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Веза са OSU сервером је успостављена"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Прва размена SOAP-а"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Чека се одговор о преусмеравању"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Примљен је одговор о преусмеравању"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Друга размена SOAP-а"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Трећа размена SOAP-а"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Преузимају се поуздани сертификати основног нивоа"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Додела приступа је завршена"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Веома спора"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Спора"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"Потврди"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Не закључавај"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Екран неће бити у режиму спавања током пуњења"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Омогући snoop евиденцију за Bluetooth HCI"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Сними све Bluetooth HCI пакете у датотеци (Укључите/искључите Bluetooth када промените ово подешавање)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Откључавање OEM-a"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Дозволи откључавање функције за покретање"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Желите ли да дозволите откључавање произвођача оригиналне опреме (OEM)?"</string>
diff --git a/packages/SettingsLib/res/values-sv/arrays.xml b/packages/SettingsLib/res/values-sv/arrays.xml
index b5464a2..fc4d17f 100644
--- a/packages/SettingsLib/res/values-sv/arrays.xml
+++ b/packages/SettingsLib/res/values-sv/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Använd bara HDCP-kontroll för DRM-innehåll"</item>
     <item msgid="45075631231212732">"Använd alltid HDCP-kontroll"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (standard)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index 6e004df..fd7bb0b 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatiskt ansluten via %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatiskt ansluten via leverantör av nätverksbetyg"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Anslutet via %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> av <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Tillgängligt via %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Tryck för att konfigurera"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Ansluten, inget internet"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Inget internet"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Inloggning krävs"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Åtkomstpunkten har inga platser över för tillfället"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Anslutet via %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Tillgängligt via %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Anslutningen misslyckades"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Ogiltig webbadress för OSU-server"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Det gick inte att ansluta till OSU-servern"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU-servervalideringen misslyckades"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Ogiltigt certifikat för OSU-server"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Utfärdandet avbröts"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Utfärdande ej tillgängligt"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Ogiltig webbadress för OSU-server"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Oväntad kommandotyp"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Oväntad meddelandetyp för SOAP"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Utväxlingen av SOAP-meddelanden misslyckades"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Det gick inte att starta omdirigeringslyssnaren"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Väntetiden för omdirigering överskreds"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Ingen OSU-aktivitet hittades"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Oväntad status för SOAP-meddelande"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Inget PPS-MO hittades"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Det gick inte att hitta någon betrodd rotnod för AAA-servern"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Det gick inte att hitta någon betrodd rotnod för åtgärdsservern"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Det gick inte att hitta någon betrodd rotnod för policyservern"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Det gick inte att hämta betrodda rotcertifikat"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Det gick inte att hitta någon betrodd rotnod för AAA-servern"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Det gick inte att lägga till PassPoint-konfigurationen"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Ingen OSU-leverantör hittades"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Ansluter"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Ansluten"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Ansluter till OSU-server"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU-servern har validerats"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Ansluten till OSU-server"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Första SOAP-utväxlingen"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Väntar på omdirigeringssvar"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Omdirigeringssvar mottaget"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Andra SOAP-utväxlingen"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Tredje SOAP-utväxlingen"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Hämtar betrodda rotcertifikat"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Utfärdandet har slutförts"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Mycket långsam"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Långsam"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"Okej"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Håll aktiverad"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Skärmen vilar aldrig när laddning pågår"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Aktivera HCI snoop-logg för Bluetooth"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Samla alla HCI-paket för Bluetooth i en fil (aktivera och inaktivera Bluetooth när du har ändrat den här inställningen)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM-upplåsning"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Tillåt att bootloadern låses upp"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Vill du tillåta OEM-upplåsning?"</string>
diff --git a/packages/SettingsLib/res/values-sw/arrays.xml b/packages/SettingsLib/res/values-sw/arrays.xml
index fdf9fd1..e7f6dd6 100644
--- a/packages/SettingsLib/res/values-sw/arrays.xml
+++ b/packages/SettingsLib/res/values-sw/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Tumia ukaguaji wa HDCP kwa maudhui ya DRM pekee"</item>
     <item msgid="45075631231212732">"Kila wakati tumia ukakuaji wa HDCP"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (Chaguomsingi)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index bf03476..6d6b571 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Imeunganishwa kiotomatiki kupitia %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Imeunganishwa kiotomatiki kupitia mtoa huduma wa ukadiriaji wa mtandao"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Imeunganishwa kupitia %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> kutoka <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Inapatikana kupitia %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Gusa ili uweke mipangilio"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Imeunganishwa, hakuna intaneti"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Hakuna intaneti"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Unahitaji kuingia katika akaunti"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Lango la mtandao lina shughuli nyingi kwa sasa"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Imeunganishwa kupitia %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Inapatikana kupitia %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Imeshindwa kuunganisha"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"URL ya seva ya OSU si sahihi"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Imeshindwa kuunganisha seva ya OSU"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Imeshindwa kuthibitisha seva ya OSU"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Cheti cha seva ya OSU si sahihi"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Imeghairi mchakato wa kupanga"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Kipengele cha kupanga hakipatikani"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"URL ya seva ya OSU si sahihi"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Aina ya amri isiyotarajiwa"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Aina ya ujumbe wa SOAP usiotarajiwa"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Imeshindwa kubadilisha ujumbe wa SOAP"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Imeshindwa kuanzisha kisikilizaji cha kuelekeza kwingine"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Muda umeisha ikisubiri kuelekeza kwingine"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Hakuna shughuli ya OSU iliyopatikana"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Hali isiyotarajiwa ya ujumbe wa SOAP"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Imeshindwa kupata PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Imeshindwa kupata cheti msingi cha seva ya AAA"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Imeshindwa kupata njia ya chanzo kinachoaminika cha seva ya utatuzi"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Imeshindwa kupata njia ya chanzo kinachoaminika cha seva ya sera"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Imeshindwa kuleta vyeti vya msingi vinavyoaminika"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Imeshindwa kupata cheti cha msingi kinachoaminika cha seva ya AAA"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Imeshindwa kuongeza mipangilio ya PassPoint"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Imeshindwa kupata mtoa huduma wa OSU"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Inaunganisha"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Imeunganisha"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Inaunganisha kwenye seva ya OSU"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Imethibitisha seva ya OSU"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Imeunganishwa kwenye seva ya OSU"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Mabadiliko ya kwanza ya SOAP"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Inasubiri jibu la kuelekeza kwingine"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Imepokea jibu la kuelekeza kwingine"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Kubadilisha SOAP mara ya pili"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Kubadilisha SOAP mara ya tatu"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Inaleta vyeti vya msingi vinavyoaminika"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Imekamilisha kupanga"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Polepole Sana"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Polepole"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"Sawa"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Weka skrini ikiwa imewashwa"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Skrini haitawahi kuzima wakati unachaji"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Washa kumbukumbu ya Bluetooth HCI Snoop"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Nasa vifurushi vyote vya Bluetooth HCI katika faili (Washa Bluetooth baada ya kuweka mipangilio hii)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Ufunguaji wa OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Ruhusu bootloader ifunguliwe"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Je, ungependa kuruhusu ufunguaji wa OEM?"</string>
diff --git a/packages/SettingsLib/res/values-ta/arrays.xml b/packages/SettingsLib/res/values-ta/arrays.xml
index 54adf82..02c1623 100644
--- a/packages/SettingsLib/res/values-ta/arrays.xml
+++ b/packages/SettingsLib/res/values-ta/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"DRM உள்ளடக்கத்திற்கு மட்டும் HDCP சோதனையைப் பயன்படுத்து"</item>
     <item msgid="45075631231212732">"HDCP சரிபார்ப்பை எப்போதும் பயன்படுத்து"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (இயல்பு)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index 58e5967..f83b1a7 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s மூலம் தானாக இணைக்கப்பட்டது"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"நெட்வொர்க் மதிப்பீடு வழங்குநரால் தானாக இணைக்கப்பட்டது"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s வழியாக இணைக்கப்பட்டது"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g> இன் <xliff:g id="SSID">%1$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s வழியாகக் கிடைக்கிறது"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"அமைப்பதற்குத் தட்ட வேண்டும்"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"இணைக்கப்பட்டுள்ளது, ஆனால் இண்டர்நெட் இல்லை"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"இணைய இணைப்பு இல்லை"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"உள்நுழைய வேண்டும்"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"தற்காலிகமாக அணுகல் புள்ளி நிரம்பியுள்ளது"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s வழியாக இணைக்கப்பட்டது"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"%1$s வழியாகக் கிடைக்கிறது"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"இணைக்க இயலவில்லை"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"OSU சேவையகத்தின் URL தவறானது"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU சேவையகத்துடன் இணைக்க இயலவில்லை"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU சேவையகத்தைச் சரிபார்க்க இயலவில்லை"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"OSU சேவையகத்தின் சான்றிதழ் தவறானது"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"புரொவிஷனிங் ரத்துசெய்யப்பட்டது"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"புரொவிஷனிங் இல்லை"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"OSU சேவையகத்தின் URL தவறானது"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"எதிர்பாராத கட்டளை வகை"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"எதிர்பாராத SOAP மெசேஜ் வகை"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP மெசேஜ் பரிமாற்றம் தோல்வியடைந்தது"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"திசைதிருப்புதலைக் கேட்கும் அம்சம் தொடங்கவில்லை"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"திசைதிருப்புதலுக்கான காத்திருப்பு நேரம் முடிந்துவிட்டது"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"OSU செயல்பாடு காணப்படவில்லை"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"எதிர்பாராத SOAP மெசேஜ் நிலை"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MOவைக் கண்டறிய இயலவில்லை"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"AAA சேவையகத்தின் நம்பகமான முதன்மை நோடைக் கண்டறிய இயலவில்லை"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"சிக்கல் தீர்க்கும் சேவையகத்தின் நம்பகமான முதன்மை நோடைக் கண்டறிய இயலவில்லை"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"கொள்கைச் சேவையகத்தின் நம்பகமான முதன்மை நோடைக் கண்டறிய இயலவில்லை"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"நம்பகமான முதன்மைச் சான்றிதழ்களை மீட்டெடுக்க இயலவில்லை"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"AAA சேவையகத்தின் நம்பகமான முதன்மைச் சான்றிதழைக் கண்டறிய இயலவில்லை"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"PassPoint உள்ளமைவைச் சேர்க்க இயலவில்லை"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"OSU வழங்குநரைக் கண்டறிய இயலவில்லை"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"இணைக்கிறது"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"இணைக்கப்பட்டது"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"OSU சேவையகத்துடன் இணைக்கிறது"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU சேவையகம் சரிபார்க்கப்பட்டது"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"OSU சேவையகத்துடன் இணைக்கப்பட்டது"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"முதல் SOAP பரிமாற்றம்"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"திசைதிருப்புதலுக்கான பதிலுக்குக் காத்திருக்கிறது"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"திசைதிருப்புதலுக்கான பதில் பெறப்பட்டது"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"இரண்டாம் SOAP பரிமாற்றம்"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"மூன்றாம் SOAP பரிமாற்றம்"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"நம்பகமான முதன்மைச் சான்றிதழ்களை மீட்டெடுக்கிறது"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"புரொவிஷனிங் நிறைவடைந்தது"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"மிகவும் வேகம் குறைவானது"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"வேகம் குறைவு"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"சரி"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"செயலில் வைத்திரு"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"சார்ஜ் ஏறும்போது திரை எப்போதும் உறக்கநிலைக்குச் செல்லாது"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"புளூடூத் HCI ஸ்னுப் பதிவை இயக்கு"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"கோப்பில் உள்ள புளூடூத் HCI பாக்கெட்டுகள் அனைத்தையும் படமெடுக்கும் (இந்த அமைப்பை மாற்றிய பிறகு, புளூடூத் நிலைமாற்றப்படும்)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM திறத்தல்"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"பூட்லோடரைத் திறக்க அனுமதி"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM திறத்தலை அனுமதிக்கவா?"</string>
diff --git a/packages/SettingsLib/res/values-te/arrays.xml b/packages/SettingsLib/res/values-te/arrays.xml
index 5d79065..6d5a16b 100644
--- a/packages/SettingsLib/res/values-te/arrays.xml
+++ b/packages/SettingsLib/res/values-te/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"DRM కంటెంట్‌కు మాత్రమే HDCP తనిఖీని ఉపయోగించండి"</item>
     <item msgid="45075631231212732">"ఎప్పటికీ HDCP తనిఖీని ఉపయోగించు"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (డిఫాల్ట్)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index 9d1b23e..e4e0e41 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s ద్వారా స్వయంచాలకంగా కనెక్ట్ చేయబడింది"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"నెట్‌వర్క్ రేటింగ్ ప్రదాత ద్వారా స్వయంచాలకంగా కనెక్ట్ చేయబడింది"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s ద్వారా కనెక్ట్ చేయబడింది"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g> ద్వారా <xliff:g id="SSID">%1$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s ద్వారా అందుబాటులో ఉంది"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"సెటప్ చేయడానికి నొక్కండి"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"కనెక్ట్ చేయబడింది, ఇంటర్నెట్ లేదు"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"ఇంటర్నెట్ లేదు"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"సైన్ ఇన్ చేయాలి"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"యాక్సెస్ పాయింట్ తాత్కాలికంగా నిండుకుంది"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s ద్వారా కనెక్ట్ చేయబడింది"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"%1$s ద్వారా అందుబాటులో ఉంది"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"కనెక్షన్ విఫలమైంది"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"చెల్లని OSU సర్వర్ URL"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU సర్వర్ కనెక్షన్ విఫలమైంది"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU సర్వర్ ప్రామాణీకరణ విఫలమైంది"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"చెల్లని OSU సర్వర్ సర్టిఫికెట్"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"కేటాయింపు రద్దు చేయబడింది"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"కేటాయింపు అందుబాటులో లేదు"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"చెల్లని OSU సర్వర్ URL"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"ఊహించని ఆదేశ రకం"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"ఊహించని SOAP సందేశ రకం"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP సందేశ మార్పిడి విఫలమైంది"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"మళ్లింపు పరిశీలన ప్రారంభమవడం విఫలమైంది"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"మళ్లింపు కోసం వేచి ఉండటంలో సమయం ముగిసింది"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"ఏ OSU కార్యకలాపం కనుగొనబడలేదు"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"ఊహించని SOAP సందేశ స్థితి"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO కనుగొనడం విఫలమైంది."</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"AAA సర్వర్ కోసం మూల విశ్వసనీయత కనుగొనడంలో విఫలమైంది."</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"నివారణోపాయం సర్వర్ విశ్వసనీయత మూల నోడ్‌ను కనుగొనడం విఫలమైంది"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"విధాన సర్వర్ కోసం మూల విశ్వసనీయత కనుగొనడంలో విఫలమైంది."</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"విశ్వసనీయ రూట్ సర్టిఫికెట్‌లు తిరిగి పొందడం విఫలమైంది."</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"AAA సర్వర్ కోసం రూట్ సర్టిఫికెట్ విశ్వసనీయత కనుగొనడం విఫలమైంది."</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"కాన్ఫిగరేషన్ పాయింట్ జోడించడం విఫలమైంది."</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"ఒక OSU ప్రొవైడర్‌ని కనుగొనడం విఫలమైంది"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"కనెక్ట్ చేయబడుతోంది"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"కనెక్ట్ చేయబడింది"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"OSU సర్వర్‌కి కనెక్ట్ చేయబడుతోంది…"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU సర్వర్ ప్రామాణీకరించబడింది"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"OSU సర్వర్‌కి కనెక్ట్ చేయబడింది"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"ప్రారంభ SOAP మార్పిడి"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"మళ్లింపు ప్రతిస్పందన కోసం వేచి ఉంది"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"మళ్లింపు ప్రతిస్పందన స్వీకరించబడింది"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"రెండవ SOAP మార్పిడి"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"మూడో SOAP మార్పిడి"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"విశ్వసనీయ రూట్ సర్టిఫికెట్‌లను తిరిగి పొందుతోంది"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"కేటాయింపు పూర్తయింది"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"చాలా నెమ్మది"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"నెమ్మది"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"సరే"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"యాక్టివ్‌గా ఉంచు"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"ఛార్జ్ చేస్తున్నప్పుడు స్క్రీన్ ఎప్పటికీ నిద్రావస్థలోకి వెళ్లదు"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"బ్లూటూత్ HCI రహస్య లాగ్‌ను ప్రారంభించు"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"ఫైల్‌లో అన్ని బ్లూటూత్ HCI ప్యాకెట్‌లను క్యాప్చర్ చేస్తుంది (ఈ సెట్టింగ్‌ని మార్చిన తర్వాత బ్లూటూత్‌ని టోగుల్ చేయండి)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM అన్‌లాకింగ్"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"బూట్‌లోడర్ అన్‌లాక్ కావడానికి అనుమతించు"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM అన్‌లాకింగ్‌ను అనుమతించాలా?"</string>
diff --git a/packages/SettingsLib/res/values-th/arrays.xml b/packages/SettingsLib/res/values-th/arrays.xml
index a5b3d2c..2b65080 100644
--- a/packages/SettingsLib/res/values-th/arrays.xml
+++ b/packages/SettingsLib/res/values-th/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"ใช้การตรวจสอบ HDCP สำหรับเนื้อหา DRM เท่านั้น"</item>
     <item msgid="45075631231212732">"ใช้การตรวจสอบ HDCP เสมอ"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (ค่าเริ่มต้น)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index ddd9aae..b7a7019 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"เชื่อมต่ออัตโนมัติผ่าน %1$s แล้ว"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"เชื่อมต่ออัตโนมัติผ่านผู้ให้บริการการจัดอันดับเครือข่าย"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"เชื่อมต่อผ่าน %1$s แล้ว"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> โดย <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"พร้อมใช้งานผ่านทาง %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"แตะเพื่อตั้งค่า"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"เชื่อมต่อแล้ว ไม่พบอินเทอร์เน็ต"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"ไม่มีอินเทอร์เน็ต"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"ต้องลงชื่อเข้าใช้"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"จุดเข้าใช้งานเต็มชั่วคราว"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"เชื่อมต่อผ่าน %1$s แล้ว"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"พร้อมใช้งานผ่านทาง %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"การเชื่อมต่อล้มเหลว"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"URL ของเซิร์ฟเวอร์ OSU ไม่ถูกต้อง"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"การเชื่อมต่อเซิร์ฟเวอร์ OSU ล้มเหลว"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"การตรวจสอบเซิร์ฟเวอร์ OSU ล้มเหลว"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"ใบรับรองเซิร์ฟเวอร์ OSU ไม่ถูกต้อง"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"ล้มเลิกการจัดสรรแล้ว"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"การจัดสรรไม่พร้อมใช้งาน"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"URL ของเซิร์ฟเวอร์ OSU ไม่ถูกต้อง"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"ประเภทคำสั่งที่ไม่คาดคิด"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"ประเภทข้อความ SOAP ที่ไม่คาดคิด"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"การแลกเปลี่ยนข้อความ SOAP ล้มเหลว"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"เริ่มการเปลี่ยนเส้นทางผู้ฟังไม่สำเร็จ"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"หมดเวลาการอการเปลี่ยนเส้นทางแล้ว"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"ไม่พบกิจกรรม OSU"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"สถานะข้อความ SOAP ที่ไม่คาดคิด"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"ค้นหา PPS-MO ไม่สำเร็จ"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"ค้นหาโหนดรากที่เชื่อถือได้สำหรับเซิร์ฟเวอร์ AAA ไม่สำเร็จ"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"ค้นหาโหนดระดับรากที่เชื่อถือได้สำหรับเซิร์ฟเวอร์การแก้ไขไม่สำเร็จ"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"ค้นหาโหนดระดับรากที่เชื่อถือได้สำหรับเซิร์ฟเวอร์นโยบายไม่สำเร็จ"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"เรียกดูใบรับรองรูทที่เชื่อถือได้ไม่สำเร็จ"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"ค้นหาใบรับรองรูทที่เชื่อถือได้สำหรับเซิร์ฟเวอร์ AAA ไม่สำเร็จ"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"เพิ่มการกำหนดค่า PassPoint ไม่สำเร็จ"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"ค้นหาผู้ให้บริการ OSU ไม่สำเร็จ"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"กำลังเชื่อมต่อ"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"เชื่อมต่อแล้ว"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"กำลังเชื่อมต่อกับเซิร์ฟเวอร์ OSU"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"ตรวจสอบเซิร์ฟเวอร์ OSU แล้ว"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"เชื่อมต่อกับเซิร์ฟเวอร์ OSU แล้ว"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"การแลกเปลี่ยน SOAP เริ่มต้น"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"กำลังรอการตอบสนองการเปลี่ยนเส้นทาง"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"ได้รับการตอบสนองการเปลี่ยนเส้นทางแล้ว"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"การแลกเปลี่ยน SOAP ที่สอง"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"การแลกเปลี่ยน SOAP ที่สาม"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"กำลังเรียกดูใบรับรองรูทที่เชื่อถือได้"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"การจัดสรรเสร็จสมบูรณ์"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"ช้ามาก"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"ช้า"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"ตกลง"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"เปิดหน้าจอค้าง"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"หน้าจอจะไม่เข้าสู่โหมดสลีปขณะชาร์จ"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"เปิดใช้งานบันทึก HCI Snoop ของบลูทูธ"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"บันทึกแพ็กเก็ต HCI ของบลูทูธทั้งหมดลงในไฟล์ (ปิด-เปิดบลูทูธหลังจากเปลี่ยนการตั้งค่านี้)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"การปลดล็อก OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"อนุญาตให้ปลดล็อกตัวโหลดการเปิดเครื่อง"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"อนุญาตการปลดล็อก OEM ไหม"</string>
diff --git a/packages/SettingsLib/res/values-tl/arrays.xml b/packages/SettingsLib/res/values-tl/arrays.xml
index bfe358b..8e3aaf7 100644
--- a/packages/SettingsLib/res/values-tl/arrays.xml
+++ b/packages/SettingsLib/res/values-tl/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Gamitin lang ang pagsusuring HDCP para sa nilalamang DRM"</item>
     <item msgid="45075631231212732">"Palaging gumamit ng pagsusuring HDCP"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (Default)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index 6445480..4f92302 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Awtomatikong nakakonekta sa pamamagitan ng %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Awtomatikong nakakonekta sa pamamagitan ng provider ng rating ng network"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Nakakonekta sa pamamagitan ng %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> ni <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Available sa pamamagitan ng %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Mag-tap para i-set up"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Nakakonekta, walang internet"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Walang internet"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Kinakailangang mag-sign in"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Pansamantalang puno ang access point"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Nakakonekta sa pamamagitan ng %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Available sa pamamagitan ng %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Hindi nakakonekta"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Invalid na URL ng OSU server"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Hindi nakakonekta sa OSU server"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Hindi na-validate ang OSU server"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Invalid na certificate ng OSU server"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Na-abort ang provisioning"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Hindi available ang provisioning"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Invalid na URL ng OSU server"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Hindi inaasahang uri ng command"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Hindi inaasahang uri ng mensahe ng SOAP"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Hindi nakapagpalitan ng mensahe ng SOAP"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Hindi nakapagsimula ang listener ng pag-redirect"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Nag-time out sa paghihintay ng pag-redirect"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Walang nakitang aktibidad ng OSU"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Hindi inaasahang status ng mensahe ng SOAP"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Hindi nakakita ng PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Hindi nakakita ng trust root node para sa AAA server"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Hindi nakita ang trust root node para sa server ng pagremedyo"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Hindi nakita ang trust root node para sa server ng patakaran"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Hindi nakuha ang mga trust root certificate"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Hindi nakita ang trust root certificate para sa AAA server"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Hindi naidagdag ang configuration ng PassPoint"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Hindi nakakita ng OSU provider"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Kumokonekta"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Nakakonekta"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Kumokonekta sa OSU server"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Na-validate na ang OSU server"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Nakakonekta sa OSU server"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Paunang pakikipagpalitan ng SOAP"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Naghihintay ng tugon sa pag-redirect"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Nakatanggap ng tugon sa pag-redirect"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Pangalawang pakikipagpalitan ng SOAP"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Pangatlong pakikipagpalitan ng SOAP"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Kinukuha ang mga trust root certificate"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Tapos na ang provisioning"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Napakabagal"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Mabagal"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Manatiling gumagana"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Hindi kailanman hihinto ang screen kapag kinakargahan"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"I-enable ang Bluetooth HCI snoop log"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"I-capture ang lahat ng Bluetooth HCI packet sa isang file (I-toggle ang Bluetooth pagkatapos baguhin ang setting na ito)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Pag-a-unlock ng OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Payagan na ma-unlock ang bootloader"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Payagan ang pag-a-unlock ng OEM?"</string>
diff --git a/packages/SettingsLib/res/values-tr/arrays.xml b/packages/SettingsLib/res/values-tr/arrays.xml
index 141b4e2..1a0ab57 100644
--- a/packages/SettingsLib/res/values-tr/arrays.xml
+++ b/packages/SettingsLib/res/values-tr/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"HDCP denetimini yalnızca DRM içeriği için kullan"</item>
     <item msgid="45075631231212732">"HDCP denetimini her zaman kullan"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (Varsayılan)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index c3a3ff2..67aee02 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s üzerinden otomatik olarak bağlı"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Ağ derecelendirme sağlayıcı aracılığıyla otomatik olarak bağlandı"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s üzerinden bağlı"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g>, <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s üzerinden kullanılabilir"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Ayarlamak için dokunun"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Bağlı, internet yok"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"İnternet yok"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Oturum açılması gerekiyor"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Erişim noktası geçici olarak dolu"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s üzerinden bağlı"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"%1$s üzerinden kullanılabilir"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Bağlantı başarısız oldu"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"OSU sunucu URL\'si geçersiz"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU sunucusu ile bağlantı kurulamadı"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU sunucusu doğrulanamadı"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"OSU sunucu sertifikası geçersiz"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Temel hazırlık iptal edildi"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Temel hazırlık kullanılamıyor"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"OSU sunucu URL\'si geçersiz"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Beklenmeyen komut türü"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Beklenmeyen SOAP mesaj türü"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP mesajlaşması başarısız"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Yönlendirme işleyici başlatılamadı"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Yönlendirme beklenirken süre doldu"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"OSU etkinliği bulunamadı"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Beklenmeyen SOAP mesaj durumu"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO bulunamadı"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"AAA sunucusu için güvenilir kök düğüm bulunamadı"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Düzeltme sunucusu için güvenilir kök düğüm bulunamadı"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Politika sunucusu için güvenilir kök düğüm bulunamadı"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Güvenilir kök sertifikalar alınamadı"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"AAA sunucusu için güvenilir kök sertifika bulunamadı"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"PassPoint yapılandırması eklenemedi"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"OSU sağlayıcı bulunamadı"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Bağlanıyor"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Bağlandı"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"OSU sunucusu ile bağlantı kuruluyor"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU sunucusu doğrulandı"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"OSU sunucusuna bağlandı"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"İlk SOAP değişimi"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Yönlendirme yanıtı bekleniyor"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Yönlendirme yanıtı alındı"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"İkinci SOAP değişimi"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Üçüncü SOAP değişimi"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Güvenilir kök sertifikalar alınıyor"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Temel hazırlık tamamlandı"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Çok Yavaş"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Yavaş"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"Tamam"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Uyanık kal"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Şarj edilirken ekran hiçbir zaman uykuya geçmez"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Bluetooth HCI araştırmayı etkinleştir"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Bir dosyadaki tüm Bluetooth HCI paketlerini yakala (Bu ayarı değiştirdikten sonra Bluetooth seçimini değiştirin)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM kilit açma"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Önyükleyicinin kilidinin açılmasına izin ver"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM kilit açmaya izin verilsin mi?"</string>
diff --git a/packages/SettingsLib/res/values-uk/arrays.xml b/packages/SettingsLib/res/values-uk/arrays.xml
index 88a2aca..5e14286 100644
--- a/packages/SettingsLib/res/values-uk/arrays.xml
+++ b/packages/SettingsLib/res/values-uk/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Використовувати перевірку HDCP лише для вмісту, захищеного DRM"</item>
     <item msgid="45075631231212732">"Завжди використовувати перевірку HDCP"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (за умовчанням)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index a28dc18..1cfa0eb 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Автоматично під’єднано через %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Автоматично під’єднано через постачальника оцінки якості мережі"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Під’єднано через %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> надає <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Доступ через %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Торкніться, щоб налаштувати"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Під’єднано, але немає доступу до Інтернету"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Немає Інтернету"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Потрібно ввійти в обліковий запис"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Точка доступу тимчасово переповнена"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Під’єднано через мережу %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Доступ через мережу %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Помилка підключення"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Недійсна URL-адреса сервера OSU"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Не вдалося підключитися до сервера OSU"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Не вдалося перевірити сервер OSU"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Недійсний сертифікат сервера OSU"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Надання скасовано"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Надання недоступне"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Недійсна URL-адреса сервера OSU"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Неочікуваний тип команди"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Неочікуваний тип повідомлення SOAP"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Не вдалося провести обмін повідомленнями SOAP"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Не вдалося запустити обробник переспрямування"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Час очікування переспрямування минув"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Не виявлено активності OSU"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Неочікуваний статус повідомлення SOAP"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Не вдалося знайти PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Не вдалося знайти надійний кореневий вузол для AAA-сервера"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Не вдалося знайти надійний кореневий вузол для сервера виправлень"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Не вдалося знайти надійний кореневий вузол для сервера політики"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Не вдалось отримати надійні кореневі сертифікати"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Не вдалося знайти надійний кореневий сертифікат для AAA-сервера"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Не вдалося додати налаштування PassPoint"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Не вдалося знайти постачальника OSU"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Підключення"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Підключено"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Підключення до сервера OSU"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Сервер OSU перевірено"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Підключено до сервера OSU"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Початковий обмін SOAP"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Очікування відповіді переспрямування"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Відповідь переспрямування отримано"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Другий обмін SOAP"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Третій обмін SOAP"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Отримання надійних кореневих сертифікатів"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Надання завершено"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Дуже повільна"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Повільна"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"ОК"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Залишати активним"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Екран не засинатиме під час заряджання"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Увімкнути журнал відстеження інтерфейсу Bluetooth"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Зберігати всі пакети інтерфейсу Bluetooth у файлі (перемикати Bluetooth після змінення цього налаштування)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Розблокування виробником"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Дозволити розблокування завантажувача"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Дозволити виробникові розблоковувати пристрій?"</string>
diff --git a/packages/SettingsLib/res/values-ur/arrays.xml b/packages/SettingsLib/res/values-ur/arrays.xml
index c6eadd98..27b26b7 100644
--- a/packages/SettingsLib/res/values-ur/arrays.xml
+++ b/packages/SettingsLib/res/values-ur/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"‏HDCP چیکنگ صرف DRM مواد کیلئے استعمال کریں"</item>
     <item msgid="45075631231212732">"‏ہمیشہ HDCP چیکنگ استعمال کریں"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"‏AVRCP 1.4 (ڈیفالٹ)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index 397f4b2..5e8ab54 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"‏‎%1$s کے ذریعے از خود منسلک کردہ"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"نیٹ ورک درجہ بندی کے فراہم کنندہ کے ذریعے از خود منسلک"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"‏منسلک بذریعہ ‎%1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g> بذریعہ <xliff:g id="SSID">%1$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"‏دستیاب بذریعہ ‎%1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"سیٹ اپ کرنے کے لیے تھپتھپائیں"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"منسلک، انٹرنیٹ نہیں ہے"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"انٹرنیٹ نہیں ہے"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"سائن ان درکار ہے"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"رسائی پوائنٹ عارضی طور پر فُل ہے"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"‏منسلک بذریعہ ‎%1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"‏دستیاب بذریعہ ‎%1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"کنکشن ناکام ہو گیا"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"‏غلط OSU سرور کا URL"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"‏OSU سرور کنکشن ناکام ہو گيا"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"‏OSU سرور کی توثیق ناکام ہو گئی"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"‏غلط OSU سرور کا سرٹیفیکیٹ"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"فراہمی کو منسوخ کر دیا گیا"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"فراہمی دستیاب نہیں ہے"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"‏غلط OSU سرور کا URL"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"غیر متوقع کمانڈ کی قسم"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"‏غیر متوقع SOAP پیغام کی قسم"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"‏SOAP پیغام کا تبادلہ ناکام ہو گیا"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"ری ڈائریکٹ سامع شروع ہونے میں ناکام ہو گیا"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"ری ڈائریکٹ کے انتظار میں ٹائم آؤٹ ہو گیا"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"‏OSU کی کوئی سرگرمی نہیں ملی"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"‏غیرمتوقع SOAP پیغام کی صورتحال"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"‏PPS-MO تلاش کرنے میں ناکام"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"‏AAA سرور کے لیے معتبر روٹ نوڈ تلاش کرنے میں ناکام"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"تلافی سرور کے لیے معتبر روٹ نوڈ تلاش کرنے میں ناکام"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"پالیسی سرور کے لیے معتبر روٹ نوڈ تلاش کرنے میں ناکام"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"معتبر روٹ سرٹیفکیٹس کو دوبارہ حاصل کرنے میں ناکام"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"‏AAA سرور کے لیے معتبر روٹ سرٹیفکیٹ تلاش کرنے میں ناکام"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"‏PassPoint کی کنفیگریشن شامل کرنے میں ناکام"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"‏OSU فراہم کنندہ کو تلاش کرنے میں ناکام"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"منسلک ہو رہا ہے"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"منسلک ہے"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"‏OSU سرور سے منسلک ہو رہا ہے"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"‏OSU سرور کی توثیق ہو گئی"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"‏OSU سرور سے منسلک ہے"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"‏SOAP کا ابتدائی تبادلہ"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"ری ڈائریکٹ کے جواب کا منتظر"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"ری ڈائریکٹ کا جواب موصول ہو گیا"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"‏دوسرے SOAP کا تبادلہ"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"‏تیسرے SOAP کا تبادلہ"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"معتبر روٹ سرٹیفکیٹس کو دوبارہ حاصل کیا جا رہا ہے"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"فراہمی مکمل ہو گئی"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"بہت سست"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"سست"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"ٹھیک ہے"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"بیدار رکھیں"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"چارج ہوتے وقت اسکرین کبھی بھی سلیپ وضع میں نہيں جائے گی"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"‏بلوٹوتھ HCI کا جاسوسی لاگ فعال کریں"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"‏سبھی بلوٹوتھ HCI کے پیکٹس ایک فائل میں کیپچر کریں (اس ترتیب کو تبدیل کرنے کے بعد بلوٹوتھ ٹوگل کریں)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"‏OEM اَن لاکنگ"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"بوٹ لوڈر کو غیر مقفل ہونے کی اجازت دیں"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"‏OEM اَن لاکنگ کی اجازت دیں؟"</string>
diff --git a/packages/SettingsLib/res/values-uz/arrays.xml b/packages/SettingsLib/res/values-uz/arrays.xml
index b3e4619..d127689 100644
--- a/packages/SettingsLib/res/values-uz/arrays.xml
+++ b/packages/SettingsLib/res/values-uz/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"HDCP tekshiruvi faqat DRM kontent uchun ishlatilsin"</item>
     <item msgid="45075631231212732">"Har doim HDCP tekshiruvidan foydalanilsin"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (asosiy)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index 5f214ce..133e25e 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s orqali avtomatik ulandi"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Tarmoqlar reytingi muallifi orqali avtomatik ulandi"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s orqali ulangan"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g>, <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s orqali ishlaydi"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Sozlash uchun bosing"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Ulangan, lekin internet aloqasi yo‘q"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Internet yo‘q"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Hisob bilan kirish zarur"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Internet kirish nuqtasi vaqtinchalik to‘lgan"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s orqali ulangan"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"%1$s orqali ishlaydi"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Ulanishda xatolik yuz berdi"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"Yaroqsiz OSU serveri URL manzili"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"OSU serveriga ulanmadi"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU serveri tasdiqlanmadi"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Yaroqsiz OSU serveri sertifikati"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Sinxronizatsiya uzildi"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Sinxronizatsiya mavjud emas"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"Yaroqsiz OSU serveri URL manzili"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Notanish buyruq turi"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Notanish SOAP xabari turi"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"SOAP xabarlari almashinuvi amalga oshmadi"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Teskari chaqiruv qabul qilgichi ishga tushmadi"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Kutish vaqtidan oshib ketdi"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Hech qanday OSU harakatlari topilmadi"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"SOAP xabari holati noaniq"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"PPS-MO topilmadi"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"AAA serveri uchun ishonchli root tuguni topilmadi"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Tuzatish serveri uchun ishonchli root tuguni topilmadi"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Qoidalar serveri uchun ishonchli root tuguni topilmadi"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Ishonchli root sertifikatlari olinmadi"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"AAA serveri uchun ishonchli root sertifikati topilmadi"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"PassPoint sozlamalari kiritilmadi"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"OSU taʼminotchisi topilmadi"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Ulanmoqda"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Ulandi"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"OSU serveriga ulanmoqda"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU serveri tasdiqlandi"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"OSU serveriga ulangan"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Birinchi SOAP almashinuvi"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Uzatish uchun javob kutilmoqda"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Javob olindi"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Ikkinchi SOAP almashinuvi"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Uchinchi SOAP almashinuvi"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Ishonchli root sertifikatlari olinmoqda"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Sinxronizatsiya yakunlandi"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Juda sekin"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Sekin"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Ekranning yoniq turishi"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Qurilma quvvat olayotganda ekran doim yoniq turadi"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Bluetooth HCI amallari translatsiyasi jurnali"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Barcha Bluetooth HCI paketlarini bitta faylga saqlash (Bu parametrni o‘zgartirishdan keyin Bluetooth funksiyasini yoqish/o‘chirish)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Zavod qulfini yechish"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Operatsion tizimni yuklash dasturining qulfini yechishga ruxsat berish"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Zavod qulfini yechishga ruxsat berilsinmi?"</string>
diff --git a/packages/SettingsLib/res/values-vi/arrays.xml b/packages/SettingsLib/res/values-vi/arrays.xml
index ccc6cee..bfc4d75 100644
--- a/packages/SettingsLib/res/values-vi/arrays.xml
+++ b/packages/SettingsLib/res/values-vi/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Chỉ sử dụng kiểm tra HDCP cho nội dung DRM"</item>
     <item msgid="45075631231212732">"Luôn sử dụng kiểm tra HDCP"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (Mặc định)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index e019953..1cd1b29 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Tự động được kết nối qua %1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Tự động được kết nối qua nhà cung cấp dịch vụ xếp hạng mạng"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Được kết nối qua %1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> của <xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Có sẵn qua %1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Nhấn để thiết lập"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Đã kết nối, không có Internet"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Không có Internet"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Yêu cầu đăng nhập"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Điểm truy cập tạm thời đã đạt đến giới hạn số lượng thiết bị truy cập."</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Được kết nối qua %1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Có sẵn qua %1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Không kết nối được"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"URL máy chủ OSU không hợp lệ"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Không kết nối được với máy chủ OSU"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Không xác thực được máy chủ OSU"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Chứng chỉ máy chủ OSU không hợp lệ"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Đã hủy cấp phép"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Hiện không cấp phép được"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"URL máy chủ OSU không hợp lệ"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Loại lệnh không mong muốn"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Loại thông báo SOAP không mong muốn"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Không trao đổi được thông báo SOAP"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Không thể bắt đầu chuyển hướng người nghe"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Đã hết thời gian chờ chuyển hướng"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Không tìm thấy hoạt động OSU nào"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Trạng thái thông báo SOAP không mong muốn"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Không tìm thấy PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Không tìm thấy nút gốc tin cậy cho máy chủ AAA"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Không tìm thấy nút gốc tin cậy cho máy chủ khắc phục"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Không tìm thấy nút gốc tin cậy cho máy chủ chính sách"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Không truy xuất được chứng chỉ gốc tin cậy"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Không tìm thấy chứng chỉ gốc tin cậy cho máy chủ AAA"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Không thêm được cấu hình PassPoint"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Không tìm thấy nhà cung cấp OSU"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Đang kết nối"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Đã kết nối"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Đang kết nối với máy chủ OSU"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Đã xác thực máy chủ OSU"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Đã kết nối với máy chủ OSU"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Lần trao đổi SOAP ban đầu"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Đang đợi thông tin phản hồi chuyển hướng"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Đã nhận được thông tin phản hồi chuyển hướng"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Lần trao đổi SOAP thứ hai"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Lần trao đổi SOAP thứ ba"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Đang truy xuất chứng chỉ gốc tin cậy"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Quá trình cấp phép đã hoàn tất"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Rất chậm"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Chậm"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"Khá tốt"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Không khóa màn hình"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Màn hình sẽ không bao giờ chuyển sang chế độ nghỉ khi sạc"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Bật nhật ký theo dõi HCI Bluetooth"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Thu thập tất cả các gói HCI Bluetooth vào một tệp (Bật/tắt Bluetooth sau khi thay đổi cài đặt này)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Mở khóa OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Cho phép mở khóa trình khởi động"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Cho phép mở khóa OEM?"</string>
diff --git a/packages/SettingsLib/res/values-zh-rCN/arrays.xml b/packages/SettingsLib/res/values-zh-rCN/arrays.xml
index 4ee055b..82d8fae 100644
--- a/packages/SettingsLib/res/values-zh-rCN/arrays.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"仅使用 HDCP 检查 DRM 内容"</item>
     <item msgid="45075631231212732">"始终使用 HDCP 检查"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4(默认)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index fd0d36e..f656e1e 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"已通过%1$s自动连接"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"已自动连接(通过网络评分服务提供方)"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"已通过%1$s连接"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g>(通过<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>连接)"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"可通过%1$s连接"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"点按即可进行设置"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"已连接,但无法访问互联网"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"无法访问互联网"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"必须登录"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"接入点暂时满载"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"已通过%1$s连接"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"可通过%1$s连接"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"连接失败"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"OSU 服务器网址无效"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"无法连接到 OSU 服务器"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"OSU 服务器验证失败"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"OSU 服务器证书无效"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"已取消配置"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"配置不可用"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"OSU 服务器网址无效"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"非预期的命令类型"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"非预期的 SOAP 消息类型"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"无法交换 SOAP 消息"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"无法启动重定向侦听器"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"等待重定向时出现超时问题"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"未找到任何 OSU 活动"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"非预期的 SOAP 消息状态"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"找不到 PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"找不到 AAA 服务器的信任根节点"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"找不到修复服务器的信任根节点"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"找不到政策服务器的信任根节点"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"未能检索到信任的根证书"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"找不到 AAA 服务器的信任根证书"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"无法添加 PassPoint 配置"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"找不到 OSU 提供程序"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"正在连接"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"已连接"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"正在连接到 OSU 服务器"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU 服务器已经过验证"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"已连接到 OSU 服务器"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"初始 SOAP 交换"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"正在等待重定向响应"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"已收到重定向响应"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"第二次 SOAP 交换"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"第三次 SOAP 交换"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"正在检索信任的根证书"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"配置完成"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"很慢"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"慢"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"良好"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"不锁定屏幕"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"充电时屏幕不会休眠"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"启用蓝牙 HCI 信息收集日志"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"捕获单个文件中的所有蓝牙 HCI 包(更改此设置之后切换蓝牙开关)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM 解锁"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"允许解锁引导加载程序"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"要允许 OEM 解锁吗?"</string>
@@ -446,10 +410,10 @@
     <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"根据您的使用情况,大约还可使用 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
     <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"根据您的使用情况,大约还可使用 <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
     <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"还可使用 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
-    <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"根据您的使用情况,估计大约还能用到<xliff:g id="TIME">%1$s</xliff:g>(目前电量为 <xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
-    <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"根据您的使用情况,估计大约还能用到<xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_discharge_by" msgid="6453537733650125582">"目前电量为 <xliff:g id="LEVEL">%2$s</xliff:g>,估计大约还能用到<xliff:g id="TIME">%1$s</xliff:g>"</string>
-    <string name="power_discharge_by_only" msgid="107616694963545745">"估计大约还能用到<xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <string name="power_discharge_by_enhanced" msgid="2095821536747992464">"根据您的使用情况,估计能用到<xliff:g id="TIME">%1$s</xliff:g>(目前电量为 <xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+    <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"根据您的使用情况,估计能用到<xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <string name="power_discharge_by" msgid="6453537733650125582">"目前电量为 <xliff:g id="LEVEL">%2$s</xliff:g>,估计能用到<xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <string name="power_discharge_by_only" msgid="107616694963545745">"估计能用到<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_discharge_by_only_short" msgid="1372817269546888804">"直到<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"剩余电池续航时间不到 <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
     <string name="power_remaining_less_than_duration" msgid="5751885147712659423">"电量剩余使用时间不到 <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/arrays.xml b/packages/SettingsLib/res/values-zh-rHK/arrays.xml
index a49a91d..0a956fc 100644
--- a/packages/SettingsLib/res/values-zh-rHK/arrays.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"僅使用 HDCP 檢查 DRM 內容"</item>
     <item msgid="45075631231212732">"永遠使用 HDCP 檢查"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (預設)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 024299b..325a56a 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"已透過 %1$s 自動連線"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"已透過網絡評分供應商自動連線"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"已透過 %1$s 連線"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>的「<xliff:g id="SSID">%1$s</xliff:g>」"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"可透過 %1$s 連線"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"輕按即可設定"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"已連線,但沒有互聯網"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"沒有互聯網連線"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"必須登入"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"存取點暫時已滿"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"已透過 %1$s 連線"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"可透過 %1$s 連線"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"連接失敗"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"無效的 OSU 伺服器網址"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"無法連接 OSU 伺服器"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"無法驗證 OSU 伺服器"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"無效的 OSU 伺服器憑證"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"已取消佈建"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"無法佈建"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"無效的 OSU 伺服器網址"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"非預期的指令類型"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"非預期的 SOAP 訊息類型"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"無法交換 SOAP 訊息"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"無法啟用重新導向非同步回呼"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"等待重新導向逾時"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"找不到 OSU 活動"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"非預期的 SOAP 訊息狀態"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"找不到 PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"找不到可信賴的 AAA 伺服器根節點"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"找不到可信賴的修復伺服器根節點"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"找不到可信賴的政策伺服器根節點"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"無法擷取可信賴的根憑證"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"找不到可信賴的 AAA 伺服器根憑證"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"無法新增 PassPoint 設定"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"找不到 OSU 供應商"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"正在連接"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"已連接"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"正在連接至 OSU 伺服器"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"已驗證 OSU 伺服器"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"已連接至 OSU 伺服器"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"初始 SOAP 交換"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"正在等待重新導向回應"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"已收到重新導向回應"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"第二次 SOAP 交換"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"第三次 SOAP 交換"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"正在擷取可信賴的根憑證"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"佈建已完成"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"非常慢"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"慢"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"良好"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"保持啟用"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"充電時螢幕永不休眠"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"啟用藍牙 HCI 窺探記錄"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"擷取單一檔案內的所有藍牙 HCI 封包 (變更此設定後必須切換藍牙)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"原始設備製造商 (OEM) 解鎖"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"允許 Bootloader 被解鎖"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"允許原始設備製造商 (OEM) 解鎖嗎?"</string>
diff --git a/packages/SettingsLib/res/values-zh-rTW/arrays.xml b/packages/SettingsLib/res/values-zh-rTW/arrays.xml
index da4c886..20d0242 100644
--- a/packages/SettingsLib/res/values-zh-rTW/arrays.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"僅使用 HDCP 檢查 DRM 內容"</item>
     <item msgid="45075631231212732">"一律使用 HDCP 檢查"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"AVRCP 1.4 (預設)"</item>
     <item msgid="2809759619990248160">"AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index 146ffac..dff2fab 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"已透過 %1$s 自動連線"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"已透過網路評分供應商自動連線"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"已透過 %1$s 連線"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> (透過「<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>」連線)"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"可透過 %1$s 使用"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"輕觸即可進行設定"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"已連線,沒有網際網路"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"沒有網際網路連線"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"必須登入"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"存取點暫時滿載"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"已透過 %1$s 連線"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"可透過 %1$s 使用"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"連線失敗"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"無效的 OSU 伺服器網址"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"無法連線至 OSU 伺服器"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"無法驗證 OSU 伺服器"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"無效的 OSU 伺服器憑證"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"已取消佈建作業"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"無法進行佈建"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"無效的 OSU 伺服器網址"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"非預期的指令類型"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"非預期的 SOAP 訊息類型"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"無法交換 SOAP 訊息"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"無法啟動重新導向接聽器"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"等待重新導向的過程中發生逾時情形"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"找不到 OSU 活動"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"非預期的 SOAP 訊息狀態"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"找不到 PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"找不到 AAA 伺服器的可信任根節點"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"找不到修正伺服器的可信任根節點"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"找不到政策伺服器的可信任根節點"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"無法擷取信任的根憑證"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"找不到 AAA 伺服器的可信任根憑證"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"無法新增 PassPoint 設定"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"找不到 OSU 提供者"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"連線中"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"已連線"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"正在連線至 OSU 伺服器"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"OSU 伺服器已通過驗證"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"已連線至 OSU 伺服器"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"初始 SOAP 交換"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"正在等待重新導向回覆"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"已接收重新導向回覆"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"第二次 SOAP 交換"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"第三次 SOAP 交換"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"正在擷取信任的根憑證"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"已完成佈建作業"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"非常慢"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"慢"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"確定"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"螢幕不休眠"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"充電時螢幕不會進入休眠"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"啟用藍牙 HCI 窺探記錄"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"擷取單一檔案內的所有藍牙 HCI 封包 (變更這項設定後必須切換藍牙)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM 解鎖"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"允許解除鎖定開機載入器"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"要允許 OEM 解鎖嗎?"</string>
diff --git a/packages/SettingsLib/res/values-zu/arrays.xml b/packages/SettingsLib/res/values-zu/arrays.xml
index 93397c6..caa7da3 100644
--- a/packages/SettingsLib/res/values-zu/arrays.xml
+++ b/packages/SettingsLib/res/values-zu/arrays.xml
@@ -58,6 +58,9 @@
     <item msgid="3878793616631049349">"Sebenzisa ukuhlola kwe-HDCP kokuqukethwe i-DRM kuphela"</item>
     <item msgid="45075631231212732">"Sebenzisa njalo ukuhlola kwe-HDPC"</item>
   </string-array>
+    <!-- no translation found for bt_hci_snoop_log_entries:0 (3966341281672645384) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:1 (1969681323976948639) -->
+    <!-- no translation found for bt_hci_snoop_log_entries:2 (8719029132154020716) -->
   <string-array name="bluetooth_avrcp_versions">
     <item msgid="5347678900838034763">"I-AVRCP 1.4 (Okuzenzakalelayo)"</item>
     <item msgid="2809759619990248160">"I-AVRCP 1.3"</item>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index fc7b9b4..b8c1637 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -38,87 +38,50 @@
     <string name="connected_via_network_scorer" msgid="5713793306870815341">"Ixhumeke ngokuzenzakalela nge-%1$s"</string>
     <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Kuxhunywe ngokuzenzakalelayo ngomhlinzeki wesilinganiso wenethiwekhi"</string>
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Kuxhumeke nge-%1$s"</string>
-    <!-- no translation found for ssid_by_passpoint_provider (7898171424140673315) -->
-    <skip />
+    <string name="ssid_by_passpoint_provider" msgid="7898171424140673315">"<xliff:g id="SSID">%1$s</xliff:g> ngo-<xliff:g id="PASSPOINTPROVIDER">%2$s</xliff:g>"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Iyatholakala nge-%1$s"</string>
-    <!-- no translation found for tap_to_set_up (2468970825530423314) -->
-    <skip />
+    <string name="tap_to_set_up" msgid="2468970825530423314">"Thepha ukuze usethe"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Kuxhunyiwe, ayikho i-inthanethi"</string>
     <string name="wifi_status_no_internet" msgid="5784710974669608361">"Ayikho i-inthanethi"</string>
     <string name="wifi_status_sign_in_required" msgid="123517180404752756">"Ukungena ngemvume kuyadingeka"</string>
     <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Iphoyinti lokufinyelela ligcwele okwesikhashana"</string>
     <string name="connected_via_carrier" msgid="7583780074526041912">"Kuxhumeke nge-%1$s"</string>
     <string name="available_via_carrier" msgid="1469036129740799053">"Iyatholakala nge-%1$s"</string>
-    <!-- no translation found for osu_failure_ap_connection (598977488344424542) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_url_invalid (2237477219243136714) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_connection (8192988165059982174) -->
-    <skip />
-    <!-- no translation found for osu_failure_server_validation (4631649978129606823) -->
-    <skip />
-    <!-- no translation found for osu_failure_service_provider_verification (4854091521439785597) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_aborted (424627208135320329) -->
-    <skip />
-    <!-- no translation found for osu_failure_provisioning_not_available (3021783729256985432) -->
-    <skip />
-    <!-- no translation found for osu_failure_invalid_server_url (8548886196179435758) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_command_type (8245921319866603904) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_type (2255897608510053065) -->
-    <skip />
-    <!-- no translation found for osu_failure_soap_message_exchange (4357358438685987192) -->
-    <skip />
-    <!-- no translation found for osu_failure_start_redirect_listener (4292769407279548482) -->
-    <skip />
-    <!-- no translation found for osu_failure_timed_out_redirect_listener (3168657820278807508) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_osu_activity_found (4593038891437878675) -->
-    <skip />
-    <!-- no translation found for osu_failure_unexpected_soap_message_status (6568467710235256675) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_pps_mo (850567403039076835) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_server_trust_root_node (8961455873459838456) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_remediation_server_trust_root_node (5041179688081545244) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_policy_server_trust_root_node (6617290380940513539) -->
-    <skip />
-    <!-- no translation found for osu_failure_retrieve_trust_root_certificates (1499136256195528265) -->
-    <skip />
-    <!-- no translation found for osu_failure_no_aaa_trust_root_certificate (1904322497042226984) -->
-    <skip />
-    <!-- no translation found for osu_failure_add_passpoint_configuration (2173557755811446047) -->
-    <skip />
-    <!-- no translation found for osu_failure_osu_provider_not_found (6616172862116673082) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connecting (5296821043003441437) -->
-    <skip />
-    <!-- no translation found for osu_status_ap_connected (3777289375683170728) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connecting (8499785407540355867) -->
-    <skip />
-    <!-- no translation found for osu_status_server_validated (3158727184762596355) -->
-    <skip />
-    <!-- no translation found for osu_status_server_connected (8382024481520158168) -->
-    <skip />
-    <!-- no translation found for osu_status_init_soap_exchange (8628063888912101981) -->
-    <skip />
-    <!-- no translation found for osu_status_waiting_for_redirect_response (2343016207837053197) -->
-    <skip />
-    <!-- no translation found for osu_status_redirect_response_received (5323368411922609405) -->
-    <skip />
-    <!-- no translation found for osu_status_second_soap_exchange (7115332266758483909) -->
-    <skip />
-    <!-- no translation found for osu_status_third_soap_exchange (8460901783597440766) -->
-    <skip />
-    <!-- no translation found for osu_status_retrieving_trust_root_certs (1563445892926269689) -->
-    <skip />
-    <!-- no translation found for osu_provisioning_complete (5120178802493970149) -->
-    <skip />
+    <string name="osu_failure_ap_connection" msgid="598977488344424542">"Ukuxhumeka kuhlulekile"</string>
+    <string name="osu_failure_server_url_invalid" msgid="2237477219243136714">"I-URL yeseva ye-OSU engavumelekile"</string>
+    <string name="osu_failure_server_connection" msgid="8192988165059982174">"Ukuxhumeka kweseva ye-OSU kuhlulekile"</string>
+    <string name="osu_failure_server_validation" msgid="4631649978129606823">"Ukuqinisekiswa kweseva ye-OSU kuhlulekile"</string>
+    <string name="osu_failure_service_provider_verification" msgid="4854091521439785597">"Isitifiketi esingavumelekile seseva ye-OSU"</string>
+    <string name="osu_failure_provisioning_aborted" msgid="424627208135320329">"Ukunikezelwa kuyekeliwe"</string>
+    <string name="osu_failure_provisioning_not_available" msgid="3021783729256985432">"Ukunikezelwa akutholakali"</string>
+    <string name="osu_failure_invalid_server_url" msgid="8548886196179435758">"I-URL yeseva ye-OSU engavumelekile"</string>
+    <string name="osu_failure_unexpected_command_type" msgid="8245921319866603904">"Uhlobo lomyalo ongalindelwe"</string>
+    <string name="osu_failure_unexpected_soap_message_type" msgid="2255897608510053065">"Uhlobo lomlayezo ongalindelwe we-SOAP"</string>
+    <string name="osu_failure_soap_message_exchange" msgid="4357358438685987192">"Ukushintshaniswa komlayezo we-SOAP kuhlulekile"</string>
+    <string name="osu_failure_start_redirect_listener" msgid="4292769407279548482">"Ukuqondisa kabusha umlaleli kuhlulekile ukuqala"</string>
+    <string name="osu_failure_timed_out_redirect_listener" msgid="3168657820278807508">"Iphelelwe isikhathi ilindele ukuqondiswa kabusha"</string>
+    <string name="osu_failure_no_osu_activity_found" msgid="4593038891437878675">"Awukho umsebenzi we-OSU otholiwe"</string>
+    <string name="osu_failure_unexpected_soap_message_status" msgid="6568467710235256675">"Isimo somlayezo we-SOAP ongalindelwe"</string>
+    <string name="osu_failure_no_pps_mo" msgid="850567403039076835">"Yehlulekile ukuthola i-PPS-MO"</string>
+    <string name="osu_failure_no_aaa_server_trust_root_node" msgid="8961455873459838456">"Yehlulekile ukuthola inodi yempande yokuthemba yeseva ye-AAA"</string>
+    <string name="osu_failure_no_remediation_server_trust_root_node" msgid="5041179688081545244">"Yehlulekile ukuthola inodi yempande yokuthemba yeseva yokuxazulula"</string>
+    <string name="osu_failure_no_policy_server_trust_root_node" msgid="6617290380940513539">"Yehlulekile ukuthola inodi yempande yokuthemba yeseva yenqubomgomo"</string>
+    <string name="osu_failure_retrieve_trust_root_certificates" msgid="1499136256195528265">"Yehlulekile ukuthola izitofiketi zempande yokuthenga"</string>
+    <string name="osu_failure_no_aaa_trust_root_certificate" msgid="1904322497042226984">"Yehlulekile ukuthola isitifiketi sempande yokuthemba yamaseva e-AAA"</string>
+    <string name="osu_failure_add_passpoint_configuration" msgid="2173557755811446047">"Yehlulekile ukungeza ukulungiselelwa kwe-PassPoint"</string>
+    <string name="osu_failure_osu_provider_not_found" msgid="6616172862116673082">"Yehlulekile ukuthola umhlinzeki we-OSU"</string>
+    <string name="osu_status_ap_connecting" msgid="5296821043003441437">"Iyaxhuma"</string>
+    <string name="osu_status_ap_connected" msgid="3777289375683170728">"Ixhunyiwe"</string>
+    <string name="osu_status_server_connecting" msgid="8499785407540355867">"Ixhumeka kuseva ye-OSU"</string>
+    <string name="osu_status_server_validated" msgid="3158727184762596355">"Iseva ye-OSU iqinisekisiwe"</string>
+    <string name="osu_status_server_connected" msgid="8382024481520158168">"Ixhumeke kuseva ye-OSU"</string>
+    <string name="osu_status_init_soap_exchange" msgid="8628063888912101981">"Ukushintshisana kwasekuqaleni kwe-SOAP"</string>
+    <string name="osu_status_waiting_for_redirect_response" msgid="2343016207837053197">"Ilindele impendulo yokuqondisa kabusha"</string>
+    <string name="osu_status_redirect_response_received" msgid="5323368411922609405">"Ithole impendulo eqondiswe kabusha"</string>
+    <string name="osu_status_second_soap_exchange" msgid="7115332266758483909">"Ukushintshisana kwesibili kwe-SOAP"</string>
+    <string name="osu_status_third_soap_exchange" msgid="8460901783597440766">"Ukushintshaniswa kwesithathu kwe-SOAP"</string>
+    <string name="osu_status_retrieving_trust_root_certs" msgid="1563445892926269689">"Ithola izitifiketi zempande yokuthemba"</string>
+    <string name="osu_provisioning_complete" msgid="5120178802493970149">"Ukunikezelwa kuqediwe"</string>
     <string name="speed_label_very_slow" msgid="1867055264243608530">"Phansi kakhulu"</string>
     <string name="speed_label_slow" msgid="813109590815810235">"Phansi"</string>
     <string name="speed_label_okay" msgid="2331665440671174858">"KULUNGILE"</string>
@@ -271,7 +234,8 @@
     <string name="keep_screen_on" msgid="1146389631208760344">"Hlala uphapheme"</string>
     <string name="keep_screen_on_summary" msgid="2173114350754293009">"Isikrini asisoze salala ngenkathi sishaja"</string>
     <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Nika amandla i-Bluetooth HCI yelogu lokuhlola"</string>
-    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Thwebula onke amaphakethe e-Bluetooth HCI kwifayela (Shintsha i-Bluetooth ngemuva kokushintsha lesi silungiselelo)"</string>
+    <!-- no translation found for bt_hci_snoop_log_summary (8857606786588106495) -->
+    <skip />
     <string name="oem_unlock_enable" msgid="6040763321967327691">"Ukuvula i-OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Vumela ukuthi i-bootloader ivulwe"</string>
     <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Vumela ukuvula i-OEM?"</string>
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index c8f8d73..3e904a3 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -99,12 +99,12 @@
     <string name="connected_via_network_scorer_default">Automatically connected via network rating provider</string>
     <!-- Status message of Wi-Fi when it is connected by Passpoint configuration. [CHAR LIMIT=NONE] -->
     <string name="connected_via_passpoint">Connected via %1$s</string>
-    <!-- Status message of Wi-Fi when it is connected by Passpoint configuration. [CHAR LIMIT=NONE] -->
-    <string name="ssid_by_passpoint_provider"><xliff:g id="ssid" example="Cafe Wifi">%1$s</xliff:g> by <xliff:g id="passpointProvider" example="Passpoint Provider">%2$s</xliff:g></string>
+    <!-- Status message of Wi-Fi when it is connected by a app (via suggestion or network request). [CHAR LIMIT=NONE] -->
+    <string name="connected_via_app">Connected via <xliff:g id="name" example="Wifi App">%1$s</xliff:g></string>
     <!-- Status message of Wi-Fi when network has matching passpoint credentials. [CHAR LIMIT=NONE] -->
     <string name="available_via_passpoint">Available via %1$s</string>
     <!-- Status message of OSU Provider network when not connected. [CHAR LIMIT=NONE] -->
-    <string name="tap_to_set_up">Tap to set up</string>
+    <string name="tap_to_sign_up">Tap to sign up</string>
     <!-- Package name for Settings app-->
     <string name="settings_package" translatable="false">com.android.settings</string>
     <!-- Package name for Certinstaller app-->
@@ -127,78 +127,16 @@
     <!-- Status message of Wi-Fi when an available network is a carrier network. [CHAR LIMIT=NONE] -->
     <string name="available_via_carrier">Available via %1$s</string>
 
-    <!-- Status message of OSU Provider on receiving OSU_FAILURE_AP_CONNECTION. [CHAR LIMIT=NONE] -->
-    <string name="osu_failure_ap_connection">Connection failed</string>
-    <!-- Status message of OSU Provider on receiving OSU_FAILURE_SERVER_URL_INVALID. [CHAR LIMIT=NONE] -->
-    <string name="osu_failure_server_url_invalid">Invalid OSU server URL</string>
-    <!-- Status message of OSU Provider on receiving OSU_FAILURE_SERVER_CONNECTION. [CHAR LIMIT=NONE] -->
-    <string name="osu_failure_server_connection">OSU server connection failed</string>
-    <!-- Status message of OSU Provider on receiving OSU_FAILURE_SERVER_VALIDATION. [CHAR LIMIT=NONE] -->
-    <string name="osu_failure_server_validation">OSU server validation failed</string>
-    <!-- Status message of OSU Provider on receiving OSU_FAILURE_SERVICE_PROVIDER_VERIFICATION. [CHAR LIMIT=NONE] -->
-    <string name="osu_failure_service_provider_verification">Invalid OSU server certificate</string>
-    <!-- Status message of OSU Provider on receiving OSU_FAILURE_PROVISIONING_ABORTED. [CHAR LIMIT=NONE] -->
-    <string name="osu_failure_provisioning_aborted">Provisioning aborted</string>
-    <!-- Status message of OSU Provider on receiving OSU_FAILURE_PROVISIONING_NOT_AVAILABLE. [CHAR LIMIT=NONE] -->
-    <string name="osu_failure_provisioning_not_available">Provisioning not available</string>
-    <!-- Status message of OSU Provider on receiving OSU_FAILURE_INVALID_SERVER_URL. [CHAR LIMIT=NONE] -->
-    <string name="osu_failure_invalid_server_url">Invalid OSU server URL</string>
-    <!-- Status message of OSU Provider on receiving OSU_FAILURE_UNEXPECTED_COMMAND_TYPE. [CHAR LIMIT=NONE] -->
-    <string name="osu_failure_unexpected_command_type">Unexpected command type</string>
-    <!-- Status message of OSU Provider on receiving OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_TYPE. [CHAR LIMIT=NONE] -->
-    <string name="osu_failure_unexpected_soap_message_type">Unexpected SOAP message type</string>
-    <!-- Status message of OSU Provider on receiving OSU_FAILURE_SOAP_MESSAGE_EXCHANGE. [CHAR LIMIT=NONE] -->
-    <string name="osu_failure_soap_message_exchange">SOAP message exchange failed</string>
-    <!-- Status message of OSU Provider on receiving OSU_FAILURE_START_REDIRECT_LISTENER. [CHAR LIMIT=NONE] -->
-    <string name="osu_failure_start_redirect_listener">Redirect listener failed to start</string>
-    <!-- Status message of OSU Provider on receiving OSU_FAILURE_TIMED_OUT_REDIRECT_LISTENER. [CHAR LIMIT=NONE] -->
-    <string name="osu_failure_timed_out_redirect_listener">Timed out waiting for redirect</string>
-    <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_OSU_ACTIVITY_FOUND. [CHAR LIMIT=NONE] -->
-    <string name="osu_failure_no_osu_activity_found">No OSU activity found</string>
-    <!-- Status message of OSU Provider on receiving OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_STATUS. [CHAR LIMIT=NONE] -->
-    <string name="osu_failure_unexpected_soap_message_status">Unexpected SOAP message status</string>
-    <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_PPS_MO. [CHAR LIMIT=NONE] -->
-    <string name="osu_failure_no_pps_mo">Failed to find PPS-MO</string>
-    <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_AAA_SERVER_TRUST_ROOT_NODE. [CHAR LIMIT=NONE] -->
-    <string name="osu_failure_no_aaa_server_trust_root_node">Failed to find trust root node for AAA server</string>
-    <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_REMEDIATION_SERVER_TRUST_ROOT_NODE. [CHAR LIMIT=NONE] -->
-    <string name="osu_failure_no_remediation_server_trust_root_node">Failed to find trust root node for remediation server</string>
-    <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_POLICY_SERVER_TRUST_ROOT_NODE. [CHAR LIMIT=NONE] -->
-    <string name="osu_failure_no_policy_server_trust_root_node">Failed to find trust root node for policy server</string>
-    <!-- Status message of OSU Provider on receiving OSU_FAILURE_RETRIEVE_TRUST_ROOT_CERTIFICATES. [CHAR LIMIT=NONE] -->
-    <string name="osu_failure_retrieve_trust_root_certificates">Failed to retrieve trust root certificates</string>
-    <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_AAA_TRUST_ROOT_CERTIFICATE. [CHAR LIMIT=NONE] -->
-    <string name="osu_failure_no_aaa_trust_root_certificate">Failed to find trust root certificate for AAA server</string>
-    <!-- Status message of OSU Provider on receiving OSU_FAILURE_ADD_PASSPOINT_CONFIGURATION. [CHAR LIMIT=NONE] -->
-    <string name="osu_failure_add_passpoint_configuration">Failed to add PassPoint configuration</string>
-    <!-- Status message of OSU Provider on receiving OSU_FAILURE_OSU_PROVIDER_NOT_FOUND. [CHAR LIMIT=NONE] -->
-    <string name="osu_failure_osu_provider_not_found">Failed to find an OSU provider</string>
-
-    <!-- Status message of OSU Provider on receiving OSU_STATUS_AP_CONNECTING. [CHAR LIMIT=NONE] -->
-    <string name="osu_status_ap_connecting">Connecting</string>
-    <!-- Status message of OSU Provider on receiving OSU_STATUS_AP_CONNECTED. [CHAR LIMIT=NONE] -->
-    <string name="osu_status_ap_connected">Connected</string>
-    <!-- Status message of OSU Provider on receiving OSU_STATUS_SERVER_CONNECTING. [CHAR LIMIT=NONE] -->
-    <string name="osu_status_server_connecting">Connecting to OSU server</string>
-    <!-- Status message of OSU Provider on receiving OSU_STATUS_SERVER_VALIDATED. [CHAR LIMIT=NONE] -->
-    <string name="osu_status_server_validated">OSU server validated</string>
-    <!-- Status message of OSU Provider on receiving OSU_STATUS_SERVER_CONNECTED. [CHAR LIMIT=NONE] -->
-    <string name="osu_status_server_connected">Connected to OSU server</string>
-    <!-- Status message of OSU Provider on receiving OSU_STATUS_INIT_SOAP_EXCHANGE. [CHAR LIMIT=NONE] -->
-    <string name="osu_status_init_soap_exchange">Initial SOAP exchange</string>
-    <!-- Status message of OSU Provider on receiving OSU_STATUS_WAITING_FOR_REDIRECT_RESPONSE. [CHAR LIMIT=NONE] -->
-    <string name="osu_status_waiting_for_redirect_response">Waiting for redirect response</string>
-    <!-- Status message of OSU Provider on receiving OSU_STATUS_REDIRECT_RESPONSE_RECEIVED. [CHAR LIMIT=NONE] -->
-    <string name="osu_status_redirect_response_received">Received redirect response</string>
-    <!-- Status message of OSU Provider on receiving OSU_STATUS_SECOND_SOAP_EXCHANGE. [CHAR LIMIT=NONE] -->
-    <string name="osu_status_second_soap_exchange">Second SOAP exchange</string>
-    <!-- Status message of OSU Provider on receiving OSU_STATUS_THIRD_SOAP_EXCHANGE. [CHAR LIMIT=NONE] -->
-    <string name="osu_status_third_soap_exchange">Third SOAP exchange</string>
-    <!-- Status message of OSU Provider on receiving OSU_STATUS_RETRIEVING_TRUST_ROOT_CERTS. [CHAR LIMIT=NONE] -->
-    <string name="osu_status_retrieving_trust_root_certs">Retrieving trust root certificates</string>
-
+    <!-- Status message of OSU Provider upon initiating provisioning flow [CHAR LIMIT=NONE] -->
+    <string name="osu_opening_provider">Opening <xliff:g id="passpointProvider" example="Passpoint Provider">%1$s</xliff:g></string>
+    <!-- Status message of OSU Provider when connection fails [CHAR LIMIT=NONE] -->
+    <string name="osu_connect_failed">Couldn\u2019t connect</string>
+    <!-- Status message of OSU Provider after user completes provisioning flow [CHAR LIMIT=NONE] -->
+    <string name="osu_completing_sign_up">Completing sign-up\u2026</string>
+    <!-- Status message of OSU Provider when sign up could not be completed [CHAR LIMIT=NONE] -->
+    <string name="osu_sign_up_failed">Couldn\u2019t complete sign-up. Tap to try again.</string>
     <!-- Status message of OSU Provider on completing provisioning. [CHAR LIMIT=NONE] -->
-    <string name="osu_provisioning_complete">Provisioning complete</string>
+    <string name="osu_sign_up_complete">Sign-up complete. Connecting\u2026</string>
 
     <!-- Speed label for very slow network speed -->
     <string name="speed_label_very_slow">Very Slow</string>
@@ -616,8 +554,6 @@
     <string name="wifi_display_certification">Wireless display certification</string>
     <!-- Setting Checkbox title whether to enable WiFi Verbose Logging. [CHAR LIMIT=40] -->
     <string name="wifi_verbose_logging">Enable Wi\u2011Fi Verbose Logging</string>
-    <!-- Setting Checkbox title whether to enable connected MAC randomization -->
-    <string name="wifi_connected_mac_randomization">Connected MAC Randomization</string>
     <!-- Setting Checkbox title whether to always keep mobile data active. [CHAR LIMIT=80] -->
     <string name="mobile_data_always_on">Mobile data always active</string>
     <!-- Setting Checkbox title whether to enable hardware acceleration for tethering. [CHAR LIMIT=80] -->
@@ -673,8 +609,6 @@
     <string name="wifi_display_certification_summary">Show options for wireless display certification</string>
     <!-- Setting Checkbox summary whether to enable Wifi verbose Logging [CHAR LIMIT=80] -->
     <string name="wifi_verbose_logging_summary">Increase Wi\u2011Fi logging level, show per SSID RSSI in Wi\u2011Fi Picker</string>
-    <!-- Setting Checkbox title whether to enable connected MAC randomization -->
-    <string name="wifi_connected_mac_randomization_summary">Randomize MAC address when connecting to Wi\u2011Fi networks</string>
     <!-- Label indicating network has been manually marked as metered -->
     <string name="wifi_metered_label">Metered</string>
     <!-- Label indicating network has been manually marked as unmetered -->
diff --git a/packages/SettingsLib/res/values/styles.xml b/packages/SettingsLib/res/values/styles.xml
index bae8387..015f52c 100644
--- a/packages/SettingsLib/res/values/styles.xml
+++ b/packages/SettingsLib/res/values/styles.xml
@@ -24,7 +24,7 @@
 
     <style name="BorderlessButton">
         <item name="android:padding">12dp</item>
-        <item name="android:background">@drawable/btn_borderless_rect</item>
+        <item name="android:background">@*android:drawable/btn_borderless_rect</item>
         <item name="android:gravity">center</item>
     </style>
 </resources>
diff --git a/packages/SettingsLib/src/com/android/settingslib/Utils.java b/packages/SettingsLib/src/com/android/settingslib/Utils.java
index c751c39..d32e85f 100644
--- a/packages/SettingsLib/src/com/android/settingslib/Utils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/Utils.java
@@ -56,37 +56,25 @@
 
     public static void updateLocationEnabled(Context context, boolean enabled, int userId,
             int source) {
+        LocationManager locationManager = context.getSystemService(LocationManager.class);
+
         Settings.Secure.putIntForUser(
                 context.getContentResolver(), Settings.Secure.LOCATION_CHANGER, source,
                 userId);
-        Intent intent = new Intent(LocationManager.MODE_CHANGING_ACTION);
 
-        final int oldMode = Settings.Secure.getIntForUser(context.getContentResolver(),
-                Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF, userId);
+        Intent intent = new Intent(LocationManager.MODE_CHANGING_ACTION);
+        final int oldMode = locationManager.isLocationEnabled()
+                ? Settings.Secure.LOCATION_MODE_ON
+                : Settings.Secure.LOCATION_MODE_OFF;
         final int newMode = enabled
-                ? Settings.Secure.LOCATION_MODE_HIGH_ACCURACY
+                ? Settings.Secure.LOCATION_MODE_ON
                 : Settings.Secure.LOCATION_MODE_OFF;
         intent.putExtra(CURRENT_MODE_KEY, oldMode);
         intent.putExtra(NEW_MODE_KEY, newMode);
         context.sendBroadcastAsUser(
                 intent, UserHandle.of(userId), android.Manifest.permission.WRITE_SECURE_SETTINGS);
-        LocationManager locationManager =
-                (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
-        locationManager.setLocationEnabledForUser(enabled, UserHandle.of(userId));
-    }
 
-    public static boolean updateLocationMode(Context context, int oldMode, int newMode, int userId,
-            int source) {
-        Settings.Secure.putIntForUser(
-                context.getContentResolver(), Settings.Secure.LOCATION_CHANGER, source,
-                userId);
-        Intent intent = new Intent(LocationManager.MODE_CHANGING_ACTION);
-        intent.putExtra(CURRENT_MODE_KEY, oldMode);
-        intent.putExtra(NEW_MODE_KEY, newMode);
-        context.sendBroadcastAsUser(
-                intent, UserHandle.of(userId), android.Manifest.permission.WRITE_SECURE_SETTINGS);
-        return Settings.Secure.putIntForUser(
-                context.getContentResolver(), Settings.Secure.LOCATION_MODE, newMode, userId);
+        locationManager.setLocationEnabledForUser(enabled, UserHandle.of(userId));
     }
 
     /**
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java
index c059156..bed3030 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java
@@ -296,7 +296,7 @@
     }
 
     public int getDrawableResource(BluetoothClass btClass) {
-        return R.drawable.ic_bt_headphones_a2dp;
+        return com.android.internal.R.drawable.ic_bt_headphones_a2dp;
     }
 
     protected void finalize() {
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpSinkProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpSinkProfile.java
index 873dd1a..4ce9d3e 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpSinkProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpSinkProfile.java
@@ -205,7 +205,7 @@
     }
 
     public int getDrawableResource(BluetoothClass btClass) {
-        return R.drawable.ic_bt_headphones_a2dp;
+        return com.android.internal.R.drawable.ic_bt_headphones_a2dp;
     }
 
     protected void finalize() {
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java
index ee80aa1..081f8a0 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java
@@ -61,13 +61,14 @@
         if (btClass != null) {
             switch (btClass.getMajorDeviceClass()) {
                 case BluetoothClass.Device.Major.COMPUTER:
-                    return new Pair<>(getBluetoothDrawable(context, R.drawable.ic_bt_laptop, level,
-                            iconScale),
+                    return new Pair<>(getBluetoothDrawable(context,
+                            com.android.internal.R.drawable.ic_bt_laptop, level, iconScale),
                             context.getString(R.string.bluetooth_talkback_computer));
 
                 case BluetoothClass.Device.Major.PHONE:
                     return new Pair<>(
-                            getBluetoothDrawable(context, R.drawable.ic_bt_cellphone, level,
+                            getBluetoothDrawable(context,
+                                    com.android.internal.R.drawable.ic_phone, level,
                                     iconScale),
                             context.getString(R.string.bluetooth_talkback_phone));
 
@@ -79,7 +80,8 @@
 
                 case BluetoothClass.Device.Major.IMAGING:
                     return new Pair<>(
-                            getBluetoothDrawable(context, R.drawable.ic_settings_print, level,
+                            getBluetoothDrawable(context,
+                                    com.android.internal.R.drawable.ic_settings_print, level,
                                     iconScale),
                             context.getString(R.string.bluetooth_talkback_imaging));
 
@@ -98,19 +100,22 @@
         if (btClass != null) {
             if (btClass.doesClassMatch(BluetoothClass.PROFILE_HEADSET)) {
                 return new Pair<>(
-                        getBluetoothDrawable(context, R.drawable.ic_bt_headset_hfp, level,
+                        getBluetoothDrawable(context,
+                                com.android.internal.R.drawable.ic_bt_headset_hfp, level,
                                 iconScale),
                         context.getString(R.string.bluetooth_talkback_headset));
             }
             if (btClass.doesClassMatch(BluetoothClass.PROFILE_A2DP)) {
                 return new Pair<>(
-                        getBluetoothDrawable(context, R.drawable.ic_bt_headphones_a2dp, level,
+                        getBluetoothDrawable(context,
+                                com.android.internal.R.drawable.ic_bt_headphones_a2dp, level,
                                 iconScale),
                         context.getString(R.string.bluetooth_talkback_headphone));
             }
         }
         return new Pair<>(
-                getBluetoothDrawable(context, R.drawable.ic_settings_bluetooth, level, iconScale),
+                getBluetoothDrawable(context,
+                        com.android.internal.R.drawable.ic_settings_bluetooth, level, iconScale),
                 context.getString(R.string.bluetooth_talkback_bluetooth));
     }
 
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HeadsetProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HeadsetProfile.java
index 6b6df9b..a1bf936 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HeadsetProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HeadsetProfile.java
@@ -226,7 +226,7 @@
     }
 
     public int getDrawableResource(BluetoothClass btClass) {
-        return R.drawable.ic_bt_headset_hfp;
+        return com.android.internal.R.drawable.ic_bt_headset_hfp;
     }
 
     protected void finalize() {
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidProfile.java
index 77dfbe9..41c1d60 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidProfile.java
@@ -228,7 +228,7 @@
     }
 
     public int getDrawableResource(BluetoothClass btClass) {
-        return R.drawable.ic_bt_hearing_aid;
+        return com.android.internal.R.drawable.ic_bt_hearing_aid;
     }
 
     protected void finalize() {
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HfpClientProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HfpClientProfile.java
index c6bb2b3..4bdbc31 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HfpClientProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HfpClientProfile.java
@@ -211,7 +211,7 @@
 
     @Override
     public int getDrawableResource(BluetoothClass btClass) {
-        return R.drawable.ic_bt_headset_hfp;
+        return com.android.internal.R.drawable.ic_bt_headset_hfp;
     }
 
     protected void finalize() {
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidDeviceProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidDeviceProfile.java
index 4dc050c..35600b5 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidDeviceProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidDeviceProfile.java
@@ -171,7 +171,7 @@
 
     @Override
     public int getDrawableResource(BluetoothClass btClass) {
-        return R.drawable.ic_bt_misc_hid;
+        return com.android.internal.R.drawable.ic_bt_misc_hid;
     }
 
     protected void finalize() {
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidProfile.java
index ca840d9a..7f906f6 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidProfile.java
@@ -165,7 +165,7 @@
 
     public int getDrawableResource(BluetoothClass btClass) {
         if (btClass == null) {
-            return R.drawable.ic_lockscreen_ime;
+            return com.android.internal.R.drawable.ic_lockscreen_ime;
         }
         return getHidClassDrawable(btClass);
     }
@@ -174,11 +174,11 @@
         switch (btClass.getDeviceClass()) {
             case BluetoothClass.Device.PERIPHERAL_KEYBOARD:
             case BluetoothClass.Device.PERIPHERAL_KEYBOARD_POINTING:
-                return R.drawable.ic_lockscreen_ime;
+                return com.android.internal.R.drawable.ic_lockscreen_ime;
             case BluetoothClass.Device.PERIPHERAL_POINTING:
-                return R.drawable.ic_bt_pointing_hid;
+                return com.android.internal.R.drawable.ic_bt_pointing_hid;
             default:
-                return R.drawable.ic_bt_misc_hid;
+                return com.android.internal.R.drawable.ic_bt_misc_hid;
         }
     }
 
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapClientProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapClientProfile.java
index 6acdcac..d4dda32 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapClientProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapClientProfile.java
@@ -200,7 +200,7 @@
     }
 
     public int getDrawableResource(BluetoothClass btClass) {
-        return R.drawable.ic_bt_cellphone;
+        return com.android.internal.R.drawable.ic_phone;
     }
 
     protected void finalize() {
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapProfile.java
index 28975d4..b2a9a6a 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapProfile.java
@@ -196,7 +196,7 @@
     }
 
     public int getDrawableResource(BluetoothClass btClass) {
-        return R.drawable.ic_bt_cellphone;
+        return com.android.internal.R.drawable.ic_phone;
     }
 
     protected void finalize() {
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/PanProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/PanProfile.java
index 2d0a090..6638592 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/PanProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/PanProfile.java
@@ -153,7 +153,7 @@
     }
 
     public int getDrawableResource(BluetoothClass btClass) {
-        return R.drawable.ic_bt_network_pan;
+        return com.android.internal.R.drawable.ic_bt_network_pan;
     }
 
     // Tethering direction determines UI strings.
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapClientProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapClientProfile.java
index 4672393..a2da4fb 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapClientProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapClientProfile.java
@@ -192,7 +192,7 @@
     }
 
     public int getDrawableResource(BluetoothClass btClass) {
-        return R.drawable.ic_bt_cellphone;
+        return com.android.internal.R.drawable.ic_phone;
     }
 
     protected void finalize() {
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapServerProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapServerProfile.java
index 1b3c453..17104e4 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapServerProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapServerProfile.java
@@ -135,7 +135,7 @@
     }
 
     public int getDrawableResource(BluetoothClass btClass) {
-        return R.drawable.ic_bt_cellphone;
+        return com.android.internal.R.drawable.ic_phone;
     }
 
     protected void finalize() {
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/SapProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/SapProfile.java
index ea2ebde..9b733f2 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/SapProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/SapProfile.java
@@ -196,7 +196,7 @@
     }
 
     public int getDrawableResource(BluetoothClass btClass) {
-        return R.drawable.ic_bt_cellphone;
+        return com.android.internal.R.drawable.ic_phone;
     }
 
     protected void finalize() {
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaDevice.java
index a5c6f0c..6d0e3ac 100644
--- a/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaDevice.java
+++ b/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaDevice.java
@@ -19,7 +19,6 @@
 import android.content.Context;
 import android.util.Log;
 
-import com.android.settingslib.R;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 
 /**
@@ -45,7 +44,7 @@
     @Override
     public int getIcon() {
         //TODO(b/117129183): This is not final icon for bluetooth device, just for demo.
-        return R.drawable.ic_bt_headphones_a2dp;
+        return com.android.internal.R.drawable.ic_bt_headphones_a2dp;
     }
 
     @Override
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java
index 04f70cc..99d9d1c 100644
--- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java
+++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java
@@ -20,8 +20,6 @@
 
 import androidx.mediarouter.media.MediaRouter;
 
-import com.android.settingslib.R;
-
 /**
  * InfoMediaDevice extends MediaDevice to represents wifi device.
  */
@@ -45,7 +43,7 @@
     @Override
     public int getIcon() {
         //TODO(b/121083246): This is not final icon for cast device, just for demo.
-        return R.drawable.ic_settings_print;
+        return com.android.internal.R.drawable.ic_settings_print;
     }
 
     @Override
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java
index c808214..8ec2a7f 100644
--- a/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java
+++ b/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java
@@ -18,7 +18,6 @@
 import android.content.Context;
 import android.util.Log;
 
-import com.android.settingslib.R;
 import com.android.settingslib.bluetooth.A2dpProfile;
 import com.android.settingslib.bluetooth.HearingAidProfile;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -53,7 +52,7 @@
     @Override
     public int getIcon() {
         //TODO(b/117129183): This is not final icon for phone device, just for demo.
-        return R.drawable.ic_bt_cellphone;
+        return com.android.internal.R.drawable.ic_phone;
     }
 
     @Override
diff --git a/packages/SettingsLib/src/com/android/settingslib/widget/FooterPreference.java b/packages/SettingsLib/src/com/android/settingslib/widget/FooterPreference.java
index f02044d..a106846 100644
--- a/packages/SettingsLib/src/com/android/settingslib/widget/FooterPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/widget/FooterPreference.java
@@ -56,7 +56,7 @@
     }
 
     private void init() {
-        setIcon(R.drawable.ic_info_outline_24dp);
+        setIcon(com.android.internal.R.drawable.ic_info_outline_24);
         setKey(KEY_FOOTER);
         setOrder(ORDER_FOOTER);
         setSelectable(false);
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
index 9b12a31..ac2c2c9 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
@@ -888,19 +888,20 @@
 
         if (isOsuProvider()) {
             if (mOsuProvisioningComplete) {
-                summary.append(mContext.getString(R.string.osu_provisioning_complete));
+                summary.append(mContext.getString(R.string.osu_sign_up_complete));
             } else if (mOsuFailure != null) {
                 summary.append(mOsuFailure);
             } else if (mOsuStatus != null) {
                 summary.append(mOsuStatus);
             } else {
-                summary.append(mContext.getString(R.string.tap_to_set_up));
+                summary.append(mContext.getString(R.string.tap_to_sign_up));
             }
         } else if (isActive()) {
             if (isPasspoint()) {
                 // This is the active connection on passpoint
-                summary.append(getSummary(mContext, ssid, getDetailedState(),
-                        false, mConfig.providerFriendlyName));
+                summary.append(getSummary(mContext, /* ssid */ null, getDetailedState(),
+                        /* isEphemeral */ false,
+                        /* suggestionOrSpecifierPackageName */ null));
             } else if (mConfig != null && getDetailedState() == DetailedState.CONNECTED
                     && mIsCarrierAp) {
                 // This is the active connection on a carrier AP
@@ -908,8 +909,9 @@
                         mCarrierName));
             } else {
                 // This is the active connection on non-passpoint network
-                summary.append(getSummary(mContext, getDetailedState(),
-                        mInfo != null && mInfo.isEphemeral()));
+                summary.append(getSummary(mContext, /* ssid */ null, getDetailedState(),
+                        mInfo != null && mInfo.isEphemeral(),
+                        mInfo != null ? mInfo.getNetworkSuggestionOrSpecifierPackageName() : null));
             }
         } else { // not active
             if (mConfig != null && mConfig.hasNoInternetAccess()) {
@@ -1322,13 +1324,29 @@
         return mRssi != UNREACHABLE_RSSI;
     }
 
+    private static CharSequence getAppLabel(String packageName, PackageManager packageManager) {
+        CharSequence appLabel = "";
+        ApplicationInfo appInfo = null;
+        try {
+            int userId = UserHandle.getUserId(UserHandle.USER_CURRENT);
+            appInfo = packageManager.getApplicationInfoAsUser(packageName, 0 /* flags */, userId);
+        } catch (PackageManager.NameNotFoundException e) {
+            Log.e(TAG, "Failed to get app info", e);
+            return appLabel;
+        }
+        if (appInfo != null) {
+            appLabel = appInfo.loadLabel(packageManager);
+        }
+        return appLabel;
+    }
+
     public static String getSummary(Context context, String ssid, DetailedState state,
-            boolean isEphemeral, String passpointProvider) {
+            boolean isEphemeral, String suggestionOrSpecifierPackageName) {
         if (state == DetailedState.CONNECTED) {
-            if (!TextUtils.isEmpty(passpointProvider)) {
-                // Special case for connected + passpoint networks.
-                String format = context.getString(R.string.ssid_by_passpoint_provider);
-                return String.format(format, ssid, passpointProvider);
+            if (isEphemeral && !TextUtils.isEmpty(suggestionOrSpecifierPackageName)) {
+                CharSequence appLabel =
+                        getAppLabel(suggestionOrSpecifierPackageName, context.getPackageManager());
+                return context.getString(R.string.connected_via_app, appLabel);
             } else if (isEphemeral) {
                 // Special case for connected + ephemeral networks.
                 final NetworkScoreManager networkScoreManager = context.getSystemService(
@@ -1379,15 +1397,6 @@
         return String.format(formats[index], ssid);
     }
 
-    public static String getSummary(Context context, DetailedState state, boolean isEphemeral) {
-        return getSummary(context, null, state, isEphemeral, null);
-    }
-
-    public static String getSummary(Context context, DetailedState state, boolean isEphemeral,
-            String passpointProvider) {
-        return getSummary(context, null, state, isEphemeral, passpointProvider);
-    }
-
     public static String convertToQuotedString(String string) {
         return "\"" + string + "\"";
     }
@@ -1528,91 +1537,12 @@
      * All methods are invoked on the Main Thread
      */
     private class AccessPointProvisioningCallback extends ProvisioningCallback {
-        // TODO: Remove logs and implement summary changing logic for these provisioning callbacks.
         @Override
         @MainThread public void onProvisioningFailure(int status) {
-            switch (status) {
-                case OSU_FAILURE_AP_CONNECTION:
-                    mOsuFailure = mContext.getString(R.string.osu_failure_ap_connection);
-                    break;
-                case OSU_FAILURE_SERVER_URL_INVALID:
-                    mOsuFailure = mContext.getString(R.string.osu_failure_server_url_invalid);
-                    break;
-                case OSU_FAILURE_SERVER_CONNECTION:
-                    mOsuFailure = mContext.getString(R.string.osu_failure_server_connection);
-                    break;
-                case OSU_FAILURE_SERVER_VALIDATION:
-                    mOsuFailure = mContext.getString(R.string.osu_failure_server_validation);
-                    break;
-                case OSU_FAILURE_SERVICE_PROVIDER_VERIFICATION:
-                    mOsuFailure = mContext.getString(
-                            R.string.osu_failure_service_provider_verification);
-                    break;
-                case OSU_FAILURE_PROVISIONING_ABORTED:
-                    mOsuFailure = mContext.getString(R.string.osu_failure_provisioning_aborted);
-                    break;
-                case OSU_FAILURE_PROVISIONING_NOT_AVAILABLE:
-                    mOsuFailure = mContext.getString(
-                            R.string.osu_failure_provisioning_not_available);
-                    break;
-                case OSU_FAILURE_INVALID_URL_FORMAT_FOR_OSU:
-                    mOsuFailure = mContext.getString(R.string.osu_failure_invalid_server_url);
-                    break;
-                case OSU_FAILURE_UNEXPECTED_COMMAND_TYPE:
-                    mOsuFailure = mContext.getString(R.string.osu_failure_unexpected_command_type);
-                    break;
-                case OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_TYPE:
-                    mOsuFailure = mContext.getString(
-                            R.string.osu_failure_unexpected_soap_message_type);
-                    break;
-                case OSU_FAILURE_SOAP_MESSAGE_EXCHANGE:
-                    mOsuFailure = mContext.getString(R.string.osu_failure_soap_message_exchange);
-                    break;
-                case OSU_FAILURE_START_REDIRECT_LISTENER:
-                    mOsuFailure = mContext.getString(R.string.osu_failure_start_redirect_listener);
-                    break;
-                case OSU_FAILURE_TIMED_OUT_REDIRECT_LISTENER:
-                    mOsuFailure = mContext.getString(
-                            R.string.osu_failure_timed_out_redirect_listener);
-                    break;
-                case OSU_FAILURE_NO_OSU_ACTIVITY_FOUND:
-                    mOsuFailure = mContext.getString(R.string.osu_failure_no_osu_activity_found);
-                    break;
-                case OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_STATUS:
-                    mOsuFailure = mContext.getString(
-                            R.string.osu_failure_unexpected_soap_message_status);
-                    break;
-                case OSU_FAILURE_NO_PPS_MO:
-                    mOsuFailure = mContext.getString(
-                            R.string.osu_failure_no_pps_mo);
-                    break;
-                case OSU_FAILURE_NO_AAA_SERVER_TRUST_ROOT_NODE:
-                    mOsuFailure = mContext.getString(
-                            R.string.osu_failure_no_aaa_server_trust_root_node);
-                    break;
-                case OSU_FAILURE_NO_REMEDIATION_SERVER_TRUST_ROOT_NODE:
-                    mOsuFailure = mContext.getString(
-                            R.string.osu_failure_no_remediation_server_trust_root_node);
-                    break;
-                case OSU_FAILURE_NO_POLICY_SERVER_TRUST_ROOT_NODE:
-                    mOsuFailure = mContext.getString(
-                            R.string.osu_failure_no_policy_server_trust_root_node);
-                    break;
-                case OSU_FAILURE_RETRIEVE_TRUST_ROOT_CERTIFICATES:
-                    mOsuFailure = mContext.getString(
-                            R.string.osu_failure_retrieve_trust_root_certificates);
-                    break;
-                case OSU_FAILURE_NO_AAA_TRUST_ROOT_CERTIFICATE:
-                    mOsuFailure = mContext.getString(
-                            R.string.osu_failure_no_aaa_trust_root_certificate);
-                    break;
-                case OSU_FAILURE_ADD_PASSPOINT_CONFIGURATION:
-                    mOsuFailure = mContext.getString(
-                            R.string.osu_failure_add_passpoint_configuration);
-                    break;
-                case OSU_FAILURE_OSU_PROVIDER_NOT_FOUND:
-                    mOsuFailure = mContext.getString(R.string.osu_failure_osu_provider_not_found);
-                    break;
+            if (TextUtils.equals(mOsuStatus, mContext.getString(R.string.osu_completing_sign_up))) {
+                mOsuFailure = mContext.getString(R.string.osu_sign_up_failed);
+            } else {
+                mOsuFailure = mContext.getString(R.string.osu_connect_failed);
             }
             mOsuStatus = null;
             mOsuProvisioningComplete = false;
@@ -1625,50 +1555,37 @@
 
         @Override
         @MainThread public void onProvisioningStatus(int status) {
+            String newStatus = null;
             switch (status) {
                 case OSU_STATUS_AP_CONNECTING:
-                    mOsuStatus = mContext.getString(R.string.osu_status_ap_connecting);
-                    break;
                 case OSU_STATUS_AP_CONNECTED:
-                    mOsuStatus = mContext.getString(R.string.osu_status_ap_connected);
-                    break;
                 case OSU_STATUS_SERVER_CONNECTING:
-                    mOsuStatus = mContext.getString(R.string.osu_status_server_connecting);
-                    break;
                 case OSU_STATUS_SERVER_VALIDATED:
-                    mOsuStatus = mContext.getString(R.string.osu_status_server_validated);
-                    break;
                 case OSU_STATUS_SERVER_CONNECTED:
-                    mOsuStatus = mContext.getString(R.string.osu_status_server_connected);
-                    break;
                 case OSU_STATUS_INIT_SOAP_EXCHANGE:
-                    mOsuStatus = mContext.getString(R.string.osu_status_init_soap_exchange);
-                    break;
                 case OSU_STATUS_WAITING_FOR_REDIRECT_RESPONSE:
-                    mOsuStatus = mContext.getString(
-                            R.string.osu_status_waiting_for_redirect_response);
+                    newStatus = String.format(mContext.getString(R.string.osu_opening_provider),
+                            mOsuProvider.getFriendlyName());
                     break;
                 case OSU_STATUS_REDIRECT_RESPONSE_RECEIVED:
-                    mOsuStatus = mContext.getString(R.string.osu_status_redirect_response_received);
-                    break;
                 case OSU_STATUS_SECOND_SOAP_EXCHANGE:
-                    mOsuStatus = mContext.getString(R.string.osu_status_second_soap_exchange);
-                    break;
                 case OSU_STATUS_THIRD_SOAP_EXCHANGE:
-                    mOsuStatus = mContext.getString(R.string.osu_status_third_soap_exchange);
-                    break;
                 case OSU_STATUS_RETRIEVING_TRUST_ROOT_CERTS:
-                    mOsuStatus = mContext.getString(
-                            R.string.osu_status_retrieving_trust_root_certs);
+                    newStatus = mContext.getString(
+                            R.string.osu_completing_sign_up);
                     break;
             }
+            boolean updated = !TextUtils.equals(mOsuStatus, newStatus);
+            mOsuStatus = newStatus;
             mOsuFailure = null;
             mOsuProvisioningComplete = false;
-            ThreadUtils.postOnMainThread(() -> {
-                if (mAccessPointListener != null) {
-                    mAccessPointListener.onAccessPointChanged(AccessPoint.this);
-                }
-            });
+            if (updated) {
+                ThreadUtils.postOnMainThread(() -> {
+                    if (mAccessPointListener != null) {
+                        mAccessPointListener.onAccessPointChanged(AccessPoint.this);
+                    }
+                });
+            }
         }
 
         @Override
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java b/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java
index afea5d2..17a73ac 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java
@@ -72,9 +72,13 @@
     public AccessPoint build() {
         Bundle bundle = new Bundle();
 
-        WifiConfiguration wifiConfig = new WifiConfiguration();
-        wifiConfig.networkId = mNetworkId;
-        wifiConfig.BSSID = mBssid;
+        WifiConfiguration wifiConfig = null;
+        // ephemeral networks don't have a WifiConfiguration object in AccessPoint representation.
+        if (mNetworkId != WifiConfiguration.INVALID_NETWORK_ID) {
+            wifiConfig = new WifiConfiguration();
+            wifiConfig.networkId = mNetworkId;
+            wifiConfig.BSSID = mBssid;
+        }
 
         bundle.putString(AccessPoint.KEY_SSID, ssid);
         bundle.putParcelable(AccessPoint.KEY_CONFIG, wifiConfig);
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/drawable/UserIconDrawableTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/drawable/UserIconDrawableTest.java
index a436cb5..cf7bcb2 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/drawable/UserIconDrawableTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/drawable/UserIconDrawableTest.java
@@ -31,8 +31,6 @@
 import androidx.test.InstrumentationRegistry;
 import androidx.test.runner.AndroidJUnit4;
 
-import com.android.settingslib.R;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -45,7 +43,7 @@
     public void getConstantState_shouldNotBeNull() {
         final Bitmap b = BitmapFactory.decodeResource(
                 InstrumentationRegistry.getTargetContext().getResources(),
-                R.drawable.ic_mode_edit);
+                com.android.internal.R.drawable.ic_mode_edit);
         mDrawable = new UserIconDrawable(100 /* size */).setIcon(b).bake();
         assertThat(mDrawable.getConstantState()).isNotNull();
     }
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
index fc3034e..5e3472b 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
@@ -19,6 +19,7 @@
 import static com.google.common.truth.Truth.assertWithMessage;
 
 import static org.junit.Assert.fail;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.anyInt;
 import static org.mockito.Mockito.mock;
@@ -26,6 +27,9 @@
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
 import android.net.NetworkKey;
@@ -483,6 +487,45 @@
     }
 
     @Test
+    public void testSummaryString_showsConnectedViaSuggestionOrSpecifierApp() throws Exception {
+        final int rssi = -55;
+        final String appPackageName = "com.test.app";
+        final CharSequence appLabel = "Test App";
+        final String connectedViaAppResourceString = "Connected via ";
+
+        WifiInfo wifiInfo = new WifiInfo();
+        wifiInfo.setSSID(WifiSsid.createFromAsciiEncoded(TEST_SSID));
+        wifiInfo.setEphemeral(true);
+        wifiInfo.setNetworkSuggestionOrSpecifierPackageName(appPackageName);
+        wifiInfo.setRssi(rssi);
+
+        Context context = mock(Context.class);
+        Resources resources = mock(Resources.class);
+        PackageManager packageManager = mock(PackageManager.class);
+        ApplicationInfo applicationInfo = mock(ApplicationInfo.class);
+        when(context.getPackageManager()).thenReturn(packageManager);
+        when(context.getResources()).thenReturn(resources);
+        when(resources.getString(R.string.connected_via_app, appLabel))
+                .thenReturn(connectedViaAppResourceString + appLabel.toString());
+        when(packageManager.getApplicationInfoAsUser(eq(appPackageName), anyInt(), anyInt()))
+                .thenReturn(applicationInfo);
+        when(applicationInfo.loadLabel(packageManager)).thenReturn(appLabel);
+
+        NetworkInfo networkInfo =
+                new NetworkInfo(ConnectivityManager.TYPE_WIFI, 0 /* subtype */, "WIFI", "");
+        networkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, "", "");
+
+        AccessPoint ap = new TestAccessPointBuilder(context)
+                .setSsid(TEST_SSID)
+                .setNetworkInfo(networkInfo)
+                .setRssi(rssi)
+                .setSecurity(AccessPoint.SECURITY_NONE)
+                .setWifiInfo(wifiInfo)
+                .build();
+        assertThat(ap.getSummary()).isEqualTo("Connected via Test App");
+    }
+
+    @Test
     public void testSetScanResultWithCarrierInfo() {
         String ssid = "ssid";
         AccessPoint ap = new TestAccessPointBuilder(mContext).setSsid(ssid).build();
diff --git a/packages/SettingsLib/tests/robotests/res/drawable/ic_info_outline_24dp.xml b/packages/SettingsLib/tests/robotests/res/drawable/ic_info_outline_24dp.xml
deleted file mode 100644
index 3fe1e9e..0000000
--- a/packages/SettingsLib/tests/robotests/res/drawable/ic_info_outline_24dp.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2016 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
-        android:tint="?android:attr/textColorSecondary">
-    <path
-        android:fillColor="#000000"
-        android:pathData="M11,17h2v-6h-2v6zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM11,9h2L13,7h-2v2z"/>
-</vector>
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java
index 92ebe44..4d76e44 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java
@@ -38,7 +38,6 @@
 import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.provider.Settings;
-import android.provider.Settings.Secure;
 import android.telephony.ServiceState;
 import android.text.TextUtils;
 
@@ -86,25 +85,6 @@
     }
 
     @Test
-    public void testUpdateLocationMode_sendBroadcast() {
-        int currentUserId = ActivityManager.getCurrentUser();
-        Utils.updateLocationMode(
-                mContext,
-                Secure.LOCATION_MODE_OFF,
-                Secure.LOCATION_MODE_HIGH_ACCURACY,
-                currentUserId,
-                Settings.Secure.LOCATION_CHANGER_QUICK_SETTINGS);
-
-        verify(mContext).sendBroadcastAsUser(
-                argThat(actionMatches(LocationManager.MODE_CHANGING_ACTION)),
-                ArgumentMatchers.eq(UserHandle.of(currentUserId)),
-                ArgumentMatchers.eq(WRITE_SECURE_SETTINGS));
-        assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
-                Settings.Secure.LOCATION_CHANGER, Settings.Secure.LOCATION_CHANGER_UNKNOWN))
-                .isEqualTo(Settings.Secure.LOCATION_CHANGER_QUICK_SETTINGS);
-    }
-
-    @Test
     public void testUpdateLocationEnabled_sendBroadcast() {
         int currentUserId = ActivityManager.getCurrentUser();
         Utils.updateLocationEnabled(mContext, true, currentUserId,
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothUtilsTest.java
index 0eb6de9..7a71551 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothUtilsTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothUtilsTest.java
@@ -20,7 +20,6 @@
 import android.bluetooth.BluetoothDevice;
 import android.graphics.drawable.Drawable;
 
-import com.android.settingslib.R;
 import com.android.settingslib.graph.BluetoothDeviceLayerDrawable;
 
 import org.junit.Test;
@@ -34,7 +33,7 @@
     @Test
     public void testGetBluetoothDrawable_noBatteryLevel_returnSimpleDrawable() {
         final Drawable drawable = BluetoothUtils.getBluetoothDrawable(
-                RuntimeEnvironment.application, R.drawable.ic_bt_laptop,
+                RuntimeEnvironment.application, com.android.internal.R.drawable.ic_bt_laptop,
                 BluetoothDevice.BATTERY_LEVEL_UNKNOWN, 1 /* iconScale */);
 
         assertThat(drawable).isNotInstanceOf(BluetoothDeviceLayerDrawable.class);
@@ -43,7 +42,7 @@
     @Test
     public void testGetBluetoothDrawable_hasBatteryLevel_returnLayerDrawable() {
         final Drawable drawable = BluetoothUtils.getBluetoothDrawable(
-                RuntimeEnvironment.application, R.drawable.ic_bt_laptop,
+                RuntimeEnvironment.application, com.android.internal.R.drawable.ic_bt_laptop,
                 10 /* batteryLevel */, 1 /* iconScale */);
 
         assertThat(drawable).isInstanceOf(BluetoothDeviceLayerDrawable.class);
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileTest.java
index b77670b..491f32d 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileTest.java
@@ -12,8 +12,6 @@
 import android.content.pm.ActivityInfo;
 import android.os.Bundle;
 
-import com.android.settingslib.R;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -31,7 +29,7 @@
         mActivityInfo = new ActivityInfo();
         mActivityInfo.packageName = RuntimeEnvironment.application.getPackageName();
         mActivityInfo.name = "abc";
-        mActivityInfo.icon = R.drawable.ic_plus;
+        mActivityInfo.icon = com.android.internal.R.drawable.ic_plus;
         mActivityInfo.metaData = new Bundle();
         mTile = new Tile(mActivityInfo, "category");
     }
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileUtilsTest.java
index bbb4249..c892711 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileUtilsTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileUtilsTest.java
@@ -53,8 +53,6 @@
 import android.util.ArrayMap;
 import android.util.Pair;
 
-import com.android.settingslib.R;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -255,7 +253,7 @@
 
         resolveInfo.activityInfo.metaData = new Bundle(oldMetadata);
         resolveInfo.activityInfo.metaData.putInt(META_DATA_PREFERENCE_ICON,
-                R.drawable.ic_bt_cellphone);
+                com.android.internal.R.drawable.ic_phone);
         outTiles.clear();
         TileUtils.getTilesForAction(mContext, UserHandle.CURRENT, IA_SETTINGS_ACTION, addedCache,
                 null /* defaultCategory */, outTiles, false /* usePriority */);
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/graph/BluetoothDeviceLayerDrawableTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/graph/BluetoothDeviceLayerDrawableTest.java
index 1b350cc..2113d47 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/graph/BluetoothDeviceLayerDrawableTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/graph/BluetoothDeviceLayerDrawableTest.java
@@ -31,7 +31,7 @@
 
 @RunWith(RobolectricTestRunner.class)
 public class BluetoothDeviceLayerDrawableTest {
-    private static final int RES_ID = R.drawable.ic_bt_cellphone;
+    private static final int RES_ID = com.android.internal.R.drawable.ic_phone;
     private static final int BATTERY_LEVEL = 15;
     private static final float BATTERY_ICON_SCALE = 0.75f;
     private static final int BATTERY_ICON_PADDING_TOP = 6;
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/ActionBarShadowControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/ActionBarShadowControllerTest.java
new file mode 100644
index 0000000..4e00ab5
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/ActionBarShadowControllerTest.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.widget;
+
+import static androidx.lifecycle.Lifecycle.Event.ON_START;
+import static androidx.lifecycle.Lifecycle.Event.ON_STOP;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.isNull;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.ActionBar;
+import android.app.Activity;
+import android.view.View;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public class ActionBarShadowControllerTest {
+
+    @Mock
+    private RecyclerView mRecyclerView;
+    @Mock
+    private View mScrollView;
+    @Mock
+    private Activity mActivity;
+    @Mock
+    private ActionBar mActionBar;
+    private Lifecycle mLifecycle;
+    private LifecycleOwner mLifecycleOwner;
+    private View mView;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        when(mActivity.getActionBar()).thenReturn(mActionBar);
+        mView = new View(RuntimeEnvironment.application);
+        mLifecycleOwner = () -> mLifecycle;
+        mLifecycle = new Lifecycle(mLifecycleOwner);
+    }
+
+    @Test
+    public void attachToView_shouldAddScrollWatcherAndUpdateActionBar() {
+        when(mRecyclerView.canScrollVertically(-1)).thenReturn(false);
+
+        ActionBarShadowController.attachToView(mActivity, mLifecycle, mRecyclerView);
+
+        verify(mActionBar).setElevation(ActionBarShadowController.ELEVATION_LOW);
+    }
+
+    @Test
+    public void attachToView_scrollView_shouldAddScrollWatcherAndUpdateActionBar() {
+        when(mScrollView.canScrollVertically(-1)).thenReturn(false);
+
+        ActionBarShadowController.attachToView(mActivity, mLifecycle, mScrollView);
+
+        verify(mActionBar).setElevation(ActionBarShadowController.ELEVATION_LOW);
+    }
+
+    @Test
+    public void attachToView_customViewAsActionBar_shouldUpdateElevationOnScroll() {
+        // Setup
+        mView.setElevation(50);
+        when(mRecyclerView.canScrollVertically(-1)).thenReturn(false);
+        final ActionBarShadowController controller =
+                ActionBarShadowController.attachToView(mView, mLifecycle, mRecyclerView);
+        assertThat(mView.getElevation()).isEqualTo(ActionBarShadowController.ELEVATION_LOW);
+
+        // Scroll
+        when(mRecyclerView.canScrollVertically(-1)).thenReturn(true);
+        controller.mScrollChangeWatcher.onScrollChange(mRecyclerView, 10, 10, 0, 0);
+        assertThat(mView.getElevation()).isEqualTo(ActionBarShadowController.ELEVATION_HIGH);
+    }
+
+    @Test
+    public void attachToView_lifecycleChange_shouldAttachDetach() {
+        ActionBarShadowController.attachToView(mActivity, mLifecycle, mRecyclerView);
+
+        verify(mRecyclerView).setOnScrollChangeListener(any());
+
+        mLifecycle.handleLifecycleEvent(ON_START);
+        mLifecycle.handleLifecycleEvent(ON_STOP);
+        verify(mRecyclerView).setOnScrollChangeListener(isNull());
+
+        mLifecycle.handleLifecycleEvent(ON_START);
+        verify(mRecyclerView, times(3)).setOnScrollChangeListener(any());
+    }
+
+    @Test
+    public void onScrolled_nullAnchorViewAndActivity_shouldNotCrash() {
+        final Activity activity = null;
+        final ActionBarShadowController controller =
+                ActionBarShadowController.attachToView(activity, mLifecycle, mRecyclerView);
+
+        // Scroll
+        controller.mScrollChangeWatcher.onScrollChange(mRecyclerView, 10, 10, 0, 0);
+        // no crash
+    }
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/ActionButtonsPreferenceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/ActionButtonsPreferenceTest.java
index 97de7ef..e24b525 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/ActionButtonsPreferenceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/ActionButtonsPreferenceTest.java
@@ -74,10 +74,10 @@
 
     @Test
     public void onBindViewHolder_setIcon_shouldShowButtonByDefault() {
-        mPref.setButton1Icon(R.drawable.ic_plus);
-        mPref.setButton2Icon(R.drawable.ic_plus);
-        mPref.setButton3Icon(R.drawable.ic_plus);
-        mPref.setButton4Icon(R.drawable.ic_plus);
+        mPref.setButton1Icon(com.android.internal.R.drawable.ic_plus);
+        mPref.setButton2Icon(com.android.internal.R.drawable.ic_plus);
+        mPref.setButton3Icon(com.android.internal.R.drawable.ic_plus);
+        mPref.setButton4Icon(com.android.internal.R.drawable.ic_plus);
 
         mPref.onBindViewHolder(mHolder);
 
@@ -126,10 +126,10 @@
 
     @Test
     public void onBindViewHolder_setVisibleIsGoneAndSetIcon_shouldNotShowButton() {
-        mPref.setButton1Icon(R.drawable.ic_plus).setButton1Visible(false);
-        mPref.setButton2Icon(R.drawable.ic_plus).setButton2Visible(false);
-        mPref.setButton3Icon(R.drawable.ic_plus).setButton3Visible(false);
-        mPref.setButton4Icon(R.drawable.ic_plus).setButton4Visible(false);
+        mPref.setButton1Icon(com.android.internal.R.drawable.ic_plus).setButton1Visible(false);
+        mPref.setButton2Icon(com.android.internal.R.drawable.ic_plus).setButton2Visible(false);
+        mPref.setButton3Icon(com.android.internal.R.drawable.ic_plus).setButton3Visible(false);
+        mPref.setButton4Icon(com.android.internal.R.drawable.ic_plus).setButton4Visible(false);
 
         mPref.onBindViewHolder(mHolder);
 
@@ -215,7 +215,7 @@
     @Test
     public void onBindViewHolder_setButtonIcon_iconMustDisplayAboveText() {
         mPref.setButton1Text(R.string.install_other_apps);
-        mPref.setButton1Icon(R.drawable.ic_plus);
+        mPref.setButton1Icon(com.android.internal.R.drawable.ic_plus);
 
         mPref.onBindViewHolder(mHolder);
         final Drawable[] drawablesAroundText =
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/AppEntitiesHeaderControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/AppEntitiesHeaderControllerTest.java
index 4c68c14..63a958e 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/AppEntitiesHeaderControllerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/AppEntitiesHeaderControllerTest.java
@@ -54,7 +54,7 @@
         mController = AppEntitiesHeaderController.newInstance(mContext,
                 mAppEntitiesHeaderView);
         mAppEntityInfo = new AppEntityInfo.Builder()
-                .setIcon(mContext.getDrawable(R.drawable.ic_menu))
+                .setIcon(mContext.getDrawable(com.android.internal.R.drawable.ic_menu))
                 .setTitle(TITLE)
                 .setSummary(SUMMARY)
                 .setOnClickListener(v -> {
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/BarChartPreferenceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/BarChartPreferenceTest.java
index cf6137d..c3ea336 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/BarChartPreferenceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/BarChartPreferenceTest.java
@@ -58,7 +58,7 @@
         mHolder = PreferenceViewHolder.createInstanceForTests(mBarChartView);
         mPreference = new BarChartPreference(mContext, null /* attrs */);
 
-        mIcon = mContext.getDrawable(R.drawable.ic_menu);
+        mIcon = mContext.getDrawable(com.android.internal.R.drawable.ic_menu);
         mBarView1 = mBarChartView.findViewById(R.id.bar_view1);
         mBarView2 = mBarChartView.findViewById(R.id.bar_view2);
         mBarView3 = mBarChartView.findViewById(R.id.bar_view3);
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index a1aefab..479c964 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -422,12 +422,6 @@
                 Settings.Global.CONTACTS_DATABASE_WAL_ENABLED,
                 GlobalSettingsProto.CONTACTS_DATABASE_WAL_ENABLED);
 
-        final long contentCaptureToken = p.start(GlobalSettingsProto.CONTENT_CAPTURE);
-        dumpSetting(s, p,
-                Settings.Global.CONTENT_CAPTURE_SERVICE_EXPLICITLY_ENABLED,
-                GlobalSettingsProto.ContentCapture.SERVICE_EXPLICITLY_ENABLED);
-        p.end(contentCaptureToken);
-
         final long dataToken = p.start(GlobalSettingsProto.DATA);
         // Settings.Global.DEFAULT_RESTRICT_BACKGROUND_DATA intentionally excluded.
         dumpSetting(s, p,
@@ -707,17 +701,17 @@
                 Settings.Global.GPU_DEBUG_LAYERS_GLES,
                 GlobalSettingsProto.Gpu.DEBUG_LAYERS_GLES);
         dumpSetting(s, p,
-                Settings.Global.GUP_DEV_ALL_APPS,
-                GlobalSettingsProto.Gpu.GUP_DEV_ALL_APPS);
+                Settings.Global.GAME_DRIVER_ALL_APPS,
+                GlobalSettingsProto.Gpu.GAME_DRIVER_ALL_APPS);
         dumpSetting(s, p,
-                Settings.Global.GUP_DEV_OPT_IN_APPS,
-                GlobalSettingsProto.Gpu.GUP_DEV_OPT_IN_APPS);
+                Settings.Global.GAME_DRIVER_OPT_IN_APPS,
+                GlobalSettingsProto.Gpu.GAME_DRIVER_OPT_IN_APPS);
         dumpSetting(s, p,
-                Settings.Global.GUP_DEV_OPT_OUT_APPS,
-                GlobalSettingsProto.Gpu.GUP_DEV_OPT_OUT_APPS);
+                Settings.Global.GAME_DRIVER_OPT_OUT_APPS,
+                GlobalSettingsProto.Gpu.GAME_DRIVER_OPT_OUT_APPS);
         dumpSetting(s, p,
-                Settings.Global.GUP_BLACKLIST,
-                GlobalSettingsProto.Gpu.GUP_BLACKLIST);
+                Settings.Global.GAME_DRIVER_BLACKLIST,
+                GlobalSettingsProto.Gpu.GAME_DRIVER_BLACKLIST);
         dumpSetting(s, p,
                 Settings.Global.GAME_DRIVER_WHITELIST,
                 GlobalSettingsProto.Gpu.GAME_DRIVER_WHITELIST);
@@ -1517,9 +1511,6 @@
                 Settings.Global.WIFI_VERBOSE_LOGGING_ENABLED,
                 GlobalSettingsProto.Wifi.VERBOSE_LOGGING_ENABLED);
         dumpSetting(s, p,
-                Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED,
-                GlobalSettingsProto.Wifi.CONNECTED_MAC_RANDOMIZATION_ENABLED);
-        dumpSetting(s, p,
                 Settings.Global.WIFI_MAX_DHCP_RETRY_COUNT,
                 GlobalSettingsProto.Wifi.MAX_DHCP_RETRY_COUNT);
         dumpSetting(s, p,
@@ -2721,6 +2712,9 @@
         dumpSetting(s, p,
                 Settings.System.MUTE_STREAMS_AFFECTED,
                 SystemSettingsProto.Volume.MUTE_STREAMS_AFFECTED);
+        dumpSetting(s, p,
+                Settings.System.MASTER_BALANCE,
+                SystemSettingsProto.Volume.MASTER_BALANCE);
         p.end(volumeToken);
 
         dumpSetting(s, p,
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index 4453121..23e5f0e 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -4231,7 +4231,7 @@
 
                         String defLocationMode = Integer.toString(
                                 !TextUtils.isEmpty(locationProvidersAllowed.getValue())
-                                        ? Secure.LOCATION_MODE_HIGH_ACCURACY
+                                        ? Secure.LOCATION_MODE_ON
                                         : Secure.LOCATION_MODE_OFF);
                         secureSettings.insertSettingLocked(
                                 Secure.LOCATION_MODE, defLocationMode,
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index c3c3f25..c032683 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -145,6 +145,7 @@
     <uses-permission android:name="android.permission.SET_TIME_ZONE" />
     <uses-permission android:name="android.permission.DISABLE_HIDDEN_API_CHECKS" />
     <uses-permission android:name="android.permission.MANAGE_ROLE_HOLDERS" />
+    <uses-permission android:name="android.permission.STATUS_BAR_SERVICE" />
     <!-- Permission needed to rename bugreport notifications (so they're not shown as Shell) -->
     <uses-permission android:name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME" />
     <!-- Permission needed to hold a wakelock in dumpstate.cpp (drop_root_user()) -->
diff --git a/packages/Shell/res/values-da/strings.xml b/packages/Shell/res/values-da/strings.xml
index c8d40f5..d9bf877 100644
--- a/packages/Shell/res/values-da/strings.xml
+++ b/packages/Shell/res/values-da/strings.xml
@@ -34,11 +34,11 @@
     <string name="bugreport_unreadable_text" msgid="586517851044535486">"Fejlrapportfilen kunne ikke læses"</string>
     <string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"Oplysningerne i fejlrapporten kunne ikke føjes til zip-filen"</string>
     <string name="bugreport_unnamed" msgid="2800582406842092709">"ikke navngivet"</string>
-    <string name="bugreport_info_action" msgid="2158204228510576227">"Oplysninger"</string>
+    <string name="bugreport_info_action" msgid="2158204228510576227">"Info"</string>
     <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Screenshot"</string>
     <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"Der blev taget et screenshot."</string>
     <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Der kunne ikke tages et screenshot."</string>
-    <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Oplysninger om fejlrapporten <xliff:g id="ID">#%d</xliff:g>"</string>
+    <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Info om fejlrapporten <xliff:g id="ID">#%d</xliff:g>"</string>
     <string name="bugreport_info_name" msgid="4414036021935139527">"Filnavn"</string>
     <string name="bugreport_info_title" msgid="2306030793918239804">"Fejlrapportens titel"</string>
     <string name="bugreport_info_description" msgid="5072835127481627722">"Oversigt over fejl"</string>
diff --git a/packages/Shell/res/values-kn/strings.xml b/packages/Shell/res/values-kn/strings.xml
index d0cfaae..a6f61ed 100644
--- a/packages/Shell/res/values-kn/strings.xml
+++ b/packages/Shell/res/values-kn/strings.xml
@@ -42,6 +42,6 @@
     <string name="bugreport_info_name" msgid="4414036021935139527">"ಫೈಲ್‌ಹೆಸರು"</string>
     <string name="bugreport_info_title" msgid="2306030793918239804">"ಬಗ್ ಶೀರ್ಷಿಕೆ"</string>
     <string name="bugreport_info_description" msgid="5072835127481627722">"ಬಗ್ ಸಾರಾಂಶ"</string>
-    <string name="save" msgid="4781509040564835759">"ಉಳಿಸು"</string>
+    <string name="save" msgid="4781509040564835759">"ಉಳಿಸಿ"</string>
     <string name="bugreport_intent_chooser_title" msgid="7605709494790894076">"ಬಗ್ ವರದಿಯನ್ನು ಹಂಚು"</string>
 </resources>
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 3453e79..815ae9a 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -22,6 +22,11 @@
         android:sharedUserId="android.uid.systemui"
         coreApp="true">
 
+    <!-- Using OpenGL ES 2.0 -->
+    <uses-feature
+        android:glEsVersion="0x00020000"
+        android:required="true" />
+
     <!-- SysUI must be the one to define this permission; its name is
          referenced by the core OS. -->
     <permission android:name="android.permission.systemui.IDENTITY"
@@ -593,11 +598,6 @@
                 android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation|keyboard|keyboardHidden"
                 android:process=":ui"
                 android:visibleToInstantApps="true">
-            <intent-filter>
-                <action android:name="android.intent.action.CHOOSER_UI" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <category android:name="android.intent.category.VOICE" />
-            </intent-filter>
         </activity>
 
         <!-- Doze with notifications, run in main sysui process for every user  -->
diff --git a/packages/SystemUI/OWNERS b/packages/SystemUI/OWNERS
index 2f6e32b..e7e2c1a 100644
--- a/packages/SystemUI/OWNERS
+++ b/packages/SystemUI/OWNERS
@@ -1,6 +1,6 @@
 set noparent
 
-dsandler@google.com
+dsandler@android.com
 
 adamcohen@google.com
 asc@google.com
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/ActivityStarter.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/ActivityStarter.java
index 5317a6d..66d5d11 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/ActivityStarter.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/ActivityStarter.java
@@ -27,7 +27,7 @@
  */
 @ProvidesInterface(version = ActivityStarter.VERSION)
 public interface ActivityStarter {
-    int VERSION = 1;
+    int VERSION = 2;
 
     void startPendingIntentDismissingKeyguard(PendingIntent intent);
 
@@ -37,6 +37,11 @@
      */
     void startPendingIntentDismissingKeyguard(PendingIntent intent,
             Runnable intentSentUiThreadCallback);
+
+    /**
+     * The intent flag can be specified in startActivity().
+     */
+    void startActivity(Intent intent, boolean onlyProvisioned, boolean dismissShade, int flags);
     void startActivity(Intent intent, boolean dismissShade);
     void startActivity(Intent intent, boolean onlyProvisioned, boolean dismissShade);
     void startActivity(Intent intent, boolean dismissShade, Callback callback);
diff --git a/packages/SystemUI/res-keyguard/values-af/strings.xml b/packages/SystemUI/res-keyguard/values-af/strings.xml
index 4e2937a..55c822b 100644
--- a/packages/SystemUI/res-keyguard/values-af/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-af/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">SIM is nou gedeaktiveer. Voer PUK-kode in om voort te gaan. Jy het <xliff:g id="_NUMBER_1">%d</xliff:g> pogings oor voordat die SIM permanent onbruikbaar word. Kontak die diensverskaffer vir besonderhede.</item>
       <item quantity="one">SIM is nou gedeaktiveer. Voer PUK-kode in om voort te gaan. Jy het <xliff:g id="_NUMBER_0">%d</xliff:g> poging oor voordat die SIM permanent onbruikbaar word. Kontak die diensverskaffer vir besonderhede.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-am/strings.xml b/packages/SystemUI/res-keyguard/values-am/strings.xml
index b64e0cf..2632db4 100644
--- a/packages/SystemUI/res-keyguard/values-am/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-am/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="one">ሲም አሁን ተሰናክሏል። ለመቀጠል የPUK ኮድ ያስገቡ። ሲም እስከመጨረሻው መጠቀም የማይቻል ከመሆኑ በፊት <xliff:g id="_NUMBER_1">%d</xliff:g> ሙከራዎች ይቀረዎታል። ዝርዝሮችን ለማግኘት የአገልግሎት አቅራቢን ያነጋግሩ።</item>
       <item quantity="other">ሲም አሁን ተሰናክሏል። ለመቀጠል የPUK ኮድ ያስገቡ። ሲም እስከመጨረሻው መጠቀም የማይቻል ከመሆኑ በፊት <xliff:g id="_NUMBER_1">%d</xliff:g> ሙከራዎች ይቀረዎታል። ዝርዝሮችን ለማግኘት የአገልግሎት አቅራቢን ያነጋግሩ።</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-ar/strings.xml b/packages/SystemUI/res-keyguard/values-ar/strings.xml
index af958e5..9149d7e 100644
--- a/packages/SystemUI/res-keyguard/values-ar/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ar/strings.xml
@@ -182,4 +182,78 @@
       <item quantity="other">‏تم إيقاف شريحة SIM الآن. أدخل رمز PUK للمتابعة، وتتبقى لديك <xliff:g id="_NUMBER_1">%d</xliff:g> محاولة قبل أن تصبح شريحة SIM غير صالحة للاستخدام نهائيًا. ويمكنك الاتصال بمشغل شبكة الجوّال لمعرفة التفاصيل.</item>
       <item quantity="one">‏تم إيقاف شريحة SIM الآن. أدخل رمز PUK للمتابعة، وتتبقى لديك محاولة واحدة (<xliff:g id="_NUMBER_0">%d</xliff:g>) قبل أن تصبح شريحة SIM غير صالحة للاستخدام نهائيًا. ويمكنك الاتصال بمشغل شبكة الجوّال لمعرفة التفاصيل.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-as/strings.xml b/packages/SystemUI/res-keyguard/values-as/strings.xml
index 258219a..0a6b896 100644
--- a/packages/SystemUI/res-keyguard/values-as/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-as/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="one">ছিমখন অক্ষম হ’ল। অব্যাহত ৰাখিবলৈ PUK দিয়ক। ছিমখন স্থায়ীভাৱে ব্যৱহাৰৰ অনুপযোগী হোৱাৰ পূৰ্বে আপোনাৰ হাতত <xliff:g id="_NUMBER_1">%d</xliff:g>টা প্ৰয়াস বাকী আছে। সবিশেষ জানিবলৈ বাহকৰ সৈতে যোগাযোগ কৰক।</item>
       <item quantity="other">ছিমখন অক্ষম হ’ল। অব্যাহত ৰাখিবলৈ PUK দিয়ক। ছিমখন স্থায়ীভাৱে ব্যৱহাৰৰ অনুপযোগী হোৱাৰ পূৰ্বে আপোনাৰ হাতত <xliff:g id="_NUMBER_1">%d</xliff:g>টা প্ৰয়াস বাকী আছে। সবিশেষ জানিবলৈ বাহকৰ সৈতে যোগাযোগ কৰক।</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-az/strings.xml b/packages/SystemUI/res-keyguard/values-az/strings.xml
index 1867186..8e6df65 100644
--- a/packages/SystemUI/res-keyguard/values-az/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-az/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">SIM indi deaktivdir. Davam etmək üçün PUK kodunu daxil edin. SIM birdəfəlik yararsız olmadan öncə <xliff:g id="_NUMBER_1">%d</xliff:g> cəhdiniz qalır. Ətraflı məlumat üçün operatorla əlaqə saxlayın.</item>
       <item quantity="one">SIM indi deaktivdir. Davam etmək üçün PUK kodunu daxil edin. SIM birdəfəlik yararsız olmadan öncə <xliff:g id="_NUMBER_0">%d</xliff:g> cəhdiniz qalır. Ətraflı məlumat üçün operatorla əlaqə saxlayın.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
index ef0e1ce..ca32751a 100644
--- a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
@@ -158,4 +158,78 @@
       <item quantity="few">SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja pre nego što SIM postane trajno neupotrebljiv. Detaljne informacije potražite od mobilnog operatera.</item>
       <item quantity="other">SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja pre nego što SIM postane trajno neupotrebljiv. Detaljne informacije potražite od mobilnog operatera.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-be/strings.xml b/packages/SystemUI/res-keyguard/values-be/strings.xml
index 873a87b..2048869 100644
--- a/packages/SystemUI/res-keyguard/values-be/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-be/strings.xml
@@ -166,4 +166,78 @@
       <item quantity="many">SIM-карта заблакіравана. Каб працягнуць, увядзіце PUK-код. У вас ёсць яшчэ <xliff:g id="_NUMBER_1">%d</xliff:g> спроб, пасля чаго SIM-карта будзе заблакіравана назаўсёды. Звярніцеся да аператара, каб даведацца больш.</item>
       <item quantity="other">SIM-карта заблакіравана. Каб працягнуць, увядзіце PUK-код. У вас ёсць яшчэ <xliff:g id="_NUMBER_1">%d</xliff:g> спробы, пасля чаго SIM-карта будзе заблакіравана назаўсёды. Звярніцеся да аператара, каб даведацца больш.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-bg/strings.xml b/packages/SystemUI/res-keyguard/values-bg/strings.xml
index 3725a5e..362fc51 100644
--- a/packages/SystemUI/res-keyguard/values-bg/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bg/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">SIM картата вече е деактивирана. Въведете PUK кода, за да продължите. Остават ви <xliff:g id="_NUMBER_1">%d</xliff:g> опита, преди SIM картата да стане неизползваема завинаги. Свържете се с оператора за подробности.</item>
       <item quantity="one">SIM картата вече е деактивирана. Въведете PUK кода, за да продължите. Остава ви <xliff:g id="_NUMBER_0">%d</xliff:g> опит, преди SIM картата да стане неизползваема завинаги. Свържете се с оператора за подробности.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-bn/strings.xml b/packages/SystemUI/res-keyguard/values-bn/strings.xml
index ff925f8..e3f0f65 100644
--- a/packages/SystemUI/res-keyguard/values-bn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bn/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="one">সিম অক্ষম করা হয়েছে। চালিয়ে যেতে PUK কোড লিখুন। আপনি আর <xliff:g id="_NUMBER_1">%d</xliff:g> বার চেষ্টা করতে পারবেন, তারপরে এই সিমটি আর একেবারেই ব্যবহার করা যাবে না। বিশদে জানতে পরিষেবা প্রদানকারীর সাথে যোগাযোগ করুন।</item>
       <item quantity="other">সিম অক্ষম করা হয়েছে। চালিয়ে যেতে PUK কোড লিখুন। আপনি আর <xliff:g id="_NUMBER_1">%d</xliff:g> বার চেষ্টা করতে পারবেন, তারপরে এই সিমটি আর একেবারেই ব্যবহার করা যাবে না। বিশদে জানতে পরিষেবা প্রদানকারীর সাথে যোগাযোগ করুন।</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-bs/strings.xml b/packages/SystemUI/res-keyguard/values-bs/strings.xml
index 1106807..042c11e 100644
--- a/packages/SystemUI/res-keyguard/values-bs/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bs/strings.xml
@@ -158,4 +158,78 @@
       <item quantity="few">SIM kartica je onemogućena. Unesite PUK kôd da nastavite. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. Za više informacija kontaktirajte mobilnog operatera.</item>
       <item quantity="other">SIM kartica je onemogućena. Unesite PUK kôd da nastavite. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. Za više informacija kontaktirajte mobilnog operatera.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-ca/strings.xml b/packages/SystemUI/res-keyguard/values-ca/strings.xml
index 3a734b1..f6ca03c 100644
--- a/packages/SystemUI/res-keyguard/values-ca/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ca/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">La targeta SIM s\'ha desactivat. Introdueix el codi PUK per continuar. Et queden <xliff:g id="_NUMBER_1">%d</xliff:g> intents; si no l\'encertes, la SIM no es podrà tornar a fer servir. Contacta amb l\'operador de telefonia mòbil per obtenir-ne més informació.</item>
       <item quantity="one">La targeta SIM s\'ha desactivat. Introdueix el codi PUK per continuar. Et queda <xliff:g id="_NUMBER_0">%d</xliff:g> intent; si no l\'encertes, la SIM no es podrà tornar a fer servir. Contacta amb l\'operador de telefonia mòbil per obtenir-ne més informació.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-cs/strings.xml b/packages/SystemUI/res-keyguard/values-cs/strings.xml
index 1bfc294..f313423 100644
--- a/packages/SystemUI/res-keyguard/values-cs/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-cs/strings.xml
@@ -166,4 +166,78 @@
       <item quantity="other">SIM karta je teď zablokována. Chcete-li pokračovat, zadejte kód PUK. Máte ještě <xliff:g id="_NUMBER_1">%d</xliff:g> pokusů, poté bude SIM karta natrvalo zablokována. Podrobnosti vám poskytne operátor.</item>
       <item quantity="one">SIM karta je teď zablokována. Chcete-li pokračovat, zadejte kód PUK. Máte ještě <xliff:g id="_NUMBER_0">%d</xliff:g> pokus, poté bude SIM karta natrvalo zablokována. Podrobnosti vám poskytne operátor.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-da/strings.xml b/packages/SystemUI/res-keyguard/values-da/strings.xml
index f4a3794..acc91b6 100644
--- a/packages/SystemUI/res-keyguard/values-da/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-da/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="one">SIM-kortet er nu deaktiveret. Angiv PUK-koden for at fortsætte. Du har <xliff:g id="_NUMBER_1">%d</xliff:g> forsøg tilbage, før SIM-kortet bliver permanent ubrugeligt. Kontakt dit mobilselskab for at få flere oplysninger.</item>
       <item quantity="other">SIM-kortet er nu deaktiveret. Angiv PUK-koden for at fortsætte. Du har <xliff:g id="_NUMBER_1">%d</xliff:g> forsøg tilbage, før SIM-kortet bliver permanent ubrugeligt. Kontakt dit mobilselskab for at få flere oplysninger.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-de/strings.xml b/packages/SystemUI/res-keyguard/values-de/strings.xml
index 83d7da5c..b925ac6 100644
--- a/packages/SystemUI/res-keyguard/values-de/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-de/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">Die SIM-Karte ist jetzt deaktiviert. Gib den PUK-Code ein, um fortzufahren. Du hast noch <xliff:g id="_NUMBER_1">%d</xliff:g> Versuche, bevor die SIM-Karte endgültig gesperrt wird. Weitere Informationen erhältst du von deinem Mobilfunkanbieter.</item>
       <item quantity="one">Die SIM-Karte ist jetzt deaktiviert. Gib den PUK-Code ein, um fortzufahren. Du hast noch <xliff:g id="_NUMBER_0">%d</xliff:g> Versuch, bevor die SIM-Karte endgültig gesperrt wird. Weitere Informationen erhältst du von deinem Mobilfunkanbieter.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-el/strings.xml b/packages/SystemUI/res-keyguard/values-el/strings.xml
index 89b05ec..91afac6 100644
--- a/packages/SystemUI/res-keyguard/values-el/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-el/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">Η κάρτα SIM απενεργοποιήθηκε. Καταχωρίστε τον κωδικό PUK, για να συνεχίσετε. Απομένουν <xliff:g id="_NUMBER_1">%d</xliff:g> ακόμη προσπάθειες προτού να μην είναι πλέον δυνατή η χρήση της κάρτας SIM. Επικοινωνήστε με την εταιρεία κινητής τηλεφωνίας για λεπτομέρειες.</item>
       <item quantity="one">Η κάρτα SIM απενεργοποιήθηκε. Καταχωρίστε τον κωδικό PUK, για να συνεχίσετε. Απομένει <xliff:g id="_NUMBER_0">%d</xliff:g> ακόμη προσπάθεια προτού να μην είναι πλέον δυνατή η χρήση της κάρτας SIM. Επικοινωνήστε με την εταιρεία κινητής τηλεφωνίας για λεπτομέρειες.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
index 415e3de..12fae43 100644
--- a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable. Contact operator for details.</item>
       <item quantity="one">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_0">%d</xliff:g> remaining attempt before SIM becomes permanently unusable. Contact operator for details.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
index 56a4bcc..fb587c3 100644
--- a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable. Contact operator for details.</item>
       <item quantity="one">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_0">%d</xliff:g> remaining attempt before SIM becomes permanently unusable. Contact operator for details.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
index 415e3de..12fae43 100644
--- a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable. Contact operator for details.</item>
       <item quantity="one">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_0">%d</xliff:g> remaining attempt before SIM becomes permanently unusable. Contact operator for details.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
index 415e3de..12fae43 100644
--- a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable. Contact operator for details.</item>
       <item quantity="one">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_0">%d</xliff:g> remaining attempt before SIM becomes permanently unusable. Contact operator for details.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
index f3b398d..da98ea9 100644
--- a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
@@ -150,4 +150,81 @@
       <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‎‏‎‎‏‏‎‏‎‎‎‎‏‏‎‎‏‎‏‎‎‏‎‏‎‎‏‎‎‏‎‎‎‎‎‎‎‏‎‏‎‎‎‏‏‎‏‎‎‎‎‎SIM is now disabled. Enter PUK code to continue. You have ‎‏‎‎‏‏‎<xliff:g id="_NUMBER_1">%d</xliff:g>‎‏‎‎‏‏‏‎ remaining attempts before SIM becomes permanently unusable. Contact carrier for details.‎‏‎‎‏‎</item>
       <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‎‏‎‎‏‏‎‏‎‎‎‎‏‏‎‎‏‎‏‎‎‏‎‏‎‎‏‎‎‏‎‎‎‎‎‎‎‏‎‏‎‎‎‏‏‎‏‎‎‎‎‎SIM is now disabled. Enter PUK code to continue. You have ‎‏‎‎‏‏‎<xliff:g id="_NUMBER_0">%d</xliff:g>‎‏‎‎‏‏‏‎ remaining attempt before SIM becomes permanently unusable. Contact carrier for details.‎‏‎‎‏‎</item>
     </plurals>
+    <string name="type_clock_header" msgid="4786545441902447636">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‏‎‏‏‎‏‎‎‏‏‏‎‎‏‏‎‏‏‏‎‎‎‎‎‎‏‏‏‎‏‏‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‏‎‏‎‎‎It’s‎‏‎‎‏‎"</string>
+  <string-array name="type_clock_hours">
+    <item msgid="3543074812389379830">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‎‎‎‏‎‏‎‎‎‏‎‏‎‏‎‎‎‏‏‎‏‎‎‏‎‎‏‏‏‎‏‏‏‏‎‏‏‎‎Twelve‎‏‎‎‏‎"</item>
+    <item msgid="7389464214252023751">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‎‎‏‏‎‎‏‎‏‎‎‏‏‎‏‎‎‎‏‏‎‏‎‏‎‎‎‎‏‎‏‏‏‏‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‎‎‏‏‏‎One‎‏‎‎‏‎"</item>
+    <item msgid="8803180377002008046">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎‏‏‎‎‏‎‏‏‎‏‏‏‏‎‏‎‎‏‎‏‏‎‎‎‎‎‏‏‏‎‎‏‎‎‏‏‎‏‏‏‎‏‏‏‏‎‏‏‏‎‎Two‎‏‎‎‏‎"</item>
+    <item msgid="8614897059944644719">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‏‏‎‎‏‎‎‎‎‏‏‎‎‏‏‏‎‏‏‎‏‏‏‏‎‏‎‏‎‎‎‏‏‏‎‏‏‎‎‎‎‎‎‎‏‏‎‏‏‏‏‎Three‎‏‎‎‏‎"</item>
+    <item msgid="2293058674782619556">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‎‎‏‎‏‎‎‏‎‏‏‎‏‏‏‎‎‏‎‏‏‏‏‏‎‎‎‏‎‏‏‏‏‎‎‎‏‏‏‏‎‏‎‎‏‎‎‎Four‎‏‎‎‏‎"</item>
+    <item msgid="4815402358455041664">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‎‏‎‎‏‏‏‎‏‏‏‏‏‎‏‏‏‎‏‏‏‎‏‎‎‏‎‎‏‎‎‏‎‎‏‎‏‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‎Five‎‏‎‎‏‎"</item>
+    <item msgid="3325754778509665687">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‏‎‎‏‏‏‎‏‏‏‎‏‎‎‎‏‎‏‏‎‎‏‏‎‏‏‎‏‏‏‎‎‏‎‎‎‎‎‎‏‏‎‎‏‎‏‏‎‎‏‎‏‏‏‎Six‎‏‎‎‏‎"</item>
+    <item msgid="5805551341866280575">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‏‏‎‏‏‎‏‏‎‎‏‏‎‎‏‏‏‏‏‏‏‎Seven‎‏‎‎‏‎"</item>
+    <item msgid="203334816668238610">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‏‏‎‏‎‎‏‎‎‏‏‎‎‎‏‏‏‏‏‏‎‎‎‎‎‎‏‏‏‏‎‏‏‏‏‏‏‎‏‎‏‏‎‎‎‎‏‏‎‎‎‏‎‎‏‎‎Eight‎‏‎‎‏‎"</item>
+    <item msgid="4828052671464488923">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‎‎‎‎‎‎‎‏‎‏‏‎‎‎‎‎‏‎‏‎‎‏‏‎‎‎‏‎‏‏‏‏‎‎‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎Nine‎‏‎‎‏‎"</item>
+    <item msgid="2233497913571137419">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎‏‏‏‏‏‎‏‎‏‎‎‎‎‏‎‎‏‏‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‏‏‎‎‎‏‎‏‏‎Ten‎‏‎‎‏‎"</item>
+    <item msgid="5621554266768657830">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‎‎‎‎‎‏‏‏‏‎‎‎‏‎‏‏‏‎‏‎‎‏‎‎‏‎‎‎‏‎‎‎‏‎‏‎‎‏‏‏‏‎‎‏‏‎‏‏‎‏‎‎‏‏‎‎Eleven‎‏‎‎‏‎"</item>
+  </string-array>
+  <string-array name="type_clock_minutes">
+    <item msgid="8322049385467207985">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‏‏‎‏‏‏‎‏‏‎‏‏‏‏‎‏‎‎‏‎‏‏‏‏‎‎‎‎‎‎‎‎‎‏‏‏‏‏‏‎‎‎‎‏‎‎‏‏‎‎‎‏‎O’Clock‎‏‎‎‏‎"</item>
+    <item msgid="8837126587669001578">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‎‏‏‏‏‎‎‎‏‏‏‏‏‎‎‏‏‏‏‎‏‏‏‎‏‎‏‎‎‏‎‏‎‏‏‏‎‏‏‎‏‎‏‎‏‏‎‏‎‏‎‎O’One‎‏‎‎‏‎"</item>
+    <item msgid="4294343372940455660">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‏‎‎‏‏‎‎‎‏‎‎‏‎‎‏‎‏‎‎‎‏‎‏‏‏‎‎‏‎‏‏‏‏‎‏‎‏‎‏‏‎‎‏‎‏‏‏‎‏‏‏‎‏‏‎‎‎O’Two‎‏‎‎‏‎"</item>
+    <item msgid="7129166637707421536">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‏‎‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‎‏‎‎‎‏‏‏‏‏‎‎‏‎‎‎‏‏‏‎‏‏‏‏‎‎‏‏‏‎‏‏‎‎‎‎‎‎O’Three‎‏‎‎‏‎"</item>
+    <item msgid="7579404865008788673">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‏‎‏‏‏‏‎‏‏‏‎‏‎‎‏‎‎‏‎‎‎‏‎‎‏‏‏‎‏‏‏‎‏‏‎‏‏‏‎‏‏‎‎‏‎‎‏‏‎‎‎‎‎‏‎O’Four‎‏‎‎‏‎"</item>
+    <item msgid="3873924689207380586">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‎‎‎‏‎‏‏‏‏‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‏‎‏‎‏‏‎‏‎‎‏‎‎‏‎‎‏‎‏‎‎‏‏‎‏‎‏‎‎O’Five‎‏‎‎‏‎"</item>
+    <item msgid="4849565597850069377">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‏‎‎‏‏‎‏‎‎‎‏‏‏‏‎‎‎‏‏‎‏‏‏‏‎‎‏‎‏‏‎‏‏‎‎‏‏‏‎‏‏‏‎‏‎‎‏‏‎‎‎‎‎‎‏‎O’Six‎‏‎‎‏‎"</item>
+    <item msgid="4404219424523572364">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‏‏‏‏‎‏‏‏‎‏‏‏‎‎‎‏‏‏‎‏‏‎‏‏‎‎‏‏‏‏‎‎‏‏‎‏‎‎‏‎‏‎‏‎‎‏‎‎‎‏‏‎‎‎O’Seven‎‏‎‎‏‎"</item>
+    <item msgid="8740481214764087329">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‏‎‎‎‏‏‎‏‏‎‏‎‏‎‏‏‎‏‏‎‎‎‏‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‎‎‎‎‏‎‎‎‎‏‎O’Eight‎‏‎‎‏‎"</item>
+    <item msgid="1713216865806811237">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‏‏‎‎‎‏‏‎‏‎‎‏‎‎‎‏‏‎‏‎‏‎‎‏‏‎‎‏‎‏‎‏‏‎‎‏‏‏‏‏‏‎‎‎‎‎‎‎‎‏‏‎‎‏‎‏‎O’Nine‎‏‎‎‏‎"</item>
+    <item msgid="3508406095411245038">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‏‏‎‎‎‎‎‏‎‏‏‏‎‎‏‏‎‎‎‎‎‏‎‏‏‎‎‏‎‎‏‏‎‎‏‏‎‏‎‏‏‎‏‏‏‏‏‏‏‎‏‏‏‎‎Ten‎‏‎‎‏‎"</item>
+    <item msgid="7161996337755311711">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‏‎‎‏‎‎‏‎‎‎‎‏‎‏‏‎‏‏‏‎‎‏‎‎‏‎‏‎‏‎‏‎‎‎‏‏‎‏‏‏‎‎‏‏‏‎‎‏‎‏‏‏‏‏‎Eleven‎‏‎‎‏‎"</item>
+    <item msgid="4044549963329624197">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‎‎‎‎‏‏‎‏‎‎‎‎‎‎‏‎‎‏‎‏‎‎‏‏‎‏‏‎‎‎‏‎‎‎‎‏‎‏‎Twelve‎‏‎‎‏‎"</item>
+    <item msgid="333373157917379088">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‏‎‏‎‎‎‎‎‎‏‏‎‎‎‎‏‎‎‎‏‏‏‏‎‏‏‏‎‏‏‏‏‎‏‎‏‎‎‎‎‏‏‎‎‏‎‏‎‎‎‎‏‎‎‎‎‎Thirteen‎‏‎‎‏‎"</item>
+    <item msgid="2631202907124819385">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‎‏‎‎‏‎‎‎‏‏‎‏‎‎‏‏‏‎‎‏‏‎‎‏‎‎‏‏‎‎‏‏‎‎‏‎‏‏‎‏‏‏‎‎‏‎Fourteen‎‏‎‎‏‎"</item>
+    <item msgid="6472396076858033453">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‎‏‎‎‏‎‏‎‎‏‎‎‎‏‏‏‏‏‎‎‎‎‏‎‎‎‏‏‏‎‏‏‎‎‎‎‎‏‎‏‎‎‎‏‎‏‎‎‏‎‏‏‎‏‎Fifteen‎‏‎‎‏‎"</item>
+    <item msgid="8656981856181581643">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‎‎‏‏‏‏‎‎‎‏‏‏‎‎‏‎‎‎‎‏‏‎‏‎‏‏‎‎‏‎‏‏‎‏‎‎‎‏‏‏‎‏‏‏‎‏‎‎‏‎‏‏‎Sixteen‎‏‎‎‏‎"</item>
+    <item msgid="7289026608562030619">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‎‎‏‏‏‏‏‎‏‎‎‏‏‎‎‎‏‎‏‎‎‏‏‏‎‎‎‎‏‏‎‏‏‎‏‎‏‏‏‎‎‏‎‎‎‎‎‎‏‏‎‏‏‎Seventeen‎‏‎‎‏‎"</item>
+    <item msgid="3881477602692646573">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‏‏‏‎‏‏‏‎‎‎‏‏‏‎‏‎‏‎‎‎‎‏‎‎‏‎‎‎‎‎‎‏‎‎‎‎‏‎‏‎‎‎‏‏‎‏‎‏‎‏‏‎‏‎Eighteen‎‏‎‎‏‎"</item>
+    <item msgid="3358129827772984226">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‏‎‎‏‏‎‏‎‎‏‏‏‏‎‎‏‎‏‎‎‏‎‎‏‎‏‎‎‎‏‏‎‎‎‎‎‏‏‎‏‎‏‏‎‏‎‏‏‏‎‏‎‎‎‏‎‎Nineteen‎‏‎‎‏‎"</item>
+    <item msgid="3308575407402865807">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‏‏‏‎‏‎‏‎‎‏‏‎‏‎‏‏‏‏‎‎‏‏‎‏‏‎‏‎‏‏‏‎‏‏‎‏‎‏‏‏‎‏‎‏‎‏‎‎‏‎‎‎‏‏‏‏‎Twenty‎‏‎‎‏‎"</item>
+    <item msgid="5346560955382229629">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‎‏‏‎‎‏‎‏‏‎‎‏‏‎‎‏‏‎‏‏‏‎‎‏‎‎‏‎‎‏‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‏‏‎‏‎Twenty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎One‎‏‎‎‏‎"</item>
+    <item msgid="226750304761473436">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‎‎‏‎‎‏‎‏‏‎‎‏‎‏‎‎‎‎‏‏‎‎‏‏‎‏‏‎‏‎‎‎‎‎‎‎‎‏‎‎‏‏‏‎‏‎‎‏‏‎‎‏‏‏‎‎‎Twenty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Two‎‏‎‎‏‎"</item>
+    <item msgid="616811325336838734">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‏‎‎‎‏‏‏‏‎‏‎‏‏‎‏‎‏‎‏‎‎‎‎‏‏‏‏‎‎‏‎‎‎‎‏‎‎‎‏‏‏‏‏‎‎‎‏‎‎‏‎‎‏‏‏‎‎Twenty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Three‎‏‎‎‏‎"</item>
+    <item msgid="616346116869053440">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‏‎‎‎‏‏‎‏‏‎‏‏‎‎‏‏‏‎‎‎‎‏‏‏‎‎‎‏‏‎‏‎‏‎‏‎‏‎‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‎‎‎‎Twenty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Four‎‏‎‎‏‎"</item>
+    <item msgid="4642996410384042830">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‏‎‏‏‏‏‎‎‏‏‏‏‎‎‏‎‏‎‎‎‏‎‏‎‏‏‎‏‏‎‎‏‎‏‏‎‏‎‏‏‎‎‏‎‏‏‎‏‎‎‏‏‏‎‎Twenty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Five‎‏‎‎‏‎"</item>
+    <item msgid="7506092849993571465">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‎‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‎‎‏‎‏‏‎‏‏‏‏‎‏‏‏‎‏‎‏‏‏‎‎‏‎‎‎‏‎‎‏‎Twenty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Six‎‏‎‎‏‎"</item>
+    <item msgid="1915078191101042031">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‏‎‎‏‎‎‏‏‏‎‏‏‏‎‎‏‎‏‏‏‎‏‏‏‏‏‏‎‎‎‎‏‏‎‏‎‏‏‎‎‏‏‎‏‏‏‎‏‎‏‏‎‏‏‏‏‎Twenty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Seven‎‏‎‎‏‎"</item>
+    <item msgid="4292378641900520252">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‏‎‎‏‎‎‎‏‏‎‎‏‎‏‏‏‏‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‎‎‎‏‏‎‎‏‏‏‏‎‎‎Twenty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Eight‎‏‎‎‏‎"</item>
+    <item msgid="5339513901773103696">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‎‎‏‏‎‎‏‏‏‎‎‎‎‏‏‏‎‎‏‏‎‏‎‏‎‎‎‏‏‎‎‎‏‏‏‎‎‏‎‎‎‏‎‎‎‏‎‎‏‎‏‎‎‎‎‎Twenty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Nine‎‏‎‎‏‎"</item>
+    <item msgid="3574673250891657607">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‏‎‎‏‏‎‏‏‏‏‎‎‏‎‏‎‎‏‏‎‎‎‎‏‏‏‎‏‏‎‏‏‎‏‏‏‏‏‎‎‏‏‏‏‎‎‎‏‏‎‎‎‎‏‏‏‎Thirty‎‏‎‎‏‎"</item>
+    <item msgid="5796923836589110940">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‏‏‎‎‏‎‏‏‎‎‏‏‏‏‏‎‎‎‎‏‎‎‎‎‎‏‎‏‎‏‏‏‏‎‎‎‏‏‎‏‏‏‎‏‏‎‏‎‎‏‏‏‎‎‎Thirty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎One‎‏‎‎‏‎"</item>
+    <item msgid="5859323597571702052">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‎‏‏‎‎‏‎‏‎‏‎‎‏‏‎‎‏‏‏‏‎‏‎‎‏‎‎‏‎‎‎Thirty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Two‎‏‎‎‏‎"</item>
+    <item msgid="5133326723148876507">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‎‏‏‏‏‎‏‎‎‏‏‏‏‎‏‎‏‏‏‎‏‎‏‎‎‎‎‏‎‎‏‎‏‎‎‏‏‏‏‎‎‎‎‏‎‏‎‏‏‎‏‏‎‏‏‎Thirty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Three‎‏‎‎‏‎"</item>
+    <item msgid="2693999494655663096">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‎‏‏‎‎‎‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‎‎‏‎‏‏‎‎‎‎‎‎‎‏‎‎‎‎‏‎‏‏‎‏‏‏‏‏‏‏‎‎‎‎Thirty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Four‎‏‎‎‏‎"</item>
+    <item msgid="3316754944962836197">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‎‎‎‏‏‏‎‏‏‏‏‎‏‏‎‎‎‎‏‏‎‎‏‎‏‎‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‏‎‏‏‎‏‏‏‎‎‏‎‏‎Thirty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Five‎‏‎‎‏‎"</item>
+    <item msgid="816891008836796723">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‎‏‎‏‏‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‏‎‏‏‎‎‎‎‎‎‏‎‎‏‏‎‎‏‏‎Thirty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Six‎‏‎‎‏‎"</item>
+    <item msgid="9158890488666520078">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‏‏‏‎‏‎‏‎‎‏‎‏‏‏‏‏‏‎‏‎‎‎‎‏‏‎‏‎‏‎‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‏‏‎‎Thirty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Seven‎‏‎‎‏‎"</item>
+    <item msgid="1894769703213894011">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‎‏‎‏‏‏‎‎‏‎‎‏‏‎‎‎‎‎‎‎‏‏‎‎‏‎‎‏‏‎‎‏‏‏‏‎‎‏‎‎‎‏‎‎‏‎‏‏‏‏‎‏‏‎Thirty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Eight‎‏‎‎‏‎"</item>
+    <item msgid="5638820345598572399">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‎‎‎‎‎‏‎‎‎‏‏‏‎‏‎‎‏‏‏‎‏‎‏‎‎‎‎‎‏‏‏‎‏‎‎‏‎‏‏‏‏‏‎‏‏‏‎‏‏‎‏‏‏‏‎Thirty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Nine‎‏‎‎‏‎"</item>
+    <item msgid="8838304023017895439">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‏‏‏‏‏‏‎‏‏‎‏‎‏‎‏‏‏‎‎‏‏‏‏‏‎‎‏‏‏‎‎‎‏‏‎‎‏‏‎‏‏‎‎‎‎‎‏‏‏‏‎Forty‎‏‎‎‏‎"</item>
+    <item msgid="1834742948932559597">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‎‏‏‏‎‏‏‎‎‏‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‏‎‏‎‎‎‏‏‏‎‎‏‎‎‎‏‎‏‏‏‎‏‏‎‏‎Forty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎One‎‏‎‎‏‎"</item>
+    <item msgid="6573707308847773944">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‎‏‏‏‎‏‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎‏‎‎‏‎‏‎‎‎‎‏‎‏‎‏‏‏‎‎‎‏‏‏‏‏‎‎‎‎Forty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Two‎‏‎‎‏‎"</item>
+    <item msgid="2450149950652678001">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‎‎‎‎‎‎‎‎‏‎‏‎‏‏‏‎‎‏‏‎‎‏‏‎‎‎‎‎‏‏‏‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‏‎Forty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Three‎‏‎‎‏‎"</item>
+    <item msgid="2874667401318178036">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‏‏‏‎‎‏‎‎‏‏‎‏‏‏‏‎‏‏‎‎‎‏‎‏‎‏‎‏‎‏‏‎‏‏‏‏‎‏‏‏‎‎‎‏‏‏‎‎‏‏‏‏‎‏‎‎‎Forty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Four‎‏‎‎‏‎"</item>
+    <item msgid="3391101532763048862">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‎‎‏‎‏‏‏‎‎‏‏‏‏‎‎Forty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Five‎‏‎‎‏‎"</item>
+    <item msgid="1671489330863254362">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‎‎‏‏‎‎‏‎‎‏‎‏‎‎‏‎‏‎‏‏‎‎‎‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‎‏‎‏‏‎‏‎‏‏‎‏‎‎Forty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Six‎‏‎‎‏‎"</item>
+    <item msgid="5916017359554531038">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‎‎‏‏‎‎‏‏‏‏‎‏‎‏‎‎‏‏‏‎‎‎‏‏‎‏‏‎‎‎‏‎‏‎‎‏‎‏‎‏‏‎‎‏‏‏‎‏‏‎‏‏‏‏‎‎Forty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Seven‎‏‎‎‏‎"</item>
+    <item msgid="8205413177993059967">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‏‏‏‏‏‎‏‏‏‏‎‏‏‏‏‎‎‏‏‏‏‏‎‏‎‏‏‎‏‏‎‎‏‎‏‎‏‏‏‎‏‏‏‏‎‎‏‏‏‏‏‏‏‎Forty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Eight‎‏‎‎‏‎"</item>
+    <item msgid="6607867415142171302">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‏‎‎‏‏‏‏‎‏‏‏‎‎‎‏‏‎‎‏‏‏‎‏‏‏‎‎‏‎‎‏‏‎‏‏‎‏‏‎‎‎‎‎‏‎‏‎‏‎‎‏‏‎‎Forty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Nine‎‏‎‎‏‎"</item>
+    <item msgid="8358850748472089162">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‎‎‎‏‎‎‏‏‎‏‎‎‏‏‏‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‎‏‎‏‎‎Fifty‎‏‎‎‏‎"</item>
+    <item msgid="3551313125255080234">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‏‎‎‏‎‎‎‏‏‎‎‏‏‎‎‎‏‏‏‏‎‎‎‏‏‎‎‎‏‎‏‎‎‎‎‎‎‏‎‏‏‏‎‏‎‎‏‎‎‏‎‏‎‏‎‎Fifty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎One‎‏‎‎‏‎"</item>
+    <item msgid="1559678130725716542">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‎‏‎‎‏‎‏‎‎‎‏‎‏‏‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‏‏‏‎‏‏‎‏‎‎‎‎‎‎‎‏‎‎‎‏‏‏‏‏‎‎Fifty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Two‎‏‎‎‏‎"</item>
+    <item msgid="431441994725492377">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‏‎‎‎‏‏‎‏‎‏‎‏‎‏‎‏‎‎‏‏‎‎‏‏‎‎‏‎‎‎‎‏‏‎‏‎‎‏‏‎‎‏‎Fifty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Three‎‏‎‎‏‎"</item>
+    <item msgid="6345774640539623024">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‎‏‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‎‏‎‏‎‎‎‎‎‏‎‏‎‎‎‎‎‏‎‏‏‏‏‎‏‏‏‏‎‎‏‏‏‎‎‎‎‎Fifty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Four‎‏‎‎‏‎"</item>
+    <item msgid="8018192990793931120">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‏‏‎‎‏‎‏‏‎‎‎‎‎‎‎‏‎‏‎‏‏‏‏‏‏‎‎‏‏‎‎‏‏‎‎‏‎‎‏‏‎‎‏‎‏‏‏‎‎‎‎‎Fifty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Five‎‏‎‎‏‎"</item>
+    <item msgid="6187650843754604534">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‏‏‏‎‏‏‏‏‎‎‏‏‏‎‏‎‏‎‎‎‏‎‏‎‏‎‎‎‎‎‏‎‎‎‏‏‏‎‏‎‎‏‏‏‏‏‏‏‎‏‏‎‎Fifty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Six‎‏‎‎‏‎"</item>
+    <item msgid="8727240174015993259">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‏‎‏‎‏‏‎‎‎‏‎‏‎‏‏‎‎‏‏‎‎‎‎‏‎‎‏‏‎‏‏‏‏‎‏‏‏‎‏‎‏‎‏‏‎‏‎‏‎‏‏‎Fifty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Seven‎‏‎‎‏‎"</item>
+    <item msgid="848339003778952950">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‏‏‎‎‎‏‎‏‏‏‏‎‎‏‏‏‏‏‎‏‎‏‎‎‎‏‎‎‏‎‎‏‎‏‎‏‏‎‏‎‎‏‏‎‏‏‏‎‏‏‏‏‎‏‏‎‎Fifty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Eight‎‏‎‎‏‎"</item>
+    <item msgid="5798985802835423618">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‏‏‏‎‏‎‎‎‏‎‎‎‏‎‏‏‎‏‏‏‎‏‎‎‎‎‎‎‏‏‏‎‎‎‏‎‎‏‏‏‏‏‎‎‎‏‏‎‎‎‎‎‏‎‎Fifty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Nine‎‏‎‎‏‎"</item>
+  </string-array>
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
index e56fa6b..72fc16a 100644
--- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">Se inhabilitó la SIM. Para continuar, ingresa el código PUK. Te quedan <xliff:g id="_NUMBER_1">%d</xliff:g> intentos más antes de que la SIM quede inutilizable permanentemente. Comunícate con tu proveedor para obtener más detalles.</item>
       <item quantity="one">Se inhabilitó la SIM. Para continuar, ingresa el código PUK. Te queda <xliff:g id="_NUMBER_0">%d</xliff:g> intento más antes de que la SIM quede inutilizable permanentemente. Comunícate con tu proveedor para obtener más detalles.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-es/strings.xml b/packages/SystemUI/res-keyguard/values-es/strings.xml
index 8a755b4..232c79b 100644
--- a/packages/SystemUI/res-keyguard/values-es/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-es/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">La tarjeta SIM está inhabilitada. Introduce el código PUK para continuar. Te quedan <xliff:g id="_NUMBER_1">%d</xliff:g> intentos para que la tarjeta SIM quede inservible de forma permanente. Ponte en contacto con tu operador para obtener más información.</item>
       <item quantity="one">La tarjeta SIM está inhabilitada. Introduce el código PUK para continuar. Te queda <xliff:g id="_NUMBER_0">%d</xliff:g> intento para que la tarjeta SIM quede inservible de forma permanente. Ponte en contacto con tu operador para obtener más información.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-et/strings.xml b/packages/SystemUI/res-keyguard/values-et/strings.xml
index a19cc23..4eeebe3 100644
--- a/packages/SystemUI/res-keyguard/values-et/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-et/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">SIM-kaart on nüüd keelatud. Jätkamiseks sisestage PUK-kood. Teil on jäänud veel <xliff:g id="_NUMBER_1">%d</xliff:g> katset enne, kui SIM-kaart püsivalt lukustatakse. Lisateavet küsige operaatorilt.</item>
       <item quantity="one">SIM-kaart on nüüd keelatud. Jätkamiseks sisestage PUK-kood. Teil on jäänud veel <xliff:g id="_NUMBER_0">%d</xliff:g> katse enne, kui SIM-kaart püsivalt lukustatakse. Lisateavet küsige operaatorilt.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-eu/strings.xml b/packages/SystemUI/res-keyguard/values-eu/strings.xml
index b063107..bb913d1 100644
--- a/packages/SystemUI/res-keyguard/values-eu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-eu/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">Desgaitu egin da SIM txartela. Aurrera egiteko, idatzi PUK kodea. <xliff:g id="_NUMBER_1">%d</xliff:g> saiakera geratzen zaizkizu SIM txartela betiko erabilgaitz geratu aurretik. Xehetasunak lortzeko, jarri operadorearekin harremanetan.</item>
       <item quantity="one">Desgaitu egin da SIM txartela. Aurrera egiteko, idatzi PUK kodea. <xliff:g id="_NUMBER_0">%d</xliff:g> saiakera geratzen zaizu SIM txartela betiko erabilgaitz geratu aurretik. Xehetasunak lortzeko, jarri operadorearekin harremanetan.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-fa/strings.xml b/packages/SystemUI/res-keyguard/values-fa/strings.xml
index db7923d..5568d94 100644
--- a/packages/SystemUI/res-keyguard/values-fa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fa/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="one">‏سیم‌کارت اکنون غیرفعال است. برای ادامه دادن کد PUK را وارد کنید. <xliff:g id="_NUMBER_1">%d</xliff:g> تلاش دیگر باقی مانده است و پس از آن سیم‌کارت برای همیشه غیرقابل‌استفاده می‌شود. برای اطلاع از جزئیات با شرکت مخابراتی تماس بگیرید.</item>
       <item quantity="other">‏سیم‌کارت اکنون غیرفعال است. برای ادامه دادن کد PUK را وارد کنید. <xliff:g id="_NUMBER_1">%d</xliff:g> تلاش دیگر باقی مانده است و پس از آن سیم‌کارت برای همیشه غیرقابل‌استفاده می‌شود. برای اطلاع از جزئیات با شرکت مخابراتی تماس بگیرید.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-fi/strings.xml b/packages/SystemUI/res-keyguard/values-fi/strings.xml
index 2bd8314..4f3304d 100644
--- a/packages/SystemUI/res-keyguard/values-fi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fi/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">SIM-kortti on nyt lukittu. Anna PUK-koodi, niin voit jatkaa. Sinulla on <xliff:g id="_NUMBER_1">%d</xliff:g> yritystä jäljellä, ennen kuin SIM-kortti poistuu pysyvästi käytöstä. Pyydä lisätietoja operaattoriltasi.</item>
       <item quantity="one">SIM-kortti on nyt lukittu. Anna PUK-koodi, niin voit jatkaa. Sinulla on <xliff:g id="_NUMBER_0">%d</xliff:g> yritys jäljellä, ennen kuin SIM-kortti poistuu pysyvästi käytöstä. Pyydä lisätietoja operaattoriltasi.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
index 9b0e269..348a3ff 100644
--- a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="one">La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Il vous reste <xliff:g id="_NUMBER_1">%d</xliff:g> tentative avant que votre carte SIM devienne définitivement inutilisable. Pour obtenir plus de détails, communiquez avec votre fournisseur de services.</item>
       <item quantity="other">La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Il vous reste <xliff:g id="_NUMBER_1">%d</xliff:g> tentatives avant que votre carte SIM devienne définitivement inutilisable. Pour obtenir plus de détails, communiquez avec votre fournisseur de services.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml
index f0c7e92..e986cee 100644
--- a/packages/SystemUI/res-keyguard/values-fr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="one">La carte SIM est maintenant désactivée. Saisissez le code PUK pour continuer. Il vous reste <xliff:g id="_NUMBER_1">%d</xliff:g> tentative avant que votre carte SIM ne devienne définitivement inutilisable. Pour de plus amples informations, veuillez contacter votre opérateur.</item>
       <item quantity="other">La carte SIM est maintenant désactivée. Saisissez le code PUK pour continuer. Il vous reste <xliff:g id="_NUMBER_1">%d</xliff:g> tentatives avant que votre carte SIM ne devienne définitivement inutilisable. Pour de plus amples informations, veuillez contacter votre opérateur.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-gl/strings.xml b/packages/SystemUI/res-keyguard/values-gl/strings.xml
index 756fc27..631ab6a 100644
--- a/packages/SystemUI/res-keyguard/values-gl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-gl/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">A SIM está desactivada. Introduce o código PUK para continuar. Quédanche <xliff:g id="_NUMBER_1">%d</xliff:g> intentos antes de que a SIM quede inutilizable para sempre. Contacta co operador para obter información.</item>
       <item quantity="one">A SIM está desactivada. Introduce o código PUK para continuar. Quédache <xliff:g id="_NUMBER_0">%d</xliff:g> intento antes de que a SIM quede inutilizable para sempre. Contacta co operador para obter información.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-gu/strings.xml b/packages/SystemUI/res-keyguard/values-gu/strings.xml
index fb3a14b..520f098 100644
--- a/packages/SystemUI/res-keyguard/values-gu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-gu/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="one">સિમ હવે બંધ કરેલ છે. ચાલુ રાખવા માટે PUK કોડ દાખલ કરો. સિમ કાયમીરૂપે બિનઉપયોગી બની જાય એ પહેલાં તમારી પાસે <xliff:g id="_NUMBER_1">%d</xliff:g> પ્રયાસ બાકી છે. વિગતો માટે કૅરિઅરનો સંપર્ક કરો.</item>
       <item quantity="other">સિમ હવે બંધ કરેલ છે. ચાલુ રાખવા માટે PUK કોડ દાખલ કરો. સિમ કાયમીરૂપે બિનઉપયોગી બની જાય એ પહેલાં તમારી પાસે <xliff:g id="_NUMBER_1">%d</xliff:g> પ્રયાસો બાકી છે. વિગતો માટે કૅરિઅરનો સંપર્ક કરો.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-hi/strings.xml b/packages/SystemUI/res-keyguard/values-hi/strings.xml
index 7bfc635..9f189e8 100644
--- a/packages/SystemUI/res-keyguard/values-hi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hi/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="one">सिम बंद कर दिया गया है. जारी रखने के लिए PUK कोड डालें. आपके पास <xliff:g id="_NUMBER_1">%d</xliff:g> मौके बचे हैं, उसके बाद, सिम हमेशा के लिए काम करना बंद कर देगा. जानकारी के लिए, मोबाइल और इंटरनेट सेवा देने वाली कंपनी से संपर्क करें.</item>
       <item quantity="other">सिम बंद कर दिया गया है. जारी रखने के लिए PUK कोड डालें. आपके पास <xliff:g id="_NUMBER_1">%d</xliff:g> मौके बचे हैं, उसके बाद, सिम हमेशा के लिए काम करना बंद कर देगा. जानकारी के लिए, मोबाइल और इंटरनेट सेवा देने वाली कंपनी से संपर्क करें.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-hr/strings.xml b/packages/SystemUI/res-keyguard/values-hr/strings.xml
index 089c6c4..5c84ecc 100644
--- a/packages/SystemUI/res-keyguard/values-hr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hr/strings.xml
@@ -158,4 +158,78 @@
       <item quantity="few">SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. Više informacija zatražite od mobilnog operatera.</item>
       <item quantity="other">SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. Više informacija zatražite od mobilnog operatera.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-hu/strings.xml b/packages/SystemUI/res-keyguard/values-hu/strings.xml
index 49d8401..e4e9fa6 100644
--- a/packages/SystemUI/res-keyguard/values-hu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hu/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">A SIM-kártya le van tiltva. A folytatáshoz adja meg a PUK-kódot. Még <xliff:g id="_NUMBER_1">%d</xliff:g> próbálkozása van, mielőtt végleg használhatatlanná válik a SIM-kártya. További információért forduljon a szolgáltatóhoz.</item>
       <item quantity="one">A SIM-kártya le van tiltva. A folytatáshoz adja meg a PUK-kódot. Még <xliff:g id="_NUMBER_0">%d</xliff:g> próbálkozása van, mielőtt végleg használhatatlanná válik a SIM-kártya. További információért forduljon a szolgáltatóhoz.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-hy/strings.xml b/packages/SystemUI/res-keyguard/values-hy/strings.xml
index 5198da6..c237828 100644
--- a/packages/SystemUI/res-keyguard/values-hy/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hy/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="one">SIM քարտն անջատված է: Շարունակելու համար մուտքագրեք PUK կոդը: Մնացել է <xliff:g id="_NUMBER_1">%d</xliff:g> փորձ, որից հետո SIM քարտն այլևս հնարավոր չի լինի օգտագործել: Մանրամասների համար դիմեք օպերատորին:</item>
       <item quantity="other">SIM քարտն անջատված է: Շարունակելու համար մուտքագրեք PUK կոդը: Մնացել է <xliff:g id="_NUMBER_1">%d</xliff:g> փորձ, որից հետո SIM քարտն այլևս հնարավոր չի լինի օգտագործել: Մանրամասների համար դիմեք օպերատորին:</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-in/strings.xml b/packages/SystemUI/res-keyguard/values-in/strings.xml
index 161287c..ed41222 100644
--- a/packages/SystemUI/res-keyguard/values-in/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-in/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">SIM kini dinonaktifkan. Masukkan kode PUK untuk melanjutkan. Tersisa <xliff:g id="_NUMBER_1">%d</xliff:g> percobaan sebelum SIM tidak dapat digunakan secara permanen. Hubungi operator untuk mengetahui detailnya.</item>
       <item quantity="one">SIM kini dinonaktifkan. Masukkan kode PUK untuk melanjutkan. Tersisa <xliff:g id="_NUMBER_0">%d</xliff:g> percobaan sebelum SIM tidak dapat digunakan secara permanen. Hubungi operator untuk mengetahui detailnya.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-is/strings.xml b/packages/SystemUI/res-keyguard/values-is/strings.xml
index 9ed1188..afaf6bb 100644
--- a/packages/SystemUI/res-keyguard/values-is/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-is/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="one">SIM-kortið er nú óvirkt. Sláðu inn PUK-númer til að halda áfram. Það er <xliff:g id="_NUMBER_1">%d</xliff:g> tilraun eftir þar til SIM-kortið verður ónothæft til frambúðar. Hafðu samband við símafyrirtækið til að fá upplýsingar.</item>
       <item quantity="other">SIM-kortið er nú óvirkt. Sláðu inn PUK-númer til að halda áfram. Það eru <xliff:g id="_NUMBER_1">%d</xliff:g> tilraunir eftir þar til SIM-kortið verður ónothæft til frambúðar. Hafðu samband við símafyrirtækið til að fá upplýsingar.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-it/strings.xml b/packages/SystemUI/res-keyguard/values-it/strings.xml
index b5f85f6..28a53a4 100644
--- a/packages/SystemUI/res-keyguard/values-it/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-it/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">La scheda SIM è ora disattivata. Inserisci il codice PUK per continuare. Hai ancora <xliff:g id="_NUMBER_1">%d</xliff:g> tentativi a disposizione prima che la SIM diventi definitivamente inutilizzabile. Per informazioni dettagliate, contatta l\'operatore.</item>
       <item quantity="one">La scheda SIM è ora disattivata. Inserisci il codice PUK per continuare. Hai ancora <xliff:g id="_NUMBER_0">%d</xliff:g> tentativo a disposizione prima che la SIM diventi definitivamente inutilizzabile. Per informazioni dettagliate, contatta l\'operatore.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-iw/strings.xml b/packages/SystemUI/res-keyguard/values-iw/strings.xml
index 09b3cfa..dc9c7ed 100644
--- a/packages/SystemUI/res-keyguard/values-iw/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-iw/strings.xml
@@ -166,4 +166,78 @@
       <item quantity="other">‏כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותרו לך <xliff:g id="_NUMBER_1">%d</xliff:g> ניסיונות נוספים לפני שכרטיס ה-SIM ינעל לצמיתות. למידע נוסף, ניתן לפנות לספק שלך.</item>
       <item quantity="one">‏כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותר לך <xliff:g id="_NUMBER_0">%d</xliff:g> ניסיון נוסף לפני שכרטיס ה-SIM ינעל לצמיתות. למידע נוסף, ניתן לפנות לספק שלך.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-ja/strings.xml b/packages/SystemUI/res-keyguard/values-ja/strings.xml
index 08d4b9b..23e6d15 100644
--- a/packages/SystemUI/res-keyguard/values-ja/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ja/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">SIM が無効になりました。続行するには PUK コードを入力してください。入力できるのはあと <xliff:g id="_NUMBER_1">%d</xliff:g> 回です。この回数を超えると SIM は完全に使用できなくなります。詳しくは携帯通信会社にお問い合わせください。</item>
       <item quantity="one">SIM が無効になりました。続行するには PUK コードを入力してください。入力できるのはあと <xliff:g id="_NUMBER_0">%d</xliff:g> 回です。この回数を超えると SIM は完全に使用できなくなります。詳しくは携帯通信会社にお問い合わせください。</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-ka/strings.xml b/packages/SystemUI/res-keyguard/values-ka/strings.xml
index f966c33..788c772 100644
--- a/packages/SystemUI/res-keyguard/values-ka/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ka/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">SIM ბარათი ახლა დეაქტივირებულია. გასაგრძელებლად შეიყვანეთ PUK-კოდი. თქვენ დაგრჩათ <xliff:g id="_NUMBER_1">%d</xliff:g> მცდელობა, სანამ SIM სამუდამოდ გამოუსადეგარი გახდება. დეტალური ინფორმაციისთვის დაუკავშირდით თქვენს ოპერატორს.</item>
       <item quantity="one">SIM ბარათი ახლა დეაქტივირებულია. გასაგრძელებლად შეიყვანეთ PUK-კოდი. თქვენ დაგრჩათ <xliff:g id="_NUMBER_0">%d</xliff:g> მცდელობა, სანამ SIM სამუდამოდ გამოუსადეგარი გახდება. დეტალური ინფორმაციისთვის დაუკავშირდით თქვენს ოპერატორს.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-kk/strings.xml b/packages/SystemUI/res-keyguard/values-kk/strings.xml
index 530418f..66c4e1ee 100644
--- a/packages/SystemUI/res-keyguard/values-kk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kk/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">SIM картасы өшірілді. Жалғастыру үшін PUK кодын енгізіңіз. <xliff:g id="_NUMBER_1">%d</xliff:g> мүмкіндік қалды, одан кейін SIM картасы біржола құлыпталады. Толығырақ мәліметті оператордан алыңыз.</item>
       <item quantity="one">SIM картасы өшірілді. Жалғастыру үшін PUK кодын енгізіңіз. <xliff:g id="_NUMBER_0">%d</xliff:g> мүмкіндік қалды, одан кейін SIM картасы біржола құлыпталады. Толығырақ мәліметті оператордан алыңыз.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-km/strings.xml b/packages/SystemUI/res-keyguard/values-km/strings.xml
index 7ab347d..dcd6ce7 100644
--- a/packages/SystemUI/res-keyguard/values-km/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-km/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">ឥឡូវនេះស៊ីមត្រូវបានបិទ។ សូមបញ្ចូលកូដ PUK ដើម្បីបន្ត។ អ្នកនៅសល់ការព្យាយាម <xliff:g id="_NUMBER_1">%d</xliff:g> ដងទៀត​មុនពេល​ស៊ីម​មិនអាច​ប្រើបាន​ជា​អចិន្ត្រៃយ៍។ ទាក់ទង​ទៅ​ក្រុមហ៊ុន​សេវា​ទូរសព្ទ​សម្រាប់ព័ត៌មានលម្អិត។</item>
       <item quantity="one">ឥឡូវនេះស៊ីមត្រូវបានបិទ។ សូមបញ្ចូលកូដ PUK ដើម្បីបន្ត។ អ្នកនៅសល់ការព្យាយាម <xliff:g id="_NUMBER_0">%d</xliff:g> ដងទៀតមុនពេលស៊ីមមិនអាចប្រើបានជាអចិន្ត្រៃយ៍។ ទាក់ទង​ទៅ​ក្រុមហ៊ុន​សេវា​ទូរសព្ទ​សម្រាប់​ព័ត៌មាន​លម្អិត។</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-kn/strings.xml b/packages/SystemUI/res-keyguard/values-kn/strings.xml
index ef92951..39fdf55 100644
--- a/packages/SystemUI/res-keyguard/values-kn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kn/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="one">ಸಿಮ್ ಅನ್ನು ಈಗ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ಮುಂದುವರಿಸಲು PUK ಕೋಡ್ ನಮೂದಿಸಿ. ಸಿಮ್ ಶಾಶ್ವತವಾಗಿ ನಿಷ್ಪ್ರಯೋಜಕವಾಗುವ ಮುನ್ನ ನಿಮ್ಮಲ್ಲಿ <xliff:g id="_NUMBER_1">%d</xliff:g> ಪ್ರಯತ್ನಗಳು ಬಾಕಿ ಉಳಿದಿವೆ. ವಿವರಗಳಿಗಾಗಿ ವಾಹಕವನ್ನು ಸಂಪರ್ಕಿಸಿ.</item>
       <item quantity="other">ಸಿಮ್ ಅನ್ನು ಈಗ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ಮುಂದುವರಿಸಲು PUK ಕೋಡ್ ನಮೂದಿಸಿ. ಸಿಮ್ ಶಾಶ್ವತವಾಗಿ ನಿಷ್ಪ್ರಯೋಜಕವಾಗುವ ಮುನ್ನ ನಿಮ್ಮಲ್ಲಿ <xliff:g id="_NUMBER_1">%d</xliff:g> ಪ್ರಯತ್ನಗಳು ಬಾಕಿ ಉಳಿದಿವೆ. ವಿವರಗಳಿಗಾಗಿ ವಾಹಕವನ್ನು ಸಂಪರ್ಕಿಸಿ.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-ko/strings.xml b/packages/SystemUI/res-keyguard/values-ko/strings.xml
index 8a65c95..c20a9dd 100644
--- a/packages/SystemUI/res-keyguard/values-ko/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ko/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">SIM이 사용 중지되었습니다. 계속하려면 PUK 코드를 입력하세요. <xliff:g id="_NUMBER_1">%d</xliff:g>번 더 실패하면 SIM을 완전히 사용할 수 없게 됩니다. 자세한 내용은 이동통신사에 문의하세요.</item>
       <item quantity="one">SIM이 사용 중지되었습니다. 계속하려면 PUK 코드를 입력하세요. <xliff:g id="_NUMBER_0">%d</xliff:g>번 더 실패하면 SIM을 완전히 사용할 수 없게 됩니다. 자세한 내용은 이동통신사에 문의하세요.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-ky/strings.xml b/packages/SystemUI/res-keyguard/values-ky/strings.xml
index a7d5d45..9416843 100644
--- a/packages/SystemUI/res-keyguard/values-ky/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ky/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">SIM-карта азыр жарактан чыкты. Улантуу үчүн PUK-кодду киргизиңиз. SIM-картанын биротоло жарактан чыгарына <xliff:g id="_NUMBER_1">%d</xliff:g> аракет калды. Чоо-жайын билүү үчүн байланыш операторуна кайрылыңыз.</item>
       <item quantity="one">SIM-карта азыр жарактан чыкты. Улантуу үчүн PUK-кодду киргизиңиз. SIM-картанын биротоло жарактан чыгаарына <xliff:g id="_NUMBER_0">%d</xliff:g> аракет калды. Чоо-жайын билүү үчүн байланыш операторуна кайрылыңыз.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-lo/strings.xml b/packages/SystemUI/res-keyguard/values-lo/strings.xml
index 9f3de8b0..c00f2f0 100644
--- a/packages/SystemUI/res-keyguard/values-lo/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lo/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">ຕອນນີ້ປິດການນຳໃຊ້ SIM ແລ້ວ. ໃສ່ລະຫັດ PUK ເພື່ອດຳເນີນການຕໍ່. ທ່ານສາມາດລອງໄດ້ອີກ <xliff:g id="_NUMBER_1">%d</xliff:g> ເທື່ອກ່ອນທີ່ SIM ຈະບໍ່ສາມາດໃຊ້ໄດ້ຖາວອນ. ກະລຸນາຕິດຕໍ່ຜູ້ໃຫ້ບໍລິການສຳລັບລາຍລະອຽດ.</item>
       <item quantity="one">ຕອນນີ້ປິດການນຳໃຊ້ SIM ແລ້ວ. ໃສ່ລະຫັດ PUK ເພື່ອດຳເນີນການຕໍ່. ທ່ານສາມາດລອງໄດ້ອີກ <xliff:g id="_NUMBER_0">%d</xliff:g> ເທື່ອກ່ອນທີ່ SIM ຈະບໍ່ສາມາດໃຊ້ໄດ້ຖາວອນ. ກະລຸນາຕິດຕໍ່ຜູ້ໃຫ້ບໍລິການສຳລັບລາຍລະອຽດ.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-lt/strings.xml b/packages/SystemUI/res-keyguard/values-lt/strings.xml
index bdebf67..71e04f2 100644
--- a/packages/SystemUI/res-keyguard/values-lt/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lt/strings.xml
@@ -166,4 +166,78 @@
       <item quantity="many">SIM kortelė dabar yra išjungta. Jei norite tęsti, įveskite PUK kodą. Jums liko <xliff:g id="_NUMBER_1">%d</xliff:g> bandymo. Paskui visiškai nebegalėsite naudoti SIM kortelės. Jei reikia išsamios informacijos, susisiekite su operatoriumi.</item>
       <item quantity="other">SIM kortelė dabar yra išjungta. Jei norite tęsti, įveskite PUK kodą. Jums liko <xliff:g id="_NUMBER_1">%d</xliff:g> bandymų. Paskui visiškai nebegalėsite naudoti SIM kortelės. Jei reikia išsamios informacijos, susisiekite su operatoriumi.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-lv/strings.xml b/packages/SystemUI/res-keyguard/values-lv/strings.xml
index c68761d..4bdaa66 100644
--- a/packages/SystemUI/res-keyguard/values-lv/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lv/strings.xml
@@ -158,4 +158,78 @@
       <item quantity="one">SIM karte tagad ir atspējota. Ievadiet PUK kodu, lai turpinātu. Varat mēģināt vēl <xliff:g id="_NUMBER_1">%d</xliff:g> reizi. Kļūdas gadījumā SIM karti vairs nevarēs izmantot. Lai iegūtu detalizētu informāciju, sazinieties ar mobilo sakaru operatoru.</item>
       <item quantity="other">SIM karte tagad ir atspējota. Ievadiet PUK kodu, lai turpinātu. Varat mēģināt vēl <xliff:g id="_NUMBER_1">%d</xliff:g> reizes. Kļūdas gadījumā SIM karti vairs nevarēs izmantot. Lai iegūtu detalizētu informāciju, sazinieties ar mobilo sakaru operatoru.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-mk/strings.xml b/packages/SystemUI/res-keyguard/values-mk/strings.xml
index 0ace83f..b963d32 100644
--- a/packages/SystemUI/res-keyguard/values-mk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mk/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="one">SIM-картичката сега е оневозможена. Внесете PUK-код за да продолжите. Ви преостанува уште <xliff:g id="_NUMBER_1">%d</xliff:g> обид пред SIM-картичката да стане трајно неупотреблива. Контактирајте го операторот за детали.</item>
       <item quantity="other">SIM-картичката сега е оневозможена. Внесете PUK-код за да продолжите. Ви преостануваат уште <xliff:g id="_NUMBER_1">%d</xliff:g> обиди пред SIM-картичката да стане трајно неупотреблива. Контактирајте го операторот за детали.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-ml/strings.xml b/packages/SystemUI/res-keyguard/values-ml/strings.xml
index 779a532..0af354f 100644
--- a/packages/SystemUI/res-keyguard/values-ml/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ml/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">സിം ഇപ്പോൾ പ്രവർത്തനരഹിതമാക്കി. തുടരുന്നതിന് PUK കോഡ് നൽകുക. സിം ശാശ്വതമായി ഉപയോഗശൂന്യമാകുന്നതിന് മുമ്പായി <xliff:g id="_NUMBER_1">%d</xliff:g> ശ്രമങ്ങൾ കൂടി ശേഷിക്കുന്നു. വിശദാംശങ്ങൾക്ക് കാരിയറുമായി ബന്ധപ്പെടുക.</item>
       <item quantity="one">സിം ഇപ്പോൾ പ്രവർത്തനരഹിതമാക്കി. തുടരുന്നതിന് PUK കോഡ് നൽകുക. സിം ശാശ്വതമായി ഉപയോഗശൂന്യമാകുന്നതിന് മുമ്പായി <xliff:g id="_NUMBER_0">%d</xliff:g> ശ്രമം കൂടി ശേഷിക്കുന്നു. വിശദാംശങ്ങൾക്ക് കാരിയറുമായി ബന്ധപ്പെടുക.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-mn/strings.xml b/packages/SystemUI/res-keyguard/values-mn/strings.xml
index 189d407..9e16c6d 100644
--- a/packages/SystemUI/res-keyguard/values-mn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mn/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">SIM-г идэвхгүй болголоо. Үргэлжлүүлэхийн тулд PUK кодыг оруулна уу. Таны SIM бүрмөсөн хүчингүй болох хүртэл <xliff:g id="_NUMBER_1">%d</xliff:g> оролдлого үлдлээ. Дэлгэрэнгүй мэдээлэл авахын тулд оператор компанитайгаа холбогдоно уу.</item>
       <item quantity="one">SIM-г идэвхгүй болголоо. Үргэлжлүүлэхийн тулд PUK кодыг оруулна уу. Таны SIM бүрмөсөн хүчингүй болох хүртэл <xliff:g id="_NUMBER_0">%d</xliff:g> оролдлого үлдлээ. Дэлгэрэнгүй мэдээлэл авахын тулд оператор компанитайгаа холбогдоно уу.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-mr/strings.xml b/packages/SystemUI/res-keyguard/values-mr/strings.xml
index d412252..b27b299 100644
--- a/packages/SystemUI/res-keyguard/values-mr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mr/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="one">सिम आता बंद केलेले आहे. सुरू ठेवण्यासाठी PUK कोड टाका. सिम कायमचे बंद होण्याआधी तुमच्याकडे <xliff:g id="_NUMBER_1">%d</xliff:g> प्रयत्न शिल्लक आहे. तपशीलांसाठी वाहकाशी संपर्क साधा.</item>
       <item quantity="other">सिम आता बंद केलेले आहे. सुरू ठेवण्यासाठी PUK कोड टाका. सिम कायमचे बंद होण्याआधी तुमच्याकडे <xliff:g id="_NUMBER_1">%d</xliff:g> प्रयत्न शिल्लक आहेत. तपशीलांसाठी वाहकाशी संपर्क साधा.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-ms/strings.xml b/packages/SystemUI/res-keyguard/values-ms/strings.xml
index 9e10298..c16f433 100644
--- a/packages/SystemUI/res-keyguard/values-ms/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ms/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">Kini SIM dilumpuhkan. Masukkan kod PUK untuk meneruskan. Tinggal <xliff:g id="_NUMBER_1">%d</xliff:g> percubaan sebelum SIM tidak boleh digunakan secara kekal. Hubungi pembawa untuk mendapatkan butiran.</item>
       <item quantity="one">Kini SIM dilumpuhkan. Masukkan kod PUK untuk meneruskan. Tinggal <xliff:g id="_NUMBER_0">%d</xliff:g> percubaan sebelum SIM tidak boleh digunakan secara kekal. Hubungi pembawa untuk mendapatkan butiran.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-my/strings.xml b/packages/SystemUI/res-keyguard/values-my/strings.xml
index 87fca07..0d011af 100644
--- a/packages/SystemUI/res-keyguard/values-my/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-my/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">ဆင်းမ်ကဒ်သည် ယခု ပိတ်သွားပါပြီ။ ရှေ့ဆက်ရန် PUK ကုဒ်ကို ထည့်ပါ။ ဆင်းမ်ကဒ် အပြီးပိတ်မသွားမီ သင့်တွင် <xliff:g id="_NUMBER_1">%d</xliff:g> ကြိမ် စမ်းသပ်ခွင့် ကျန်ပါသေးသည်။ အသေးစိတ်အချက်များအတွက် ဝန်ဆောင်မှုပေးသူကို ဆက်သွယ်ပါ။</item>
       <item quantity="one">ဆင်းမ်ကဒ်သည် ယခု ပိတ်သွားပါပြီ။ ရှေ့ဆက်ရန် PUK ကုဒ်ကို ထည့်ပါ။ ဆင်းမ်ကဒ် အပြီးပိတ်မသွားမီ သင့်တွင် <xliff:g id="_NUMBER_0">%d</xliff:g> ကြိမ် စမ်းသပ်ခွင့် ကျန်ပါသေးသည်။ အသေးစိတ်အချက်များအတွက် ဝန်ဆောင်မှုပေးသူကို ဆက်သွယ်ပါ။</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-nb/strings.xml b/packages/SystemUI/res-keyguard/values-nb/strings.xml
index 977784c..dc54489 100644
--- a/packages/SystemUI/res-keyguard/values-nb/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-nb/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">SIM-kortet er deaktivert nå. Skriv inn PUK-koden for å fortsette. Du har <xliff:g id="_NUMBER_1">%d</xliff:g> forsøk igjen før SIM-kortet blir permanent ubrukelig. Kontakt operatøren for å få vite mer.</item>
       <item quantity="one">SIM-kortet er deaktivert nå. Skriv inn PUK-koden for å fortsette. Du har <xliff:g id="_NUMBER_0">%d</xliff:g> forsøk igjen før SIM-kortet blir permanent ubrukelig. Kontakt operatøren for å få vite mer.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-ne/strings.xml b/packages/SystemUI/res-keyguard/values-ne/strings.xml
index c21faea..be39c32 100644
--- a/packages/SystemUI/res-keyguard/values-ne/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ne/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">SIM लाई असक्षम पारिएको छ। जारी राख्न PUK कोड प्रविष्टि गर्नुहोस्। तपाईंसँग <xliff:g id="_NUMBER_1">%d</xliff:g> प्रयासहरू बाँकी छन्, त्यसपछि SIM सदाका लागि प्रयोग गर्न नमिल्ने हुन्छ। विवरणहरूका लागि सेवा प्रदायकलाई सम्पर्क गर्नुहोस्।</item>
       <item quantity="one">SIM लाई असक्षम पारिएको छ। जारी राख्न PUK कोड प्रविष्टि गर्नुहोस्। तपाईंसँग <xliff:g id="_NUMBER_0">%d</xliff:g> प्रयास बाँकी छ, त्यसपछि SIM सदाका लागि प्रयोग गर्न नमिल्ने हुन्छ। विवरणहरूका लागि सेवा प्रदायकलाई सम्पर्क गर्नुहोस्।</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-nl/strings.xml b/packages/SystemUI/res-keyguard/values-nl/strings.xml
index f80749f..5c911be 100644
--- a/packages/SystemUI/res-keyguard/values-nl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-nl/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">De simkaart is nu uitgeschakeld. Geef de pukcode op om door te gaan. Je hebt nog <xliff:g id="_NUMBER_1">%d</xliff:g> pogingen over voordat de simkaart definitief onbruikbaar wordt. Neem contact op met je provider voor meer informatie.</item>
       <item quantity="one">De simkaart is nu uitgeschakeld. Geef de pukcode op om door te gaan. Je hebt nog <xliff:g id="_NUMBER_0">%d</xliff:g> poging over voordat de simkaart definitief onbruikbaar wordt. Neem contact op met je provider voor meer informatie.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-or/strings.xml b/packages/SystemUI/res-keyguard/values-or/strings.xml
index eff493b..58242e6 100644
--- a/packages/SystemUI/res-keyguard/values-or/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-or/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">SIM କାର୍ଡକୁ ବର୍ତ୍ତମାନ ଅକ୍ଷମ କରିଦିଆଯାଇଛି। ଜାରି ରଖିବାକୁ PUK କୋଡ୍‍ ଲେଖନ୍ତୁ। ଆଉ <xliff:g id="_NUMBER_1">%d</xliff:g> ଥର ଭୁଲ କୋଡ୍‍ ଲେଖିବା ପରେ SIM କାର୍ଡ ସ୍ଥାୟୀ ଭାବେ ଅନୁପଯୋଗୀ ହୋଇଯିବ। ବିବରଣୀ ପାଇଁ କେରିଅର୍‌ର ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।</item>
       <item quantity="one">SIM କାର୍ଡକୁ ବର୍ତ୍ତମାନ ଅକ୍ଷମ କରିଦିଆଯାଇଛି। ଜାରି ରଖିବାକୁ PUK କୋଡ୍‍ ଲେଖନ୍ତୁ। ଆଉ <xliff:g id="_NUMBER_0">%d</xliff:g> ଥର ଭୁଲ କୋଡ୍‍ ଲେଖିବା ପରେ SIM କାର୍ଡ ସ୍ଥାୟୀ ଭାବେ ଅନୁପଯୋଗୀ ହୋଇଯିବ। ବିବରଣୀ ପାଇଁ କେରିଅର୍‌ର ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml
index 08245dc..a435c79 100644
--- a/packages/SystemUI/res-keyguard/values-pa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="one">ਸਿਮ ਹੁਣ ਬੰਦ ਹੋ ਗਿਆ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ PUK ਕੋਡ ਦਾਖਲ ਕਰੋ। ਸਿਮ ਦੇ ਪੱਕੇ ਤੌਰ \'ਤੇ ਬੇਕਾਰ ਹੋ ਜਾਣ ਤੋਂ ਪਹਿਲਾਂ ਤੁਹਾਡੇ ਕੋਲ <xliff:g id="_NUMBER_1">%d</xliff:g> ਕੋਸ਼ਿਸ਼ ਬਾਕੀ ਹੈ। ਵੇਰਵਿਆਂ ਲਈ ਕੈਰੀਅਰ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।</item>
       <item quantity="other">ਸਿਮ ਹੁਣ ਬੰਦ ਹੋ ਗਿਆ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ PUK ਕੋਡ ਦਾਖਲ ਕਰੋ। ਸਿਮ ਦੇ ਪੱਕੇ ਤੌਰ \'ਤੇ ਬੇਕਾਰ ਹੋ ਜਾਣ ਤੋਂ ਪਹਿਲਾਂ ਤੁਹਾਡੇ ਕੋਲ <xliff:g id="_NUMBER_1">%d</xliff:g> ਕੋਸ਼ਿਸ਼ਾਂ ਬਾਕੀ ਹਨ। ਵੇਰਵਿਆਂ ਲਈ ਕੈਰੀਅਰ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-pl/strings.xml b/packages/SystemUI/res-keyguard/values-pl/strings.xml
index 49792e2..51c7ac8 100644
--- a/packages/SystemUI/res-keyguard/values-pl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pl/strings.xml
@@ -166,4 +166,78 @@
       <item quantity="other">Karta SIM została wyłączona. Wpisz kod PUK, by przejść dalej. Masz jeszcze <xliff:g id="_NUMBER_1">%d</xliff:g> próby, zanim karta SIM zostanie trwale zablokowana. Aby uzyskać szczegółowe informacje, skontaktuj się z operatorem.</item>
       <item quantity="one">Karta SIM została wyłączona. Wpisz kod PUK, by przejść dalej. Masz jeszcze <xliff:g id="_NUMBER_0">%d</xliff:g> próbę, zanim karta SIM zostanie trwale zablokowana. Aby uzyskać szczegółowe informacje, skontaktuj się z operatorem.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
index 90f46ce..6698bf9 100644
--- a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="one">O chip agora está desativado. Informe o código PUK para continuar. Você tem <xliff:g id="_NUMBER_1">%d</xliff:g> tentativa restante antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes.</item>
       <item quantity="other">O chip agora está desativado. Informe o código PUK para continuar. Você tem <xliff:g id="_NUMBER_1">%d</xliff:g> tentativas restantes antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
index 321b898..118f05f 100644
--- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">O SIM encontra-se desativado. Introduza o código PUK para continuar. Tem mais <xliff:g id="_NUMBER_1">%d</xliff:g> tentativas antes de o cartão SIM ficar permanentemente inutilizável. Contacte o operador para obter mais detalhes.</item>
       <item quantity="one">O SIM encontra-se desativado. Introduza o código PUK para continuar. Tem mais <xliff:g id="_NUMBER_0">%d</xliff:g> tentativa antes de o cartão SIM ficar permanentemente inutilizável. Contacte o operador para obter mais detalhes.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-pt/strings.xml b/packages/SystemUI/res-keyguard/values-pt/strings.xml
index 90f46ce..6698bf9 100644
--- a/packages/SystemUI/res-keyguard/values-pt/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="one">O chip agora está desativado. Informe o código PUK para continuar. Você tem <xliff:g id="_NUMBER_1">%d</xliff:g> tentativa restante antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes.</item>
       <item quantity="other">O chip agora está desativado. Informe o código PUK para continuar. Você tem <xliff:g id="_NUMBER_1">%d</xliff:g> tentativas restantes antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-ro/strings.xml b/packages/SystemUI/res-keyguard/values-ro/strings.xml
index 083adbd..915a47b 100644
--- a/packages/SystemUI/res-keyguard/values-ro/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ro/strings.xml
@@ -158,4 +158,78 @@
       <item quantity="other">Cardul SIM este dezactivat acum. Introduceți codul PUK pentru a continua. V-au mai rămas <xliff:g id="_NUMBER_1">%d</xliff:g> de încercări până când cardul SIM va deveni inutilizabil definitiv. Contactați operatorul pentru detalii.</item>
       <item quantity="one">Cardul SIM este dezactivat acum. Introduceți codul PUK pentru a continua. V-a mai rămas <xliff:g id="_NUMBER_0">%d</xliff:g> încercare până când cardul SIM va deveni inutilizabil definitiv. Contactați operatorul pentru detalii.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-ru/strings.xml b/packages/SystemUI/res-keyguard/values-ru/strings.xml
index e5b1d0e..d036e0d 100644
--- a/packages/SystemUI/res-keyguard/values-ru/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ru/strings.xml
@@ -166,4 +166,78 @@
       <item quantity="many">SIM-карта отключена. Чтобы продолжить, введите PUK-код. Осталось <xliff:g id="_NUMBER_1">%d</xliff:g> попыток. После этого SIM-карта будет заблокирована навсегда. За подробной информацией обратитесь к оператору связи.</item>
       <item quantity="other">SIM-карта отключена. Чтобы продолжить, введите PUK-код. Осталось <xliff:g id="_NUMBER_1">%d</xliff:g> попытки. После этого SIM-карта будет заблокирована навсегда. За подробной информацией обратитесь к оператору связи.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-si/strings.xml b/packages/SystemUI/res-keyguard/values-si/strings.xml
index 1955edd..7073526 100644
--- a/packages/SystemUI/res-keyguard/values-si/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-si/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="one">SIM දැන් අබල කර ඇත. දිගටම කරගෙන යාමට PUK කේතය ඇතුළු කරන්න. SIM ස්ථිරවම භාවිත කළ නොහැකි බවට පත් වීමට පෙර ඔබ සතුව උත්සාහයන් <xliff:g id="_NUMBER_1">%d</xliff:g>ක් ඉතිරිව ඇත. විස්තර සඳහා වාහක සම්බන්ධ කර ගන්න.</item>
       <item quantity="other">SIM දැන් අබල කර ඇත. දිගටම කරගෙන යාමට PUK කේතය ඇතුළු කරන්න. SIM ස්ථිරවම භාවිත කළ නොහැකි බවට පත් වීමට පෙර ඔබ සතුව උත්සාහයන් <xliff:g id="_NUMBER_1">%d</xliff:g>ක් ඉතිරිව ඇත. විස්තර සඳහා වාහක සම්බන්ධ කර ගන්න.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-sk/strings.xml b/packages/SystemUI/res-keyguard/values-sk/strings.xml
index f9f39e5..9f0501c 100644
--- a/packages/SystemUI/res-keyguard/values-sk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sk/strings.xml
@@ -166,4 +166,78 @@
       <item quantity="other">SIM karta je deaktivovaná. Pokračujte zadaním kódu PUK. Zostáva vám <xliff:g id="_NUMBER_1">%d</xliff:g> pokusov, potom sa SIM karta natrvalo zablokuje. Podrobnosti vám poskytne operátor.</item>
       <item quantity="one">SIM karta je deaktivovaná. Pokračujte zadaním kódu PUK. Zostáva vám <xliff:g id="_NUMBER_0">%d</xliff:g> pokus, potom sa SIM karta natrvalo zablokuje. Podrobnosti vám poskytne operátor.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-sl/strings.xml b/packages/SystemUI/res-keyguard/values-sl/strings.xml
index 2a4417c..afc6ee1b 100644
--- a/packages/SystemUI/res-keyguard/values-sl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sl/strings.xml
@@ -166,4 +166,78 @@
       <item quantity="few">Kartica SIM je zdaj onemogočena. Če želite nadaljevati, vnesite kodo PUK. Na voljo imate še <xliff:g id="_NUMBER_1">%d</xliff:g> poskuse. Potem bo kartica SIM postala trajno neuporabna. Za podrobnosti se obrnite na operaterja.</item>
       <item quantity="other">Kartica SIM je zdaj onemogočena. Če želite nadaljevati, vnesite kodo PUK. Na voljo imate še <xliff:g id="_NUMBER_1">%d</xliff:g> poskusov. Potem bo kartica SIM postala trajno neuporabna. Za podrobnosti se obrnite na operaterja.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-sq/strings.xml b/packages/SystemUI/res-keyguard/values-sq/strings.xml
index 4057e03..d8e68d7 100644
--- a/packages/SystemUI/res-keyguard/values-sq/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sq/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">Karta SIM tani është çaktivizuar. Fut kodin PUK për të vazhduar. Të kanë mbetur edhe <xliff:g id="_NUMBER_1">%d</xliff:g> përpjekje përpara se karta SIM të bëhet përgjithmonë e papërdorshme. Kontakto me operatorin për detaje.</item>
       <item quantity="one">Karta SIM tani është çaktivizuar. Fut kodin PUK për të vazhduar. Të ka mbetur edhe <xliff:g id="_NUMBER_0">%d</xliff:g> përpjekje përpara se karta SIM të bëhet përgjithmonë e papërdorshme. Kontakto me operatorin për detaje.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-sr/strings.xml b/packages/SystemUI/res-keyguard/values-sr/strings.xml
index 16c1bde..c576493 100644
--- a/packages/SystemUI/res-keyguard/values-sr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sr/strings.xml
@@ -158,4 +158,78 @@
       <item quantity="few">SIM је сада онемогућен. Унесите PUK кôд да бисте наставили. Имате још <xliff:g id="_NUMBER_1">%d</xliff:g> покушаја пре него што SIM постане трајно неупотребљив. Детаљне информације потражите од мобилног оператера.</item>
       <item quantity="other">SIM је сада онемогућен. Унесите PUK кôд да бисте наставили. Имате још <xliff:g id="_NUMBER_1">%d</xliff:g> покушаја пре него што SIM постане трајно неупотребљив. Детаљне информације потражите од мобилног оператера.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-sv/strings.xml b/packages/SystemUI/res-keyguard/values-sv/strings.xml
index 8e75aa2..dfa570b 100644
--- a/packages/SystemUI/res-keyguard/values-sv/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sv/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">SIM-kortet är inaktiverat. Ange PUK-koden om du vill fortsätta. <xliff:g id="_NUMBER_1">%d</xliff:g> försök återstår innan SIM-kortet blir obrukbart. Kontakta operatören för mer information.</item>
       <item quantity="one">SIM-kortet är inaktiverat. Ange PUK-koden om du vill fortsätta. <xliff:g id="_NUMBER_0">%d</xliff:g> försök återstår innan SIM-kortet blir obrukbart. Kontakta operatören för mer information.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-sw/strings.xml b/packages/SystemUI/res-keyguard/values-sw/strings.xml
index e5277b2..00334be 100644
--- a/packages/SystemUI/res-keyguard/values-sw/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sw/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">Sasa SIM imefungwa. Weka msimbo wa PUK ili uendelee. Umesalia na majaribio <xliff:g id="_NUMBER_1">%d</xliff:g> kabla ya SIM kuacha kufanya kazi kabisa. Wasiliana na mtoa huduma kwa maelezo.</item>
       <item quantity="one">Sasa SIM imefungwa. Weka msimbo wa PUK ili uendelee. Umesalia na jaribio <xliff:g id="_NUMBER_0">%d</xliff:g> kabla ya SIM kuacha kufanya kazi kabisa. Wasiliana na mtoa huduma kwa maelezo.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-ta/strings.xml b/packages/SystemUI/res-keyguard/values-ta/strings.xml
index f5fb357..d978643 100644
--- a/packages/SystemUI/res-keyguard/values-ta/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ta/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">சிம் தற்போது முடக்கப்பட்டுள்ளது. தொடர்வதற்கு, PUK குறியீட்டை உள்ளிடவும். நீங்கள் <xliff:g id="_NUMBER_1">%d</xliff:g> முறை மட்டுமே முயற்சிக்க முடியும். அதன்பிறகு சிம் நிரந்தரமாக முடக்கப்படும். விவரங்களுக்கு, மொபைல் நிறுவனத்தைத் தொடர்புகொள்ளவும்.</item>
       <item quantity="one">சிம் தற்போது முடக்கப்பட்டுள்ளது. தொடர்வதற்கு, PUK குறியீட்டை உள்ளிடவும். நீங்கள் <xliff:g id="_NUMBER_0">%d</xliff:g> முறை மட்டுமே முயற்சிக்க முடியும். அதன்பிறகு சிம் நிரந்தரமாக முடக்கப்படும். விவரங்களுக்கு, மொபைல் நிறுவனத்தைத் தொடர்புகொள்ளவும்.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-te/strings.xml b/packages/SystemUI/res-keyguard/values-te/strings.xml
index 1e08177..8a8df34 100644
--- a/packages/SystemUI/res-keyguard/values-te/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-te/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">SIM ఇప్పుడు నిలిపివేయబడింది. PUK కోడ్‌ను నమోదు చేయండి. SIM శాశ్వతంగా నిరుపయోగం కాకుండా ఉండటానికి మీకు <xliff:g id="_NUMBER_1">%d</xliff:g> ప్రయత్నాలు మిగిలి ఉన్నాయి. వివరాల కోసం కారియర్‌ను సంప్రదించండి.</item>
       <item quantity="one">SIM ఇప్పుడు నిలిపివేయబడింది. PUK కోడ్‌ను నమోదు చేయండి. SIM శాశ్వతంగా నిరుపయోగం కాకుండా ఉండటానికి మీకు <xliff:g id="_NUMBER_0">%d</xliff:g> ప్రయత్నం మిగిలి ఉంది వివరాల కోసం కారియర్‌ను సంప్రదించండి.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-th/strings.xml b/packages/SystemUI/res-keyguard/values-th/strings.xml
index bde50f3..a8577a7 100644
--- a/packages/SystemUI/res-keyguard/values-th/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-th/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">ซิมถูกปิดใช้งานในขณะนี้ โปรดป้อนรหัส PUK เพื่อทำต่อ คุณพยายามได้อีก <xliff:g id="_NUMBER_1">%d</xliff:g> ครั้งก่อนที่ซิมจะไม่สามารถใช้งานได้อย่างถาวร โปรดติดต่อสอบถามรายละเอียดจากผู้ให้บริการ</item>
       <item quantity="one">ซิมถูกปิดใช้งานในขณะนี้ โปรดป้อนรหัส PUK เพื่อทำต่อ คุณพยายามได้อีก <xliff:g id="_NUMBER_0">%d</xliff:g> ครั้งก่อนที่ซิมจะไม่สามารถใช้งานได้อย่างถาวร โปรดติดต่อสอบถามรายละเอียดจากผู้ให้บริการ</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-tl/strings.xml b/packages/SystemUI/res-keyguard/values-tl/strings.xml
index 71a7537..b3609d1 100644
--- a/packages/SystemUI/res-keyguard/values-tl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-tl/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="one">Naka-disable na ang SIM. Ilagay ang PUK code upang magpatuloy. Mayroon kang <xliff:g id="_NUMBER_1">%d</xliff:g> natitirang pagsubok bago tuluyang hindi magamit ang SIM. Makipag-ugnayan sa carrier para sa mga detalye.</item>
       <item quantity="other">Naka-disable na ang SIM. Ilagay ang PUK code upang magpatuloy. Mayroon kang <xliff:g id="_NUMBER_1">%d</xliff:g> na natitirang pagsubok bago tuluyang hindi magamit ang SIM. Makipag-ugnayan sa carrier para sa mga detalye.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-tr/strings.xml b/packages/SystemUI/res-keyguard/values-tr/strings.xml
index fbbf63e..018e271 100644
--- a/packages/SystemUI/res-keyguard/values-tr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-tr/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">SIM artık devre dışı. Devam etmek için PUK kodunu girin. SIM kalıcı olarak kullanım dışı kalmadan önce <xliff:g id="_NUMBER_1">%d</xliff:g> deneme hakkınız kaldı. Ayrıntılı bilgi için operatörünüzle iletişim kurun.</item>
       <item quantity="one">SIM artık devre dışı. Devam etmek için PUK kodunu girin. SIM kalıcı olarak kullanım dışı kalmadan önce <xliff:g id="_NUMBER_0">%d</xliff:g> deneme hakkınız kaldı. Ayrıntılı bilgi için operatörünüzle iletişim kurun.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-uk/strings.xml b/packages/SystemUI/res-keyguard/values-uk/strings.xml
index feab22f..92ca57b 100644
--- a/packages/SystemUI/res-keyguard/values-uk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-uk/strings.xml
@@ -166,4 +166,78 @@
       <item quantity="many">SIM-карту заблоковано. Щоб продовжити, введіть PUK-код. Залишилося <xliff:g id="_NUMBER_1">%d</xliff:g> спроб. Після цього SIM-карту буде назавжди заблоковано. Щоб дізнатися більше, зверніться до свого оператора.</item>
       <item quantity="other">SIM-карту заблоковано. Щоб продовжити, введіть PUK-код. Залишилося <xliff:g id="_NUMBER_1">%d</xliff:g> спроби. Після цього SIM-карту буде назавжди заблоковано. Щоб дізнатися більше, зверніться до свого оператора.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-ur/strings.xml b/packages/SystemUI/res-keyguard/values-ur/strings.xml
index 928fcbdb..ace9f79 100644
--- a/packages/SystemUI/res-keyguard/values-ur/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ur/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">‏SIM اب غیر فعال ہے۔ جاری رکھنے کیلئے PUK کوڈ درج کریں۔ SIM کے مستقل طور پر ناقابل استعمال ہونے سے پہلے آپ کے پاس <xliff:g id="_NUMBER_1">%d</xliff:g> کوششیں بچی ہیں۔ تفصیلات کیلئے کیریئر سے رابطہ کریں۔</item>
       <item quantity="one">‏SIM اب غیر فعال ہے۔ جاری رکھنے کیلئے PUK کوڈ درج کریں۔ SIM کے مستقل طور پر ناقابل استعمال ہونے سے پہلے آپ کے پاس <xliff:g id="_NUMBER_0">%d</xliff:g> کوشش بچی ہے۔ تفصیلات کیلئے کیریئر سے رابطہ کریں۔</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-uz/strings.xml b/packages/SystemUI/res-keyguard/values-uz/strings.xml
index faa7d50..1766d11 100644
--- a/packages/SystemUI/res-keyguard/values-uz/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-uz/strings.xml
@@ -152,4 +152,78 @@
       <item quantity="other">SIM karta faolsizlantirildi. Davom etish uchun PUK kodni kiriting. Yana <xliff:g id="_NUMBER_1">%d</xliff:g> marta xato qilsangiz, SIM kartangiz butunlay qulflanadi. Batafsil axborot olish uchun tarmoq operatoriga murojaat qiling.</item>
       <item quantity="one">SIM karta faolsizlantirildi. Davom etish uchun PUK kodni kiriting. Yana <xliff:g id="_NUMBER_0">%d</xliff:g> marta xato qilsangiz, SIM kartangiz butunlay qulflanadi. Batafsil axborot olish uchun tarmoq operatoriga murojaat qiling.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-vi/strings.xml b/packages/SystemUI/res-keyguard/values-vi/strings.xml
index 6b06513..eb6e536 100644
--- a/packages/SystemUI/res-keyguard/values-vi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-vi/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">SIM hiện đã bị tắt. Hãy nhập mã PUK để tiếp tục. Bạn còn <xliff:g id="_NUMBER_1">%d</xliff:g> lần thử trước khi SIM vĩnh viễn không sử dụng được. Hãy liên hệ với nhà cung cấp dịch vụ để biết chi tiết.</item>
       <item quantity="one">SIM hiện đã bị tắt. Hãy nhập mã PUK để tiếp tục. Bạn còn <xliff:g id="_NUMBER_0">%d</xliff:g> lần thử trước khi SIM vĩnh viễn không thể sử dụng được. Hãy liên hệ với nhà cung cấp dịch vụ để biết chi tiết.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
index 44f06a6..5fafe2f 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">SIM 卡现已停用,请输入 PUK 码继续使用。您还可以尝试 <xliff:g id="_NUMBER_1">%d</xliff:g> 次。如果仍不正确,该 SIM 卡将永远无法使用。有关详情,请联系您的运营商。</item>
       <item quantity="one">SIM 卡现已停用,请输入 PUK 码继续使用。您还可以尝试 <xliff:g id="_NUMBER_0">%d</xliff:g> 次。如果仍不正确,该 SIM 卡将永远无法使用。有关详情,请联系您的运营商。</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
index 364f126..0181ed3 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">SIM 卡已停用。請輸入 PUK 碼以繼續進行。您還可以再試 <xliff:g id="_NUMBER_1">%d</xliff:g> 次。如果仍然輸入錯誤,SIM 卡將永久無法使用。詳情請與流動網絡供應商聯絡。</item>
       <item quantity="one">SIM 卡已停用。請輸入 PUK 碼以繼續進行。您還可以再試 <xliff:g id="_NUMBER_0">%d</xliff:g> 次。如果仍然輸入錯誤,SIM 卡將永久無法使用。詳情請與流動網絡供應商聯絡。</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
index f687397..126304f 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="other">SIM 卡現在已遭停用。請輸入 PUK 碼以繼續進行。你還可以再試 <xliff:g id="_NUMBER_1">%d</xliff:g> 次,如果仍然失敗,SIM 卡將永久無法使用。詳情請與電信業者聯絡。</item>
       <item quantity="one">SIM 卡現在已遭停用。請輸入 PUK 碼以繼續進行。你還可以再試 <xliff:g id="_NUMBER_0">%d</xliff:g> 次,如果仍然失敗,SIM 卡將永久無法使用。詳情請與電信業者聯絡。</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-zu/strings.xml b/packages/SystemUI/res-keyguard/values-zu/strings.xml
index 66904eb..6a62d52 100644
--- a/packages/SystemUI/res-keyguard/values-zu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zu/strings.xml
@@ -150,4 +150,78 @@
       <item quantity="one">I-SIM manje ikhutshaziwe. Faka ikhodi ye-PUK ukuze uqhubeke. Unemizamo engu-<xliff:g id="_NUMBER_1">%d</xliff:g> esele ngaphambi kokuthi i-SIM ingasebenziseki unaphakade. Xhumana nenkampani yenethiwekhi ngemininingwane.</item>
       <item quantity="other">I-SIM manje ikhutshaziwe. Faka ikhodi ye-PUK ukuze uqhubeke. Unemizamo engu-<xliff:g id="_NUMBER_1">%d</xliff:g> esele ngaphambi kokuthi i-SIM ingasebenziseki unaphakade. Xhumana nenkampani yenethiwekhi ngemininingwane.</item>
     </plurals>
+    <!-- no translation found for type_clock_header (4786545441902447636) -->
+    <skip />
+    <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+    <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+    <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+    <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+    <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+    <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+    <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+    <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+    <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+    <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+    <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+    <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+    <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+    <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+    <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+    <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+    <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+    <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+    <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+    <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+    <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+    <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+    <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+    <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+    <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+    <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+    <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+    <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+    <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+    <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+    <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+    <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+    <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+    <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+    <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+    <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+    <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+    <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+    <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+    <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+    <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+    <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+    <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+    <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+    <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+    <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+    <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+    <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+    <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+    <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+    <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+    <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+    <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+    <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+    <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+    <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+    <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+    <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+    <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+    <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+    <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+    <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+    <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+    <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+    <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+    <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+    <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+    <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+    <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+    <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+    <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+    <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values/strings.xml b/packages/SystemUI/res-keyguard/values/strings.xml
index 7432f9c..41acf82 100644
--- a/packages/SystemUI/res-keyguard/values/strings.xml
+++ b/packages/SystemUI/res-keyguard/values/strings.xml
@@ -405,7 +405,7 @@
     <!-- Header for typographic clock face. [CHAR LIMIT=8] -->
     <string name="type_clock_header">It\u2019s</string>
 
-    <!-- Hour displayed in words on the typographic clock face. [CHAR LIMIT=8] -->
+    <!-- Hour displayed in words on the typographic clock face. [CHAR LIMIT=12] -->
     <string-array name="type_clock_hours">
         <item>Twelve</item>
         <item>One</item>
@@ -421,7 +421,7 @@
         <item>Eleven</item>
     </string-array>
 
-    <!-- Minutes displayed in words on the typographic clock face. [CHAR LIMIT=16] -->
+    <!-- Minutes displayed in words on the typographic clock face. [CHAR LIMIT=20] -->
     <string-array name="type_clock_minutes">
         <item>O\u2019Clock</item>
         <item>O\u2019One</item>
diff --git a/packages/SystemUI/res-keyguard/values/styles.xml b/packages/SystemUI/res-keyguard/values/styles.xml
index b9966cf..8bbc270 100644
--- a/packages/SystemUI/res-keyguard/values/styles.xml
+++ b/packages/SystemUI/res-keyguard/values/styles.xml
@@ -103,4 +103,10 @@
         <item name="android:textSize">@dimen/widget_label_font_size</item>
     </style>
 
+    <style name="TextAppearance.Keyguard.BottomArea">
+        <item name="android:textSize">16sp</item>
+        <item name="android:maxLines">1</item>
+        <item name="android:textColor">?attr/wallpaperTextColor</item>
+    </style>
+
 </resources>
diff --git a/packages/SystemUI/res/anim/error_to_trustedstate_bottompath_animation.xml b/packages/SystemUI/res/anim/error_to_trustedstate_bottompath_animation.xml
deleted file mode 100644
index 073bf6d..0000000
--- a/packages/SystemUI/res/anim/error_to_trustedstate_bottompath_animation.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <objectAnimator
-        android:duration="283"
-        android:propertyName="pathData"
-        android:valueFrom="M 0.0,-1.1 l 0.0,0.0 c 0.60751322478,0.0 1.1,0.49248677522 1.1,1.1 l 0.0,0.0 c 0.0,0.60751322478 -0.49248677522,1.1 -1.1,1.1 l 0.0,0.0 c -0.60751322478,0.0 -1.1,-0.49248677522 -1.1,-1.1 l 0.0,0.0 c 0.0,-0.60751322478 0.49248677522,-1.1 1.1,-1.1 Z"
-        android:valueTo="M 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
-        android:valueType="pathType"
-        android:interpolator="@interpolator/error_to_trustedstate_animation_interpolator_0" />
-</set>
diff --git a/packages/SystemUI/res/anim/error_to_trustedstate_circlepath_animation.xml b/packages/SystemUI/res/anim/error_to_trustedstate_circlepath_animation.xml
deleted file mode 100644
index 990392d..0000000
--- a/packages/SystemUI/res/anim/error_to_trustedstate_circlepath_animation.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <objectAnimator
-        android:duration="383"
-        android:propertyName="trimPathEnd"
-        android:valueFrom="1.0"
-        android:valueTo="0.0"
-        android:valueType="floatType"
-        android:interpolator="@android:interpolator/fast_out_slow_in" />
-</set>
diff --git a/packages/SystemUI/res/anim/error_to_trustedstate_ellipse_path_1_animation.xml b/packages/SystemUI/res/anim/error_to_trustedstate_ellipse_path_1_animation.xml
deleted file mode 100644
index a00d937..0000000
--- a/packages/SystemUI/res/anim/error_to_trustedstate_ellipse_path_1_animation.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="350"
-            android:propertyName="pathData"
-            android:valueFrom="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
-            android:valueTo="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
-            android:valueType="pathType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="200"
-            android:propertyName="pathData"
-            android:valueFrom="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
-            android:valueTo="M 0.0,-1.988645 c 1.09829830627,0.0 1.988645,0.890346693734 1.988645,1.988645 c 0.0,1.09829830627 -0.890346693734,1.988645 -1.988645,1.988645 c -1.09829830627,0.0 -1.988645,-0.890346693734 -1.988645,-1.988645 c 0.0,-1.09829830627 0.890346693734,-1.988645 1.988645,-1.988645 Z"
-            android:valueType="pathType"
-            android:interpolator="@interpolator/error_to_trustedstate_animation_interpolator_6" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/error_to_trustedstate_errorcircle_animation.xml b/packages/SystemUI/res/anim/error_to_trustedstate_errorcircle_animation.xml
deleted file mode 100644
index 59d6232..0000000
--- a/packages/SystemUI/res/anim/error_to_trustedstate_errorcircle_animation.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="33"
-            android:propertyName="rotation"
-            android:valueFrom="5.0"
-            android:valueTo="5.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="366"
-            android:propertyName="rotation"
-            android:valueFrom="5.0"
-            android:valueTo="-180.0"
-            android:valueType="floatType"
-            android:interpolator="@interpolator/error_to_trustedstate_animation_interpolator_1" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/error_to_trustedstate_errorexclamationdot_animation.xml b/packages/SystemUI/res/anim/error_to_trustedstate_errorexclamationdot_animation.xml
deleted file mode 100644
index 55bfa58..0000000
--- a/packages/SystemUI/res/anim/error_to_trustedstate_errorexclamationdot_animation.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <objectAnimator
-        android:duration="283"
-        android:propertyXName="translateX"
-        android:propertyYName="translateY"
-        android:pathData="M 12.0,12.0 c 0.0,-0.66667 0.0,-3.33333 0.0,-4.0"
-        android:interpolator="@interpolator/error_to_trustedstate_animation_interpolator_5" />
-</set>
diff --git a/packages/SystemUI/res/anim/error_to_trustedstate_exclamationtop_animation.xml b/packages/SystemUI/res/anim/error_to_trustedstate_exclamationtop_animation.xml
deleted file mode 100644
index 4c44c6b..0000000
--- a/packages/SystemUI/res/anim/error_to_trustedstate_exclamationtop_animation.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <objectAnimator
-        android:duration="283"
-        android:propertyXName="translateX"
-        android:propertyYName="translateY"
-        android:pathData="M 0.0,-2.0 c 0.0,0.5 0.0,2.5 0.0,3.0"
-        android:interpolator="@interpolator/error_to_trustedstate_animation_interpolator_2" />
-</set>
diff --git a/packages/SystemUI/res/anim/error_to_trustedstate_lock_top_animation.xml b/packages/SystemUI/res/anim/error_to_trustedstate_lock_top_animation.xml
deleted file mode 100644
index 6f7d692..0000000
--- a/packages/SystemUI/res/anim/error_to_trustedstate_lock_top_animation.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="266"
-            android:propertyName="scaleX"
-            android:valueFrom="0.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="66"
-            android:propertyName="scaleX"
-            android:valueFrom="0.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-    </set>
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="266"
-            android:propertyName="scaleY"
-            android:valueFrom="0.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="66"
-            android:propertyName="scaleY"
-            android:valueFrom="0.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/error_to_trustedstate_path_1_animation.xml b/packages/SystemUI/res/anim/error_to_trustedstate_path_1_animation.xml
deleted file mode 100644
index 6821e62..0000000
--- a/packages/SystemUI/res/anim/error_to_trustedstate_path_1_animation.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="283"
-            android:propertyName="pathData"
-            android:valueFrom="M 1.63623046875,-4.953125 c 0.0,0.0 -1.61499023438,0.0 -1.61499023438,0.0 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 0.00375366210938,-0.015625 0.00375366210938,-0.015625 c 0.0,0.0 0.0118713378906,7.9296875 0.0118713378906,7.9296875 c 0.0,0.0 -0.0040283203125,0.015625 -0.0040283203125,0.015625 c 0.0,0.0 -0.0052490234375,2.0 -0.0052490234375,2.0 c 0.0,0.0 1.61987304688,0.0 1.61987304688,0.0 c 1.10000610352,0.0 2.0,-0.900024414062 2.0,-2.0 c 0.0,0.0 -0.01123046875,-7.9296875 -0.01123046875,-7.9296875 c 0.0,-1.09997558594 -0.899993896484,-2.0 -2.0,-2.0 Z"
-            android:valueTo="M 1.63623046875,-4.953125 c 0.0,0.0 -1.61499023438,0.0 -1.61499023438,0.0 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 0.00375366210938,-0.015625 0.00375366210938,-0.015625 c 0.0,0.0 0.0118713378906,7.9296875 0.0118713378906,7.9296875 c 0.0,0.0 -0.0040283203125,0.015625 -0.0040283203125,0.015625 c 0.0,0.0 -0.0052490234375,2.0 -0.0052490234375,2.0 c 0.0,0.0 1.61987304688,0.0 1.61987304688,0.0 c 1.10000610352,0.0 2.0,-0.900024414062 2.0,-2.0 c 0.0,0.0 -0.01123046875,-7.9296875 -0.01123046875,-7.9296875 c 0.0,-1.09997558594 -0.899993896484,-2.0 -2.0,-2.0 Z"
-            android:valueType="pathType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="266"
-            android:propertyName="pathData"
-            android:valueFrom="M 1.63623046875,-4.953125 c 0.0,0.0 -1.61499023438,0.0 -1.61499023438,0.0 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 0.00375366210938,-0.015625 0.00375366210938,-0.015625 c 0.0,0.0 0.0118713378906,7.9296875 0.0118713378906,7.9296875 c 0.0,0.0 -0.0040283203125,0.015625 -0.0040283203125,0.015625 c 0.0,0.0 -0.0052490234375,2.0 -0.0052490234375,2.0 c 0.0,0.0 1.61987304688,0.0 1.61987304688,0.0 c 1.10000610352,0.0 2.0,-0.900024414062 2.0,-2.0 c 0.0,0.0 -0.01123046875,-7.9296875 -0.01123046875,-7.9296875 c 0.0,-1.09997558594 -0.899993896484,-2.0 -2.0,-2.0 Z"
-            android:valueTo="M 6.00561523438,-4.046875 c 0.0,0.0 -5.98999023438,0.0 -5.98999023438,0.0 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 5.98812866211,0.0 5.98812866211,0.0 c 0.0,0.0 0.00064086914062,10.0 0.00064086914062,10.0 c 0.0,0.0 -5.98840332031,0.0 -5.98840332031,0.0 c 0.0,0.0 -0.0052490234375,2.0 -0.0052490234375,2.0 c 0.0,0.0 5.99487304688,0.0 5.99487304688,0.0 c 1.10000610352,0.0 2.0,-0.900024414062 2.0,-2.0 c 0.0,0.0 0.0,-10.0 0.0,-10.0 c 0.0,-1.09997558594 -0.899993896484,-2.0 -2.0,-2.0 Z"
-            android:valueType="pathType"
-            android:interpolator="@interpolator/error_to_trustedstate_animation_interpolator_3" />
-    </set>
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="266"
-            android:propertyName="fillAlpha"
-            android:valueFrom="0.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="16"
-            android:propertyName="fillAlpha"
-            android:valueFrom="0.0"
-            android:valueTo="0.5"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/error_to_trustedstate_path_2_animation.xml b/packages/SystemUI/res/anim/error_to_trustedstate_path_2_animation.xml
deleted file mode 100644
index a8251dc..0000000
--- a/packages/SystemUI/res/anim/error_to_trustedstate_path_2_animation.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="283"
-            android:propertyName="pathData"
-            android:valueFrom="M 0.0252990722656,-2.96975708008 c 0.0,0.0 -0.00390625,0.0166320800781 -0.00390625,0.0166320800781 c 0.0,0.0 -0.00015258789062,-2.0 -0.00015258789062,-2.0 c 0.0,0.0 -1.63500976562,0.0 -1.63500976562,0.0 c -1.10000610352,0.0 -2.0,0.900024414062 -2.0,2.0 c 0.0,0.0 0.01123046875,7.9296875 0.01123046875,7.9296875 c 0.0,1.09997558594 0.899993896484,2.0 2.0,2.0 c 0.0,0.0 1.63500976562,0.0 1.63500976562,0.0 c 0.0,0.0 -0.000244140625,-2.0009765625 -0.000244140625,-2.0009765625 c 0.0,0.0 0.00390625,-0.015869140625 0.00390625,-0.015869140625 c 0.0,0.0 -0.0108337402344,-7.92947387695 -0.0108337402344,-7.92947387695 Z"
-            android:valueTo="M 0.0252990722656,-2.96975708008 c 0.0,0.0 -0.00390625,0.0166320800781 -0.00390625,0.0166320800781 c 0.0,0.0 -0.00015258789062,-2.0 -0.00015258789062,-2.0 c 0.0,0.0 -1.63500976562,0.0 -1.63500976562,0.0 c -1.10000610352,0.0 -2.0,0.900024414062 -2.0,2.0 c 0.0,0.0 0.01123046875,7.9296875 0.01123046875,7.9296875 c 0.0,1.09997558594 0.899993896484,2.0 2.0,2.0 c 0.0,0.0 1.63500976562,0.0 1.63500976562,0.0 c 0.0,0.0 -0.000244140625,-2.0009765625 -0.000244140625,-2.0009765625 c 0.0,0.0 0.00390625,-0.015869140625 0.00390625,-0.015869140625 c 0.0,0.0 -0.0108337402344,-7.92947387695 -0.0108337402344,-7.92947387695 Z"
-            android:valueType="pathType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="266"
-            android:propertyName="pathData"
-            android:valueFrom="M 0.0252990722656,-2.96975708008 c 0.0,0.0 -0.00390625,0.0166320800781 -0.00390625,0.0166320800781 c 0.0,0.0 -0.00015258789062,-2.0 -0.00015258789062,-2.0 c 0.0,0.0 -1.63500976562,0.0 -1.63500976562,0.0 c -1.10000610352,0.0 -2.0,0.900024414062 -2.0,2.0 c 0.0,0.0 0.01123046875,7.9296875 0.01123046875,7.9296875 c 0.0,1.09997558594 0.899993896484,2.0 2.0,2.0 c 0.0,0.0 1.63500976562,0.0 1.63500976562,0.0 c 0.0,0.0 -0.000244140625,-2.0009765625 -0.000244140625,-2.0009765625 c 0.0,0.0 0.00390625,-0.015869140625 0.00390625,-0.015869140625 c 0.0,0.0 -0.0108337402344,-7.92947387695 -0.0108337402344,-7.92947387695 Z"
-            android:valueTo="M -5.9959564209,-2.04727172852 c 0.0,0.0 6.01173400879,0.00039672851562 6.01173400879,0.00039672851562 c 0.0,0.0 -0.00015258789062,-2.0 -0.00015258789062,-2.0 c 0.0,0.0 -6.01000976562,0.0 -6.01000976562,0.0 c -1.10000610352,0.0 -2.0,0.900024414062 -2.0,2.0 c 0.0,0.0 0.0,10.0 0.0,10.0 c 0.0,1.09997558594 0.899993896484,2.0 2.0,2.0 c 0.0,0.0 6.01000976562,0.0 6.01000976562,0.0 c 0.0,0.0 -0.000244140625,-2.0009765625 -0.000244140625,-2.0009765625 c 0.0,0.0 -6.01171875,0.0003662109375 -6.01171875,0.0003662109375 c 0.0,0.0 0.00038146972656,-9.99978637695 0.00038146972656,-9.99978637695 Z"
-            android:valueType="pathType"
-            android:interpolator="@interpolator/error_to_trustedstate_animation_interpolator_3" />
-    </set>
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="266"
-            android:propertyName="fillAlpha"
-            android:valueFrom="0.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="16"
-            android:propertyName="fillAlpha"
-            android:valueFrom="0.0"
-            android:valueTo="0.5"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/error_to_trustedstate_path_3_animation.xml b/packages/SystemUI/res/anim/error_to_trustedstate_path_3_animation.xml
deleted file mode 100644
index c1ece08..0000000
--- a/packages/SystemUI/res/anim/error_to_trustedstate_path_3_animation.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="250"
-            android:propertyName="pathData"
-            android:valueFrom="M 5.01239013672,3.390625 c 0.0,-2.76000976562 -2.23999023438,-5.0 -5.0,-5.0 c -2.76000976562,0.0 -5.0,2.23999023438 -5.0,5.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,-1.71002197266 1.38999938965,-3.09997558594 3.10000610352,-3.09997558594 c 1.71000671387,0.0 3.10000610352,1.38995361328 3.10000610352,3.09997558594 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,0.0 0.0,-2.0 0.0,-2.0 Z"
-            android:valueTo="M 5.01239013672,3.390625 c 0.0,-2.76000976562 -2.23999023438,-5.0 -5.0,-5.0 c -2.76000976562,0.0 -5.0,2.23999023438 -5.0,5.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,-1.71002197266 1.38999938965,-3.09997558594 3.10000610352,-3.09997558594 c 1.71000671387,0.0 3.10000610352,1.38995361328 3.10000610352,3.09997558594 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,0.0 0.0,-2.0 0.0,-2.0 Z"
-            android:valueType="pathType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="216"
-            android:propertyName="pathData"
-            android:valueFrom="M 5.01239013672,3.390625 c 0.0,-2.76000976562 -2.23999023438,-5.0 -5.0,-5.0 c -2.76000976562,0.0 -5.0,2.23999023438 -5.0,5.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,-1.71002197266 1.38999938965,-3.09997558594 3.10000610352,-3.09997558594 c 1.71000671387,0.0 3.10000610352,1.38995361328 3.10000610352,3.09997558594 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,0.0 0.0,-2.0 0.0,-2.0 Z"
-            android:valueTo="M 5.00619506836,-6.046875 c 0.0,-2.76000976562 -2.23999023438,-5.0 -5.0,-5.0 c -2.76000976562,0.0 -5.0,2.23999023438 -5.0,5.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,-1.71002197266 1.38999938965,-3.09997558594 3.10000610352,-3.09997558594 c 1.71000671387,0.0 3.10000610352,1.38995361328 3.10000610352,3.09997558594 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,0.0 0.0,-2.0 0.0,-2.0 Z"
-            android:valueType="pathType"
-            android:interpolator="@interpolator/error_to_trustedstate_animation_interpolator_4" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/error_to_trustedstate_toppath_animation.xml b/packages/SystemUI/res/anim/error_to_trustedstate_toppath_animation.xml
deleted file mode 100644
index d9781df..0000000
--- a/packages/SystemUI/res/anim/error_to_trustedstate_toppath_animation.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="66"
-            android:propertyName="pathData"
-            android:valueFrom="M 0.0,-3.0 l 0.0,0.0 c 0.5522847498,0.0 1.0,0.4477152502 1.0,1.0 l 0.0,4.0 c 0.0,0.5522847498 -0.4477152502,1.0 -1.0,1.0 l 0.0,0.0 c -0.5522847498,0.0 -1.0,-0.4477152502 -1.0,-1.0 l 0.0,-4.0 c 0.0,-0.5522847498 0.4477152502,-1.0 1.0,-1.0 Z"
-            android:valueTo="M 0.0,-3.0 l 0.0,0.0 c 0.5522847498,0.0 1.0,0.4477152502 1.0,1.0 l 0.0,4.0 c 0.0,0.5522847498 -0.4477152502,1.0 -1.0,1.0 l 0.0,0.0 c -0.5522847498,0.0 -1.0,-0.4477152502 -1.0,-1.0 l 0.0,-4.0 c 0.0,-0.5522847498 0.4477152502,-1.0 1.0,-1.0 Z"
-            android:valueType="pathType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="216"
-            android:propertyName="pathData"
-            android:valueFrom="M 0.0,-3.0 l 0.0,0.0 c 0.5522847498,0.0 1.0,0.4477152502 1.0,1.0 l 0.0,4.0 c 0.0,0.5522847498 -0.4477152502,1.0 -1.0,1.0 l 0.0,0.0 c -0.5522847498,0.0 -1.0,-0.4477152502 -1.0,-1.0 l 0.0,-4.0 c 0.0,-0.5522847498 0.4477152502,-1.0 1.0,-1.0 Z"
-            android:valueTo="M 0.0,-6.0 l 0.0,0.0 c 1.9329966243,0.0 3.5,1.5670033757 3.5,3.5 l 0.0,5.0 c 0.0,1.9329966243 -1.5670033757,3.5 -3.5,3.5 l 0.0,0.0 c -1.9329966243,0.0 -3.5,-1.5670033757 -3.5,-3.5 l 0.0,-5.0 c 0.0,-1.9329966243 1.5670033757,-3.5 3.5,-3.5 Z"
-            android:valueType="pathType"
-            android:interpolator="@interpolator/error_to_trustedstate_animation_interpolator_0" />
-    </set>
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="283"
-            android:propertyName="fillAlpha"
-            android:valueFrom="1.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="16"
-            android:propertyName="fillAlpha"
-            android:valueFrom="1.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_toerror_bottompath_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_toerror_bottompath_animation.xml
deleted file mode 100644
index 91829c0..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_toerror_bottompath_animation.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="316"
-            android:propertyName="pathData"
-            android:valueFrom="M 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
-            android:valueTo="M 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
-            android:valueType="pathType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="83"
-            android:propertyName="pathData"
-            android:valueFrom="M 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
-            android:valueTo="M 0.0,-1.1 l 0.0,0.0 c 0.60751322478,0.0 1.1,0.49248677522 1.1,1.1 l 0.0,0.0 c 0.0,0.60751322478 -0.49248677522,1.1 -1.1,1.1 l 0.0,0.0 c -0.60751322478,0.0 -1.1,-0.49248677522 -1.1,-1.1 l 0.0,0.0 c 0.0,-0.60751322478 0.49248677522,-1.1 1.1,-1.1 Z"
-            android:valueType="pathType"
-            android:interpolator="@interpolator/ic_fingerprint_toerror_animation_interpolator_5" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_toerror_circlepath_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_toerror_circlepath_animation.xml
deleted file mode 100644
index 9b08fa2..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_toerror_circlepath_animation.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="166"
-            android:propertyName="trimPathStart"
-            android:valueFrom="1.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="533"
-            android:propertyName="trimPathStart"
-            android:valueFrom="1.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/fast_out_slow_in" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_toerror_errorcircle_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_toerror_errorcircle_animation.xml
deleted file mode 100644
index 1ea2100..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_toerror_errorcircle_animation.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="150"
-            android:propertyName="rotation"
-            android:valueFrom="190.0"
-            android:valueTo="190.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="549"
-            android:propertyName="rotation"
-            android:valueFrom="190.0"
-            android:valueTo="-6.0"
-            android:valueType="floatType"
-            android:interpolator="@interpolator/ic_fingerprint_toerror_animation_interpolator_2" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_toerror_errorexclamation_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_toerror_errorexclamation_animation.xml
deleted file mode 100644
index 0b9cb95..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_toerror_errorexclamation_animation.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="200"
-            android:propertyName="rotation"
-            android:valueFrom="180.0"
-            android:valueTo="180.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="499"
-            android:propertyName="rotation"
-            android:valueFrom="180.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@interpolator/ic_fingerprint_toerror_animation_interpolator_6" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_toerror_exclamationbottom_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_toerror_exclamationbottom_animation.xml
deleted file mode 100644
index c597b82..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_toerror_exclamationbottom_animation.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" />
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_toerror_exclamationtop_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_toerror_exclamationtop_animation.xml
deleted file mode 100644
index bde83de..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_toerror_exclamationtop_animation.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <objectAnimator
-        android:duration="700"
-        android:propertyXName="translateX"
-        android:propertyYName="translateY"
-        android:pathData="M 0.0,0.0 c 0.0,-0.33333 0.0,-1.66667 0.0,-2.0"
-        android:interpolator="@interpolator/ic_fingerprint_toerror_animation_interpolator_3" />
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_toerror_fingerprinterror_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_toerror_fingerprinterror_animation.xml
deleted file mode 100644
index a3afaef..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_toerror_fingerprinterror_animation.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="100"
-            android:propertyName="rotation"
-            android:valueFrom="0.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="566"
-            android:propertyName="rotation"
-            android:valueFrom="0.0"
-            android:valueTo="-305.0"
-            android:valueType="floatType"
-            android:interpolator="@interpolator/ic_fingerprint_toerror_animation_interpolator_2" />
-        <objectAnimator
-            android:duration="1066"
-            android:propertyName="rotation"
-            android:valueFrom="-305.0"
-            android:valueTo="-305.0"
-            android:valueType="floatType"
-            android:interpolator="@interpolator/ic_fingerprint_toerror_animation_interpolator_0" />
-        <objectAnimator
-            android:duration="800"
-            android:propertyName="rotation"
-            android:valueFrom="-305.0"
-            android:valueTo="-720.0"
-            android:valueType="floatType"
-            android:interpolator="@interpolator/ic_fingerprint_toerror_animation_interpolator_0" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_toerror_fingerprintwhite_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_toerror_fingerprintwhite_animation.xml
deleted file mode 100644
index a3afaef..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_toerror_fingerprintwhite_animation.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="100"
-            android:propertyName="rotation"
-            android:valueFrom="0.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="566"
-            android:propertyName="rotation"
-            android:valueFrom="0.0"
-            android:valueTo="-305.0"
-            android:valueType="floatType"
-            android:interpolator="@interpolator/ic_fingerprint_toerror_animation_interpolator_2" />
-        <objectAnimator
-            android:duration="1066"
-            android:propertyName="rotation"
-            android:valueFrom="-305.0"
-            android:valueTo="-305.0"
-            android:valueType="floatType"
-            android:interpolator="@interpolator/ic_fingerprint_toerror_animation_interpolator_0" />
-        <objectAnimator
-            android:duration="800"
-            android:propertyName="rotation"
-            android:valueFrom="-305.0"
-            android:valueTo="-720.0"
-            android:valueType="floatType"
-            android:interpolator="@interpolator/ic_fingerprint_toerror_animation_interpolator_0" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_1_path_0_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_1_path_0_animation.xml
deleted file mode 100644
index 1c3a766..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_1_path_0_animation.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <objectAnimator
-        android:duration="133"
-        android:propertyName="trimPathEnd"
-        android:valueFrom="0.0"
-        android:valueTo="1.0"
-        android:valueType="floatType"
-        android:interpolator="@android:interpolator/fast_out_slow_in" />
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="100"
-            android:propertyName="trimPathStart"
-            android:valueFrom="0.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="100"
-            android:propertyName="trimPathStart"
-            android:valueFrom="0.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@interpolator/ic_fingerprint_toerror_animation_interpolator_1" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_1_path_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_1_path_animation.xml
deleted file mode 100644
index 5a9258a..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_1_path_animation.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="16"
-            android:propertyName="trimPathStart"
-            android:valueFrom="0.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="66"
-            android:propertyName="trimPathStart"
-            android:valueFrom="0.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_2_path_0_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_2_path_0_animation.xml
deleted file mode 100644
index 04b8b80..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_2_path_0_animation.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="116"
-            android:propertyName="trimPathEnd"
-            android:valueFrom="1.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="116"
-            android:propertyName="trimPathEnd"
-            android:valueFrom="1.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@interpolator/ic_fingerprint_toerror_animation_interpolator_2" />
-    </set>
-    <objectAnimator
-        android:duration="166"
-        android:propertyName="trimPathStart"
-        android:valueFrom="1.0"
-        android:valueTo="0.0"
-        android:valueType="floatType"
-        android:interpolator="@interpolator/ic_fingerprint_toerror_animation_interpolator_2" />
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_2_path_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_2_path_animation.xml
deleted file mode 100644
index c69001c..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_2_path_animation.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="16"
-            android:propertyName="trimPathEnd"
-            android:valueFrom="1.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="133"
-            android:propertyName="trimPathEnd"
-            android:valueFrom="1.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_5_path_0_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_5_path_0_animation.xml
deleted file mode 100644
index 6fb22cd..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_5_path_0_animation.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <objectAnimator
-        android:duration="166"
-        android:propertyName="trimPathEnd"
-        android:valueFrom="0.0"
-        android:valueTo="1.0"
-        android:valueType="floatType"
-        android:interpolator="@android:interpolator/fast_out_slow_in" />
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="150"
-            android:propertyName="trimPathStart"
-            android:valueFrom="0.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="166"
-            android:propertyName="trimPathStart"
-            android:valueFrom="0.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@interpolator/ic_fingerprint_toerror_animation_interpolator_1" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_5_path_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_5_path_animation.xml
deleted file mode 100644
index 8e9a0510..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_5_path_animation.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <objectAnimator
-        android:duration="150"
-        android:propertyName="trimPathStart"
-        android:valueFrom="0.0"
-        android:valueTo="1.0"
-        android:valueType="floatType"
-        android:interpolator="@android:interpolator/linear" />
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_6_path_0_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_6_path_0_animation.xml
deleted file mode 100644
index 3ffb8f8..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_6_path_0_animation.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <objectAnimator
-        android:duration="250"
-        android:propertyName="trimPathEnd"
-        android:valueFrom="0.0"
-        android:valueTo="1.0"
-        android:valueType="floatType"
-        android:interpolator="@interpolator/ic_fingerprint_toerror_animation_interpolator_0" />
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="133"
-            android:propertyName="trimPathStart"
-            android:valueFrom="0.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="199"
-            android:propertyName="trimPathStart"
-            android:valueFrom="0.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@interpolator/ic_fingerprint_toerror_animation_interpolator_0" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_6_path_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_6_path_animation.xml
deleted file mode 100644
index 3584f91..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_6_path_animation.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="16"
-            android:propertyName="trimPathStart"
-            android:valueFrom="0.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="216"
-            android:propertyName="trimPathStart"
-            android:valueFrom="0.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_7_path_0_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_7_path_0_animation.xml
deleted file mode 100644
index 0d44810..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_7_path_0_animation.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="16"
-            android:propertyName="trimPathEnd"
-            android:valueFrom="0.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="216"
-            android:propertyName="trimPathEnd"
-            android:valueFrom="0.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/fast_out_slow_in" />
-    </set>
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="133"
-            android:propertyName="trimPathStart"
-            android:valueFrom="0.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="199"
-            android:propertyName="trimPathStart"
-            android:valueFrom="0.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@interpolator/ic_fingerprint_toerror_animation_interpolator_1" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_7_path_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_7_path_animation.xml
deleted file mode 100644
index 52a5b3e..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_toerror_ridge_7_path_animation.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="33"
-            android:propertyName="trimPathStart"
-            android:valueFrom="0.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="150"
-            android:propertyName="trimPathStart"
-            android:valueFrom="0.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_toerror_toppath_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_toerror_toppath_animation.xml
deleted file mode 100644
index ff7420b..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_toerror_toppath_animation.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="200"
-            android:propertyName="pathData"
-            android:valueFrom="M -1.0,0.0 l 2.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l -2.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
-            android:valueTo="M -1.0,0.0 l 2.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l -2.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
-            android:valueType="pathType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="499"
-            android:propertyName="pathData"
-            android:valueFrom="M -1.0,0.0 l 2.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l -2.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
-            android:valueTo="M 0.0,-3.0 l 0.0,0.0 c 0.5522847498,0.0 1.0,0.4477152502 1.0,1.0 l 0.0,4.0 c 0.0,0.5522847498 -0.4477152502,1.0 -1.0,1.0 l 0.0,0.0 c -0.5522847498,0.0 -1.0,-0.4477152502 -1.0,-1.0 l 0.0,-4.0 c 0.0,-0.5522847498 0.4477152502,-1.0 1.0,-1.0 Z"
-            android:valueType="pathType"
-            android:interpolator="@interpolator/ic_fingerprint_toerror_animation_interpolator_4" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_tofp_bottompath_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_tofp_bottompath_animation.xml
deleted file mode 100644
index 4bc18f2..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_tofp_bottompath_animation.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="250"
-            android:propertyName="pathData"
-            android:valueFrom="M 0.0,-1.1 l 0.0,0.0 c 0.60751322478,0.0 1.1,0.49248677522 1.1,1.1 l 0.0,0.0 c 0.0,0.60751322478 -0.49248677522,1.1 -1.1,1.1 l 0.0,0.0 c -0.60751322478,0.0 -1.1,-0.49248677522 -1.1,-1.1 l 0.0,0.0 c 0.0,-0.60751322478 0.49248677522,-1.1 1.1,-1.1 Z"
-            android:valueTo="M 0.0,-1.1 l 0.0,0.0 c 0.60751322478,0.0 1.1,0.49248677522 1.1,1.1 l 0.0,0.0 c 0.0,0.60751322478 -0.49248677522,1.1 -1.1,1.1 l 0.0,0.0 c -0.60751322478,0.0 -1.1,-0.49248677522 -1.1,-1.1 l 0.0,0.0 c 0.0,-0.60751322478 0.49248677522,-1.1 1.1,-1.1 Z"
-            android:valueType="pathType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="150"
-            android:propertyName="pathData"
-            android:valueFrom="M 0.0,-1.1 l 0.0,0.0 c 0.60751322478,0.0 1.1,0.49248677522 1.1,1.1 l 0.0,0.0 c 0.0,0.60751322478 -0.49248677522,1.1 -1.1,1.1 l 0.0,0.0 c -0.60751322478,0.0 -1.1,-0.49248677522 -1.1,-1.1 l 0.0,0.0 c 0.0,-0.60751322478 0.49248677522,-1.1 1.1,-1.1 Z"
-            android:valueTo="M 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
-            android:valueType="pathType"
-            android:interpolator="@interpolator/ic_fingerprint_tofp_animation_interpolator_1" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_tofp_circlepath_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_tofp_circlepath_animation.xml
deleted file mode 100644
index 9273b9a..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_tofp_circlepath_animation.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <objectAnimator
-        android:duration="383"
-        android:propertyName="trimPathEnd"
-        android:valueFrom="1.0"
-        android:valueTo="0.0"
-        android:valueType="floatType"
-        android:interpolator="@interpolator/ic_fingerprint_tofp_animation_interpolator_4" />
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_tofp_errorcircle_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_tofp_errorcircle_animation.xml
deleted file mode 100644
index 062c6a0..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_tofp_errorcircle_animation.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="33"
-            android:propertyName="rotation"
-            android:valueFrom="10.0"
-            android:valueTo="10.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="366"
-            android:propertyName="rotation"
-            android:valueFrom="10.0"
-            android:valueTo="-180.0"
-            android:valueType="floatType"
-            android:interpolator="@interpolator/ic_fingerprint_tofp_animation_interpolator_2" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_tofp_errorexclamation_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_tofp_errorexclamation_animation.xml
deleted file mode 100644
index 5d4b268..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_tofp_errorexclamation_animation.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="33"
-            android:propertyName="rotation"
-            android:valueFrom="0.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="416"
-            android:propertyName="rotation"
-            android:valueFrom="0.0"
-            android:valueTo="-180.0"
-            android:valueType="floatType"
-            android:interpolator="@interpolator/ic_fingerprint_tofp_animation_interpolator_5" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_tofp_exclamationbottom_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_tofp_exclamationbottom_animation.xml
deleted file mode 100644
index d3d7d1c..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_tofp_exclamationbottom_animation.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <objectAnimator
-        android:duration="450"
-        android:propertyXName="translateX"
-        android:propertyYName="translateY"
-        android:pathData="M 0.0,4.0 c 0.0,-0.66667 0.0,-3.33333 0.0,-4.0"
-        android:interpolator="@interpolator/ic_fingerprint_tofp_animation_interpolator_0" />
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_tofp_exclamationtop_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_tofp_exclamationtop_animation.xml
deleted file mode 100644
index 04b6868..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_tofp_exclamationtop_animation.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <objectAnimator
-        android:duration="450"
-        android:propertyXName="translateX"
-        android:propertyYName="translateY"
-        android:pathData="M 0.0,-2.0 c 0.0,0.33333 0.0,1.66667 0.0,2.0"
-        android:interpolator="@interpolator/ic_fingerprint_tofp_animation_interpolator_3" />
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_tofp_fingerprintwhite_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_tofp_fingerprintwhite_animation.xml
deleted file mode 100644
index 25f2c43..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_tofp_fingerprintwhite_animation.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="200"
-            android:propertyName="rotation"
-            android:valueFrom="180.0"
-            android:valueTo="180.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="499"
-            android:propertyName="rotation"
-            android:valueFrom="180.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@interpolator/ic_fingerprint_tofp_animation_interpolator_2" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_tofp_ridge_1_path_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_tofp_ridge_1_path_animation.xml
deleted file mode 100644
index 4a6f39a..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_tofp_ridge_1_path_animation.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="416"
-            android:propertyName="trimPathEnd"
-            android:valueFrom="0.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="116"
-            android:propertyName="trimPathEnd"
-            android:valueFrom="0.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/fast_out_slow_in" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_tofp_ridge_2_path_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_tofp_ridge_2_path_animation.xml
deleted file mode 100644
index c9a9f64..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_tofp_ridge_2_path_animation.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="350"
-            android:propertyName="trimPathStart"
-            android:valueFrom="1.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="116"
-            android:propertyName="trimPathStart"
-            android:valueFrom="1.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/fast_out_slow_in" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_tofp_ridge_5_path_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_tofp_ridge_5_path_animation.xml
deleted file mode 100644
index 43e44cf..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_tofp_ridge_5_path_animation.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="350"
-            android:propertyName="trimPathEnd"
-            android:valueFrom="0.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="350"
-            android:propertyName="trimPathEnd"
-            android:valueFrom="0.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/fast_out_slow_in" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_tofp_ridge_6_path_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_tofp_ridge_6_path_animation.xml
deleted file mode 100644
index 04a6036..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_tofp_ridge_6_path_animation.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="250"
-            android:propertyName="trimPathStart"
-            android:valueFrom="1.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="250"
-            android:propertyName="trimPathStart"
-            android:valueFrom="1.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/fast_out_slow_in" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_tofp_ridge_7_path_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_tofp_ridge_7_path_animation.xml
deleted file mode 100644
index 031c5e6..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_tofp_ridge_7_path_animation.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="266"
-            android:propertyName="trimPathEnd"
-            android:valueFrom="0.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="433"
-            android:propertyName="trimPathEnd"
-            android:valueFrom="0.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/fast_out_slow_in" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/ic_fingerprint_tofp_toppath_animation.xml b/packages/SystemUI/res/anim/ic_fingerprint_tofp_toppath_animation.xml
deleted file mode 100644
index 9b3498f..0000000
--- a/packages/SystemUI/res/anim/ic_fingerprint_tofp_toppath_animation.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="200"
-            android:propertyName="pathData"
-            android:valueFrom="M 0.0,-3.0 l 0.0,0.0 c 0.5522847498,0.0 1.0,0.4477152502 1.0,1.0 l 0.0,4.0 c 0.0,0.5522847498 -0.4477152502,1.0 -1.0,1.0 l 0.0,0.0 c -0.5522847498,0.0 -1.0,-0.4477152502 -1.0,-1.0 l 0.0,-4.0 c 0.0,-0.5522847498 0.4477152502,-1.0 1.0,-1.0 Z"
-            android:valueTo="M 0.0,-3.0 l 0.0,0.0 c 0.5522847498,0.0 1.0,0.4477152502 1.0,1.0 l 0.0,4.0 c 0.0,0.5522847498 -0.4477152502,1.0 -1.0,1.0 l 0.0,0.0 c -0.5522847498,0.0 -1.0,-0.4477152502 -1.0,-1.0 l 0.0,-4.0 c 0.0,-0.5522847498 0.4477152502,-1.0 1.0,-1.0 Z"
-            android:valueType="pathType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="250"
-            android:propertyName="pathData"
-            android:valueFrom="M 0.0,-3.0 l 0.0,0.0 c 0.5522847498,0.0 1.0,0.4477152502 1.0,1.0 l 0.0,4.0 c 0.0,0.5522847498 -0.4477152502,1.0 -1.0,1.0 l 0.0,0.0 c -0.5522847498,0.0 -1.0,-0.4477152502 -1.0,-1.0 l 0.0,-4.0 c 0.0,-0.5522847498 0.4477152502,-1.0 1.0,-1.0 Z"
-            android:valueTo="M -1.0,0.0 l 2.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l -2.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
-            android:valueType="pathType"
-            android:interpolator="@interpolator/ic_fingerprint_tofp_animation_interpolator_1" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_off_ridge_1_path_animation.xml b/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_off_ridge_1_path_animation.xml
deleted file mode 100644
index 18bc8a2..0000000
--- a/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_off_ridge_1_path_animation.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="60"
-            android:propertyName="trimPathStart"
-            android:valueFrom="0.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="216"
-            android:propertyName="trimPathStart"
-            android:valueFrom="0.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@interpolator/lockscreen_fingerprint_draw_off_animation_interpolator_1" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_off_ridge_2_path_animation.xml b/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_off_ridge_2_path_animation.xml
deleted file mode 100644
index 531fac0..0000000
--- a/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_off_ridge_2_path_animation.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <objectAnimator
-        android:duration="140"
-        android:propertyName="trimPathEnd"
-        android:valueFrom="1.0"
-        android:valueTo="0.0"
-        android:valueType="floatType"
-        android:interpolator="@interpolator/lockscreen_fingerprint_draw_off_animation_interpolator_0" />
-</set>
diff --git a/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_off_ridge_5_path_animation.xml b/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_off_ridge_5_path_animation.xml
deleted file mode 100644
index 87c7f21..0000000
--- a/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_off_ridge_5_path_animation.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="20"
-            android:propertyName="trimPathStart"
-            android:valueFrom="0.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="180"
-            android:propertyName="trimPathStart"
-            android:valueFrom="0.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@interpolator/lockscreen_fingerprint_draw_off_animation_interpolator_1" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_off_ridge_6_path_animation.xml b/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_off_ridge_6_path_animation.xml
deleted file mode 100644
index e0a66d9..0000000
--- a/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_off_ridge_6_path_animation.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <objectAnimator
-        android:duration="190"
-        android:propertyName="trimPathEnd"
-        android:valueFrom="1.0"
-        android:valueTo="0.0"
-        android:valueType="floatType"
-        android:interpolator="@interpolator/lockscreen_fingerprint_draw_off_animation_interpolator_1" />
-</set>
diff --git a/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_off_ridge_7_path_animation.xml b/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_off_ridge_7_path_animation.xml
deleted file mode 100644
index 9b0e17b..0000000
--- a/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_off_ridge_7_path_animation.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="10"
-            android:propertyName="trimPathStart"
-            android:valueFrom="0.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="160"
-            android:propertyName="trimPathStart"
-            android:valueFrom="0.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@interpolator/lockscreen_fingerprint_draw_off_animation_interpolator_1" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_on_ridge_1_path_animation.xml b/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_on_ridge_1_path_animation.xml
deleted file mode 100644
index eb323f5..0000000
--- a/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_on_ridge_1_path_animation.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="316"
-            android:propertyName="trimPathEnd"
-            android:valueFrom="0.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="383"
-            android:propertyName="trimPathEnd"
-            android:valueFrom="0.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@interpolator/lockscreen_fingerprint_draw_on_animation_interpolator_1" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_on_ridge_2_path_animation.xml b/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_on_ridge_2_path_animation.xml
deleted file mode 100644
index cae4a70..0000000
--- a/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_on_ridge_2_path_animation.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="216"
-            android:propertyName="trimPathStart"
-            android:valueFrom="1.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="400"
-            android:propertyName="trimPathStart"
-            android:valueFrom="1.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@interpolator/lockscreen_fingerprint_draw_on_animation_interpolator_1" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_on_ridge_5_path_animation.xml b/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_on_ridge_5_path_animation.xml
deleted file mode 100644
index 0be6c9e..0000000
--- a/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_on_ridge_5_path_animation.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="33"
-            android:propertyName="trimPathEnd"
-            android:valueFrom="0.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="383"
-            android:propertyName="trimPathEnd"
-            android:valueFrom="0.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@interpolator/lockscreen_fingerprint_draw_on_animation_interpolator_0" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_on_ridge_6_path_animation.xml b/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_on_ridge_6_path_animation.xml
deleted file mode 100644
index 5d2cdb6..0000000
--- a/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_on_ridge_6_path_animation.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="50"
-            android:propertyName="trimPathStart"
-            android:valueFrom="1.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="549"
-            android:propertyName="trimPathStart"
-            android:valueFrom="1.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@interpolator/lockscreen_fingerprint_draw_on_animation_interpolator_1" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_on_ridge_7_path_animation.xml b/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_on_ridge_7_path_animation.xml
deleted file mode 100644
index 6f8b559..0000000
--- a/packages/SystemUI/res/anim/lockscreen_fingerprint_draw_on_ridge_7_path_animation.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="83"
-            android:propertyName="trimPathEnd"
-            android:valueFrom="0.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="483"
-            android:propertyName="trimPathEnd"
-            android:valueFrom="0.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@interpolator/lockscreen_fingerprint_draw_on_animation_interpolator_1" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/trusted_state_to_error_bottompath_animation.xml b/packages/SystemUI/res/anim/trusted_state_to_error_bottompath_animation.xml
deleted file mode 100644
index 7a01896..0000000
--- a/packages/SystemUI/res/anim/trusted_state_to_error_bottompath_animation.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="200"
-            android:propertyName="pathData"
-            android:valueFrom="M 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
-            android:valueTo="M 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
-            android:valueType="pathType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="149"
-            android:propertyName="pathData"
-            android:valueFrom="M 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
-            android:valueTo="M 0.0,-1.1 l 0.0,0.0 c 0.60751322478,0.0 1.1,0.49248677522 1.1,1.1 l 0.0,0.0 c 0.0,0.60751322478 -0.49248677522,1.1 -1.1,1.1 l 0.0,0.0 c -0.60751322478,0.0 -1.1,-0.49248677522 -1.1,-1.1 l 0.0,0.0 c 0.0,-0.60751322478 0.49248677522,-1.1 1.1,-1.1 Z"
-            android:valueType="pathType"
-            android:interpolator="@interpolator/trusted_state_to_error_animation_interpolator_0" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/trusted_state_to_error_circlepath_animation.xml b/packages/SystemUI/res/anim/trusted_state_to_error_circlepath_animation.xml
deleted file mode 100644
index ac5e448..0000000
--- a/packages/SystemUI/res/anim/trusted_state_to_error_circlepath_animation.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="100"
-            android:propertyName="trimPathStart"
-            android:valueFrom="1.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="450"
-            android:propertyName="trimPathStart"
-            android:valueFrom="1.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/fast_out_slow_in" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/trusted_state_to_error_ellipse_path_1_animation.xml b/packages/SystemUI/res/anim/trusted_state_to_error_ellipse_path_1_animation.xml
deleted file mode 100644
index 6697316..0000000
--- a/packages/SystemUI/res/anim/trusted_state_to_error_ellipse_path_1_animation.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <objectAnimator
-        android:duration="200"
-        android:propertyName="pathData"
-        android:valueFrom="M 0.0,-1.988645 c 1.09829830627,0.0 1.988645,0.890346693734 1.988645,1.988645 c 0.0,1.09829830627 -0.890346693734,1.988645 -1.988645,1.988645 c -1.09829830627,0.0 -1.988645,-0.890346693734 -1.988645,-1.988645 c 0.0,-1.09829830627 0.890346693734,-1.988645 1.988645,-1.988645 Z"
-        android:valueTo="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
-        android:valueType="pathType"
-        android:interpolator="@interpolator/trusted_state_to_error_animation_interpolator_0" />
-</set>
diff --git a/packages/SystemUI/res/anim/trusted_state_to_error_errorcircle_animation.xml b/packages/SystemUI/res/anim/trusted_state_to_error_errorcircle_animation.xml
deleted file mode 100644
index 903d97e..0000000
--- a/packages/SystemUI/res/anim/trusted_state_to_error_errorcircle_animation.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="50"
-            android:propertyName="rotation"
-            android:valueFrom="184.0"
-            android:valueTo="184.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="450"
-            android:propertyName="rotation"
-            android:valueFrom="184.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@interpolator/trusted_state_to_error_animation_interpolator_1" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/trusted_state_to_error_errorexclamationdot_animation.xml b/packages/SystemUI/res/anim/trusted_state_to_error_errorexclamationdot_animation.xml
deleted file mode 100644
index c5339a0..0000000
--- a/packages/SystemUI/res/anim/trusted_state_to_error_errorexclamationdot_animation.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <objectAnimator
-        android:duration="550"
-        android:propertyXName="translateX"
-        android:propertyYName="translateY"
-        android:pathData="M 12.0,8.0 c 0.0,0.66667 0.0,3.33333 0.0,4.0"
-        android:interpolator="@interpolator/trusted_state_to_error_animation_interpolator_3" />
-</set>
diff --git a/packages/SystemUI/res/anim/trusted_state_to_error_exclamationtop_animation.xml b/packages/SystemUI/res/anim/trusted_state_to_error_exclamationtop_animation.xml
deleted file mode 100644
index c5b2c12..0000000
--- a/packages/SystemUI/res/anim/trusted_state_to_error_exclamationtop_animation.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <objectAnimator
-        android:duration="500"
-        android:propertyXName="translateX"
-        android:propertyYName="translateY"
-        android:pathData="M 0.0,2.5 c 0.0,-0.75 0.0,-3.75 0.0,-4.5"
-        android:interpolator="@interpolator/trusted_state_to_error_animation_interpolator_4" />
-</set>
diff --git a/packages/SystemUI/res/anim/trusted_state_to_error_lock_top_animation.xml b/packages/SystemUI/res/anim/trusted_state_to_error_lock_top_animation.xml
deleted file mode 100644
index 63a25d9..0000000
--- a/packages/SystemUI/res/anim/trusted_state_to_error_lock_top_animation.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="150"
-            android:propertyName="scaleX"
-            android:valueFrom="1.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="16"
-            android:propertyName="scaleX"
-            android:valueFrom="1.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-    </set>
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="150"
-            android:propertyName="scaleY"
-            android:valueFrom="1.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="16"
-            android:propertyName="scaleY"
-            android:valueFrom="1.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/trusted_state_to_error_path_1_animation.xml b/packages/SystemUI/res/anim/trusted_state_to_error_path_1_animation.xml
deleted file mode 100644
index 547f42e..0000000
--- a/packages/SystemUI/res/anim/trusted_state_to_error_path_1_animation.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="200"
-            android:propertyName="pathData"
-            android:valueFrom="M 6.00561523438,-4.046875 c 0.0,0.0 -5.98999023438,0.0 -5.98999023438,0.0 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 5.98812866211,0.0 5.98812866211,0.0 c 0.0,0.0 0.00064086914062,10.0 0.00064086914062,10.0 c 0.0,0.0 -5.98840332031,0.0 -5.98840332031,0.0 c 0.0,0.0 -0.0052490234375,2.0 -0.0052490234375,2.0 c 0.0,0.0 5.99487304688,0.0 5.99487304688,0.0 c 1.10000610352,0.0 2.0,-0.900024414062 2.0,-2.0 c 0.0,0.0 0.0,-10.0 0.0,-10.0 c 0.0,-1.09997558594 -0.899993896484,-2.0 -2.0,-2.0 Z"
-            android:valueTo="M 1.63623046875,-4.953125 c 0.0,0.0 -1.61499023438,0.0 -1.61499023438,0.0 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 0.00375366210938,-0.015625 0.00375366210938,-0.015625 c 0.0,0.0 0.00064086914062,10.625 0.00064086914062,10.625 c 0.0,0.0 -0.0040283203125,0.015625 -0.0040283203125,0.015625 c 0.0,0.0 -0.0052490234375,2.0 -0.0052490234375,2.0 c 0.0,0.0 1.61987304688,0.0 1.61987304688,0.0 c 1.10000610352,0.0 2.0,-0.900024414062 2.0,-2.0 c 0.0,0.0 0.0,-10.625 0.0,-10.625 c 0.0,-1.09997558594 -0.899993896484,-2.0 -2.0,-2.0 Z"
-            android:valueType="pathType"
-            android:interpolator="@interpolator/trusted_state_to_error_animation_interpolator_0" />
-        <objectAnimator
-            android:duration="149"
-            android:propertyName="pathData"
-            android:valueFrom="M 1.63623046875,-4.953125 c 0.0,0.0 -1.61499023438,0.0 -1.61499023438,0.0 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 0.00375366210938,-0.015625 0.00375366210938,-0.015625 c 0.0,0.0 0.00064086914062,10.625 0.00064086914062,10.625 c 0.0,0.0 -0.0040283203125,0.015625 -0.0040283203125,0.015625 c 0.0,0.0 -0.0052490234375,2.0 -0.0052490234375,2.0 c 0.0,0.0 1.61987304688,0.0 1.61987304688,0.0 c 1.10000610352,0.0 2.0,-0.900024414062 2.0,-2.0 c 0.0,0.0 0.0,-10.625 0.0,-10.625 c 0.0,-1.09997558594 -0.899993896484,-2.0 -2.0,-2.0 Z"
-            android:valueTo="M 0.02685546875,-4.96875 c 0.0,0.0 -0.005615234375,0.015625 -0.005615234375,0.015625 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 0.00375366210938,-0.015625 0.00375366210938,-0.015625 c 0.0,0.0 -0.00936889648438,3.9296875 -0.00936889648438,3.9296875 c 0.0,0.0 -0.0040283203125,0.015625 -0.0040283203125,0.015625 c 0.0,0.0 -0.0028076171875,0.0234375 -0.0028076171875,0.0234375 c 0.0,0.0 0.010498046875,-0.015625 0.010498046875,-0.015625 c 0.0,0.0 0.985595703125,0.0078125 0.985595703125,0.0078125 c 0.0,0.0 0.017578125,-6.015625 0.017578125,-6.015625 c 0.0,0.0 0.104400634766,0.0546875 -0.99560546875,0.0546875 Z"
-            android:valueType="pathType"
-            android:interpolator="@interpolator/trusted_state_to_error_animation_interpolator_5" />
-    </set>
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="183"
-            android:propertyName="fillAlpha"
-            android:valueFrom="0.5"
-            android:valueTo="0.5"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="16"
-            android:propertyName="fillAlpha"
-            android:valueFrom="0.5"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/trusted_state_to_error_path_2_animation.xml b/packages/SystemUI/res/anim/trusted_state_to_error_path_2_animation.xml
deleted file mode 100644
index e5fe4d1..0000000
--- a/packages/SystemUI/res/anim/trusted_state_to_error_path_2_animation.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="200"
-            android:propertyName="pathData"
-            android:valueFrom="M -5.9959564209,-2.04727172852 c 0.0,0.0 6.01173400879,0.00039672851562 6.01173400879,0.00039672851562 c 0.0,0.0 -0.00015258789062,-2.0 -0.00015258789062,-2.0 c 0.0,0.0 -6.01000976562,0.0 -6.01000976562,0.0 c -1.10000610352,0.0 -2.0,0.900024414062 -2.0,2.0 c 0.0,0.0 0.0,10.0 0.0,10.0 c 0.0,1.09997558594 0.899993896484,2.0 2.0,2.0 c 0.0,0.0 6.01000976562,0.0 6.01000976562,0.0 c 0.0,0.0 -0.000244140625,-2.0009765625 -0.000244140625,-2.0009765625 c 0.0,0.0 -6.01171875,0.0003662109375 -6.01171875,0.0003662109375 c 0.0,0.0 0.00038146972656,-9.99978637695 0.00038146972656,-9.99978637695 Z"
-            android:valueTo="M 0.0252990722656,-2.96975708008 c 0.0,0.0 -0.00390625,0.0166320800781 -0.00390625,0.0166320800781 c 0.0,0.0 -0.00015258789062,-2.0 -0.00015258789062,-2.0 c 0.0,0.0 -1.63500976562,0.0 -1.63500976562,0.0 c -1.10000610352,0.0 -2.0,0.900024414062 -2.0,2.0 c 0.0,0.0 0.0,10.625 0.0,10.625 c 0.0,1.09997558594 0.899993896484,2.0 2.0,2.0 c 0.0,0.0 1.63500976562,0.0 1.63500976562,0.0 c 0.0,0.0 -0.000244140625,-2.0009765625 -0.000244140625,-2.0009765625 c 0.0,0.0 0.00390625,-0.015869140625 0.00390625,-0.015869140625 c 0.0,0.0 0.00039672851562,-10.624786377 0.00039672851562,-10.624786377 Z"
-            android:valueType="pathType"
-            android:interpolator="@interpolator/trusted_state_to_error_animation_interpolator_0" />
-        <objectAnimator
-            android:duration="149"
-            android:propertyName="pathData"
-            android:valueFrom="M 0.0252990722656,-2.96975708008 c 0.0,0.0 -0.00390625,0.0166320800781 -0.00390625,0.0166320800781 c 0.0,0.0 -0.00015258789062,-2.0 -0.00015258789062,-2.0 c 0.0,0.0 -1.63500976562,0.0 -1.63500976562,0.0 c -1.10000610352,0.0 -2.0,0.900024414062 -2.0,2.0 c 0.0,0.0 0.0,10.625 0.0,10.625 c 0.0,1.09997558594 0.899993896484,2.0 2.0,2.0 c 0.0,0.0 1.63500976562,0.0 1.63500976562,0.0 c 0.0,0.0 -0.000244140625,-2.0009765625 -0.000244140625,-2.0009765625 c 0.0,0.0 0.00390625,-0.015869140625 0.00390625,-0.015869140625 c 0.0,0.0 0.00039672851562,-10.624786377 0.00039672851562,-10.624786377 Z"
-            android:valueTo="M 0.0252990722656,-2.96914672852 c 0.0,0.0 -0.00390625,0.0160217285156 -0.00390625,0.0160217285156 c 0.0,0.0 -0.00015258789062,-2.0 -0.00015258789062,-2.0 c 0.0,0.0 0.005615234375,-0.015625 0.005615234375,-0.015625 c -1.10000610352,0.0 -1.01220703125,-0.0546875 -1.01220703125,-0.0546875 c 0.0,0.0 -0.017578125,6.015625 -0.017578125,6.015625 c 0.0,0.0 -0.0777893066406,-0.0078125 1.02221679688,-0.0078125 c 0.0,0.0 -0.005615234375,0.015625 -0.005615234375,0.015625 c 0.0,0.0 -0.002685546875,-0.0244140625 -0.002685546875,-0.0244140625 c 0.0,0.0 0.00390625,-0.0152587890625 0.00390625,-0.0152587890625 c 0.0,0.0 0.0104064941406,-3.92947387695 0.0104064941406,-3.92947387695 Z"
-            android:valueType="pathType"
-            android:interpolator="@interpolator/trusted_state_to_error_animation_interpolator_5" />
-    </set>
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="183"
-            android:propertyName="fillAlpha"
-            android:valueFrom="0.5"
-            android:valueTo="0.5"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="16"
-            android:propertyName="fillAlpha"
-            android:valueFrom="0.5"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/trusted_state_to_error_path_3_animation.xml b/packages/SystemUI/res/anim/trusted_state_to_error_path_3_animation.xml
deleted file mode 100644
index 455d0b8..0000000
--- a/packages/SystemUI/res/anim/trusted_state_to_error_path_3_animation.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="50"
-            android:propertyName="pathData"
-            android:valueFrom="M 5.00619506836,-6.046875 c 0.0,-2.76000976562 -2.23999023438,-5.0 -5.0,-5.0 c -2.76000976562,0.0 -5.0,2.23999023438 -5.0,5.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,-1.71002197266 1.38999938965,-3.09997558594 3.10000610352,-3.09997558594 c 1.71000671387,0.0 3.10000610352,1.38995361328 3.10000610352,3.09997558594 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,0.0 0.0,-2.0 0.0,-2.0 Z"
-            android:valueTo="M 5.00619506836,-6.046875 c 0.0,-2.76000976562 -2.23999023438,-5.0 -5.0,-5.0 c -2.76000976562,0.0 -5.0,2.23999023438 -5.0,5.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,-1.71002197266 1.38999938965,-3.09997558594 3.10000610352,-3.09997558594 c 1.71000671387,0.0 3.10000610352,1.38995361328 3.10000610352,3.09997558594 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,0.0 0.0,-2.0 0.0,-2.0 Z"
-            android:valueType="pathType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="150"
-            android:propertyName="pathData"
-            android:valueFrom="M 5.00619506836,-6.046875 c 0.0,-2.76000976562 -2.23999023438,-5.0 -5.0,-5.0 c -2.76000976562,0.0 -5.0,2.23999023438 -5.0,5.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,-1.71002197266 1.38999938965,-3.09997558594 3.10000610352,-3.09997558594 c 1.71000671387,0.0 3.10000610352,1.38995361328 3.10000610352,3.09997558594 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,0.0 0.0,-2.0 0.0,-2.0 Z"
-            android:valueTo="M 5.01239013672,3.390625 c 0.0,-2.76000976562 -2.23999023438,-5.0 -5.0,-5.0 c -2.76000976562,0.0 -5.0,2.23999023438 -5.0,5.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,-1.71002197266 1.38999938965,-3.09997558594 3.10000610352,-3.09997558594 c 1.71000671387,0.0 3.10000610352,1.38995361328 3.10000610352,3.09997558594 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,0.0 0.0,-2.0 0.0,-2.0 Z"
-            android:valueType="pathType"
-            android:interpolator="@interpolator/trusted_state_to_error_animation_interpolator_0" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/anim/trusted_state_to_error_toppath_animation.xml b/packages/SystemUI/res/anim/trusted_state_to_error_toppath_animation.xml
deleted file mode 100644
index b2944e5..0000000
--- a/packages/SystemUI/res/anim/trusted_state_to_error_toppath_animation.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<set
-    xmlns:android="http://schemas.android.com/apk/res/android" >
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="200"
-            android:propertyName="pathData"
-            android:valueFrom="M 0.0,-7.0 l 0.0,0.0 c 1.9329966243,0.0 3.5,1.5670033757 3.5,3.5 l 0.0,7.0 c 0.0,1.9329966243 -1.5670033757,3.5 -3.5,3.5 l 0.0,0.0 c -1.9329966243,0.0 -3.5,-1.5670033757 -3.5,-3.5 l 0.0,-7.0 c 0.0,-1.9329966243 1.5670033757,-3.5 3.5,-3.5 Z"
-            android:valueTo="M 0.0,-7.0 l 0.0,0.0 c 1.9329966243,0.0 3.5,1.5670033757 3.5,3.5 l 0.0,7.0 c 0.0,1.9329966243 -1.5670033757,3.5 -3.5,3.5 l 0.0,0.0 c -1.9329966243,0.0 -3.5,-1.5670033757 -3.5,-3.5 l 0.0,-7.0 c 0.0,-1.9329966243 1.5670033757,-3.5 3.5,-3.5 Z"
-            android:valueType="pathType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="300"
-            android:propertyName="pathData"
-            android:valueFrom="M 0.0,-7.0 l 0.0,0.0 c 1.9329966243,0.0 3.5,1.5670033757 3.5,3.5 l 0.0,7.0 c 0.0,1.9329966243 -1.5670033757,3.5 -3.5,3.5 l 0.0,0.0 c -1.9329966243,0.0 -3.5,-1.5670033757 -3.5,-3.5 l 0.0,-7.0 c 0.0,-1.9329966243 1.5670033757,-3.5 3.5,-3.5 Z"
-            android:valueTo="M 0.0,-3.0 l 0.0,0.0 c 0.5522847498,0.0 1.0,0.4477152502 1.0,1.0 l 0.0,4.0 c 0.0,0.5522847498 -0.4477152502,1.0 -1.0,1.0 l 0.0,0.0 c -0.5522847498,0.0 -1.0,-0.4477152502 -1.0,-1.0 l 0.0,-4.0 c 0.0,-0.5522847498 0.4477152502,-1.0 1.0,-1.0 Z"
-            android:valueType="pathType"
-            android:interpolator="@interpolator/trusted_state_to_error_animation_interpolator_2" />
-    </set>
-    <set
-        android:ordering="sequentially" >
-        <objectAnimator
-            android:duration="183"
-            android:propertyName="fillAlpha"
-            android:valueFrom="0.0"
-            android:valueTo="0.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-        <objectAnimator
-            android:duration="16"
-            android:propertyName="fillAlpha"
-            android:valueFrom="0.0"
-            android:valueTo="1.0"
-            android:valueType="floatType"
-            android:interpolator="@android:interpolator/linear" />
-    </set>
-</set>
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_phone_24dp.png b/packages/SystemUI/res/drawable-hdpi/ic_phone_24dp.png
deleted file mode 100644
index a6a6448..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_phone_24dp.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_phone_24dp.png b/packages/SystemUI/res/drawable-mdpi/ic_phone_24dp.png
deleted file mode 100644
index 2286bb4..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_phone_24dp.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_phone_24dp.png b/packages/SystemUI/res/drawable-xhdpi/ic_phone_24dp.png
deleted file mode 100644
index cd9ff60..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_phone_24dp.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_phone_24dp.png b/packages/SystemUI/res/drawable-xxhdpi/ic_phone_24dp.png
deleted file mode 100644
index 3c546e5..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_phone_24dp.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxxhdpi/ic_phone_24dp.png b/packages/SystemUI/res/drawable-xxxhdpi/ic_phone_24dp.png
deleted file mode 100644
index 4f7da0a..0000000
--- a/packages/SystemUI/res/drawable-xxxhdpi/ic_phone_24dp.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable/error_to_trustedstate.xml b/packages/SystemUI/res/drawable/error_to_trustedstate.xml
deleted file mode 100755
index bc196c9..0000000
--- a/packages/SystemUI/res/drawable/error_to_trustedstate.xml
+++ /dev/null
@@ -1,105 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<vector
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:name="error_to_trustedstate"
-    android:width="24dp"
-    android:viewportWidth="24"
-    android:height="24dp"
-    android:viewportHeight="24" >
-    <group
-        android:name="lock"
-        android:translateX="12"
-        android:translateY="12" >
-        <group
-            android:name="middle_ellipse"
-            android:translateY="2.9375" >
-            <path
-                android:name="ellipse_path_1"
-                android:fillColor="?attr/wallpaperTextColor"
-                android:fillAlpha="0.5"
-                android:pathData="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
-        </group>
-        <group
-            android:name="lock_right_side" >
-            <path
-                android:name="path_1"
-                android:pathData="M 1.63623046875,-4.953125 c 0.0,0.0 -1.61499023438,0.0 -1.61499023438,0.0 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 0.00375366210938,-0.015625 0.00375366210938,-0.015625 c 0.0,0.0 0.0118713378906,7.9296875 0.0118713378906,7.9296875 c 0.0,0.0 -0.0040283203125,0.015625 -0.0040283203125,0.015625 c 0.0,0.0 -0.0052490234375,2.0 -0.0052490234375,2.0 c 0.0,0.0 1.61987304688,0.0 1.61987304688,0.0 c 1.10000610352,0.0 2.0,-0.900024414062 2.0,-2.0 c 0.0,0.0 -0.01123046875,-7.9296875 -0.01123046875,-7.9296875 c 0.0,-1.09997558594 -0.899993896484,-2.0 -2.0,-2.0 Z"
-                android:fillColor="?attr/wallpaperTextColor"
-                android:fillAlpha="0.5" />
-        </group>
-        <group
-            android:name="lock_left_side" >
-            <path
-                android:name="path_2"
-                android:pathData="M 0.0252990722656,-2.96975708008 c 0.0,0.0 -0.00390625,0.0166320800781 -0.00390625,0.0166320800781 c 0.0,0.0 -0.00015258789062,-2.0 -0.00015258789062,-2.0 c 0.0,0.0 -1.63500976562,0.0 -1.63500976562,0.0 c -1.10000610352,0.0 -2.0,0.900024414062 -2.0,2.0 c 0.0,0.0 0.01123046875,7.9296875 0.01123046875,7.9296875 c 0.0,1.09997558594 0.899993896484,2.0 2.0,2.0 c 0.0,0.0 1.63500976562,0.0 1.63500976562,0.0 c 0.0,0.0 -0.000244140625,-2.0009765625 -0.000244140625,-2.0009765625 c 0.0,0.0 0.00390625,-0.015869140625 0.00390625,-0.015869140625 c 0.0,0.0 -0.0108337402344,-7.92947387695 -0.0108337402344,-7.92947387695 Z"
-                android:fillColor="?attr/wallpaperTextColor"
-                android:fillAlpha="0.5" />
-        </group>
-        <group
-            android:name="lock_top"
-            android:scaleX="0"
-            android:scaleY="0" >
-            <path
-                android:name="path_3"
-                android:pathData="M 5.01239013672,3.390625 c 0.0,-2.76000976562 -2.23999023438,-5.0 -5.0,-5.0 c -2.76000976562,0.0 -5.0,2.23999023438 -5.0,5.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,-1.71002197266 1.38999938965,-3.09997558594 3.10000610352,-3.09997558594 c 1.71000671387,0.0 3.10000610352,1.38995361328 3.10000610352,3.09997558594 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,0.0 0.0,-2.0 0.0,-2.0 Z"
-                android:fillColor="?attr/wallpaperTextColor"
-                android:fillAlpha="0.5" />
-        </group>
-    </group>
-    <group
-        android:name="errorexclamationdot"
-        android:translateX="12"
-        android:translateY="12" >
-        <group
-            android:name="exclamationbottom"
-            android:translateY="4" >
-            <path
-                android:name="bottompath"
-                android:fillColor="?android:attr/colorError"
-                android:pathData="M 0.0,-1.1 l 0.0,0.0 c 0.60751322478,0.0 1.1,0.49248677522 1.1,1.1 l 0.0,0.0 c 0.0,0.60751322478 -0.49248677522,1.1 -1.1,1.1 l 0.0,0.0 c -0.60751322478,0.0 -1.1,-0.49248677522 -1.1,-1.1 l 0.0,0.0 c 0.0,-0.60751322478 0.49248677522,-1.1 1.1,-1.1 Z" />
-        </group>
-    </group>
-    <group
-        android:name="errorexclamation"
-        android:translateX="12"
-        android:translateY="12" >
-        <group
-            android:name="exclamationtop"
-            android:translateY="-2" >
-            <path
-                android:name="toppath"
-                android:fillColor="?android:attr/colorError"
-                android:pathData="M 0.0,-3.0 l 0.0,0.0 c 0.5522847498,0.0 1.0,0.4477152502 1.0,1.0 l 0.0,4.0 c 0.0,0.5522847498 -0.4477152502,1.0 -1.0,1.0 l 0.0,0.0 c -0.5522847498,0.0 -1.0,-0.4477152502 -1.0,-1.0 l 0.0,-4.0 c 0.0,-0.5522847498 0.4477152502,-1.0 1.0,-1.0 Z" />
-        </group>
-    </group>
-    <group
-        android:name="errorcircle"
-        android:translateX="12"
-        android:translateY="12"
-        android:rotation="5" >
-        <group
-            android:name="circle" >
-            <path
-                android:name="circlepath"
-                android:strokeColor="?android:attr/colorError"
-                android:strokeWidth="2"
-                android:strokeLineCap="round"
-                android:pathData="M 0.0,-9.0 c 4.9705627482,0.0 9.0,4.0294372518 9.0,9.0 c 0.0,4.9705627482 -4.0294372518,9.0 -9.0,9.0 c -4.9705627482,0.0 -9.0,-4.0294372518 -9.0,-9.0 c 0.0,-4.9705627482 4.0294372518,-9.0 9.0,-9.0 Z" />
-        </group>
-    </group>
-</vector>
diff --git a/packages/SystemUI/res/drawable/error_to_trustedstate_animation.xml b/packages/SystemUI/res/drawable/error_to_trustedstate_animation.xml
deleted file mode 100755
index a494f1d..0000000
--- a/packages/SystemUI/res/drawable/error_to_trustedstate_animation.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<animated-vector
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:drawable="@drawable/error_to_trustedstate" >
-    <target
-        android:name="ellipse_path_1"
-        android:animation="@anim/error_to_trustedstate_ellipse_path_1_animation" />
-    <target
-        android:name="path_1"
-        android:animation="@anim/error_to_trustedstate_path_1_animation" />
-    <target
-        android:name="path_2"
-        android:animation="@anim/error_to_trustedstate_path_2_animation" />
-    <target
-        android:name="lock_top"
-        android:animation="@anim/error_to_trustedstate_lock_top_animation" />
-    <target
-        android:name="path_3"
-        android:animation="@anim/error_to_trustedstate_path_3_animation" />
-    <target
-        android:name="errorexclamationdot"
-        android:animation="@anim/error_to_trustedstate_errorexclamationdot_animation" />
-    <target
-        android:name="bottompath"
-        android:animation="@anim/error_to_trustedstate_bottompath_animation" />
-    <target
-        android:name="exclamationtop"
-        android:animation="@anim/error_to_trustedstate_exclamationtop_animation" />
-    <target
-        android:name="toppath"
-        android:animation="@anim/error_to_trustedstate_toppath_animation" />
-    <target
-        android:name="errorcircle"
-        android:animation="@anim/error_to_trustedstate_errorcircle_animation" />
-    <target
-        android:name="circlepath"
-        android:animation="@anim/error_to_trustedstate_circlepath_animation" />
-</animated-vector>
diff --git a/packages/SystemUI/res/drawable/ic_access_alarms_small.xml b/packages/SystemUI/res/drawable/ic_access_alarms_small.xml
deleted file mode 100644
index f6e5ceb..0000000
--- a/packages/SystemUI/res/drawable/ic_access_alarms_small.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="16dp"
-    android:height="16dp"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0">
-    <path
-        android:pathData="M21.35,6.49c-0.35,0.42 -0.98,0.47 -1.4,0.12l-3.07,-2.57a1,1 0,1 1,1.29 -1.53l3.07,2.57c0.42,0.35 0.47,0.98 0.11,1.41zM7.24,2.63a1,1 0,0 0,-1.41 -0.13L2.77,5.07A0.996,0.996 0,1 0,4.05 6.6l3.06,-2.57c0.43,-0.35 0.48,-0.98 0.13,-1.4zM11.75,8c-0.41,0 -0.75,0.34 -0.75,0.75v4.68c0,0.35 0.18,0.68 0.49,0.86l3.65,2.19c0.34,0.2 0.78,0.1 0.98,-0.24a0.71,0.71 0,0 0,-0.25 -0.99l-3.37,-2v-4.5c0,-0.41 -0.34,-0.75 -0.75,-0.75zM12,5.9c-3.91,0 -7.1,3.18 -7.1,7.1s3.19,7.1 7.1,7.1 7.1,-3.18 7.1,-7.1 -3.19,-7.1 -7.1,-7.1M12,4a9,9 0,1 1,-0.001 18.001A9,9 0,0 1,12 4z"
-        android:fillColor="#FFFFFFFF"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_delete.xml b/packages/SystemUI/res/drawable/ic_delete.xml
deleted file mode 100644
index 3580fdf..0000000
--- a/packages/SystemUI/res/drawable/ic_delete.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-Copyright (C) 2015 The Android Open Source Project
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24.0dp"
-        android:height="24.0dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FFFFFFFF"
-        android:pathData="M15,4V3H9v1H4v2h1v13c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V6h1V4H15zM17,19H7V6h10V19z"/>
-    <path
-        android:fillColor="#FFFFFFFF"
-        android:pathData="M9,8h2v9h-2z"/>
-    <path
-        android:fillColor="#FFFFFFFF"
-        android:pathData="M13,8h2v9h-2z"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_face_unlock.xml b/packages/SystemUI/res/drawable/ic_face_unlock.xml
deleted file mode 100644
index b302ed4..0000000
--- a/packages/SystemUI/res/drawable/ic_face_unlock.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportHeight="24.0"
-        android:viewportWidth="24.0">
-    <path android:fillColor="?attr/wallpaperTextColor"
-          android:strokeColor="?attr/wallpaperTextColor"
-          android:strokeWidth="1"
-          android:pathData="M9,11.75C8.31,11.75 7.75,12.31 7.75,13C7.75,13.69 8.31,14.25 9,14.25C9.69,14.25 10.25,13.69 10.25,13C10.25,12.31 9.69,11.75 9,11.75ZM15,11.75C14.31,11.75 13.75,12.31 13.75,13C13.75,13.69 14.31,14.25 15,14.25C15.69,14.25 16.25,13.69 16.25,13C16.25,12.31 15.69,11.75 15,11.75ZM12,2C6.48,2 2,6.48 2,12C2,17.52 6.48,22 12,22C17.52,22 22,17.52 22,12C22,6.48 17.52,2 12,2ZM12,20C7.59,20 4,16.41 4,12C4,11.71 4.02,11.42 4.05,11.14C6.41,10.09 8.28,8.16 9.26,5.77C11.07,8.33 14.05,10 17.42,10C18.2,10 18.95,9.91 19.67,9.74C19.88,10.45 20,11.21 20,12C20,16.41 16.41,20 12,20Z"
-    />
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_fingerprint.xml b/packages/SystemUI/res/drawable/ic_fingerprint.xml
deleted file mode 100644
index 7bbd39d..0000000
--- a/packages/SystemUI/res/drawable/ic_fingerprint.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<!--
-  ~ Copyright (C) 2017 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="32dp"
-    android:viewportWidth="24"
-    android:height="32dp"
-    android:viewportHeight="24" >
-    <group
-        android:translateX="12"
-        android:translateY="12.4"
-        android:scaleX="0.738"
-        android:scaleY="0.738" >
-        <group
-            android:translateX="33"
-            android:translateY="34" >
-            <path
-                android:pathData="M -25.3591003418,-24.4138946533 c -0.569000244141,0.106399536133 -1.12660217285,0.140594482422 -1.45460510254,0.140594482422 c -1.29689025879,0.0 -2.53239440918,-0.343307495117 -3.62019348145,-1.12400817871 c -1.67700195312,-1.20349121094 -2.76950073242,-3.17008972168 -2.76950073242,-5.39189147949"
-                android:strokeColor="?attr/wallpaperTextColor"
-                android:strokeAlpha="0.5"
-                android:strokeWidth="1.45"
-                android:strokeLineCap="round" />
-            <path
-                android:name="ridge_7_path"
-                android:pathData="M -36.1409912109,-21.7843475342 c -1.00540161133,-1.19300842285 -1.57499694824,-1.9181060791 -2.36520385742,-3.50170898438 c -0.827560424805,-1.65869140625 -1.31352233887,-3.49159240723 -1.31352233887,-5.48489379883 c 0.0,-3.66279602051 2.96932983398,-6.63220214844 6.63221740723,-6.63220214844 c 3.6628112793,0.0 6.63220214844,2.96940612793 6.63220214844,6.63220214844"
-                android:strokeColor="?attr/wallpaperTextColor"
-                android:strokeAlpha="0.5"
-                android:strokeWidth="1.45"
-                android:strokeLineCap="round" />
-            <path
-                android:pathData="M -42.1907958984,-25.6756896973 c -0.758117675781,-2.14370727539 -0.896545410156,-3.86891174316 -0.896545410156,-5.12921142578 c 0.0,-1.46069335938 0.249176025391,-2.84799194336 0.814682006836,-4.09748840332 c 1.56153869629,-3.45030212402 5.03434753418,-5.85076904297 9.0679473877,-5.85076904297 c 5.49430847168,0.0 9.94830322266,4.4539642334 9.94830322266,9.94825744629 c 0.0,1.83151245117 -1.48460388184,3.31610107422 -3.31610107422,3.31610107422 c -1.83149719238,0.0 -3.31610107422,-1.48469543457 -3.31610107422,-3.31610107422 c 0.0,-1.83139038086 -1.48458862305,-3.31610107422 -3.31610107422,-3.31610107422 c -1.83149719238,0.0 -3.31610107422,1.48471069336 -3.31610107422,3.31610107422 c 0.0,2.57020568848 0.989517211914,4.88710021973 2.60510253906,6.5865020752 c 1.22210693359,1.28550720215 2.43139648438,2.09950256348 4.47590637207,2.69030761719"
-                android:strokeColor="?attr/wallpaperTextColor"
-                android:strokeAlpha="0.5"
-                android:strokeWidth="1.45"
-                android:strokeLineCap="round" />
-            <path
-                android:pathData="M -44.0646514893,-38.1672973633 c 1.19026184082,-1.77430725098 2.67503356934,-3.24531555176 4.55902099609,-4.27278137207 c 1.88395690918,-1.0274810791 4.04466247559,-1.61137390137 6.34175109863,-1.61137390137 c 2.28761291504,0.0 4.43991088867,0.579071044922 6.31831359863,1.59861755371 c 1.8784942627,1.01954650879 3.36059570312,2.4796295166 4.55279541016,4.24153137207"
-                android:strokeColor="?attr/wallpaperTextColor"
-                android:strokeAlpha="0.5"
-                android:strokeWidth="1.45"
-                android:strokeLineCap="round" />
-            <group
-                android:translateX="-97.5"
-                android:translateY="-142.5" >
-                <path
-                    android:pathData="M 71.7812347412,97.0507202148 c -2.27149963379,-1.31344604492 -4.71360778809,-2.07006835938 -7.56221008301,-2.07006835938 c -2.84869384766,0.0 -5.23320007324,0.779556274414 -7.34411621094,2.07006835938"
-                    android:strokeColor="?attr/wallpaperTextColor"
-                    android:strokeAlpha="0.5"
-                    android:strokeWidth="1.45"
-                    android:strokeLineCap="round" />
-            </group>
-        </group>
-    </group>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_fingerprint_error.xml b/packages/SystemUI/res/drawable/ic_fingerprint_error.xml
deleted file mode 100644
index a7fb1a1..0000000
--- a/packages/SystemUI/res/drawable/ic_fingerprint_error.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-Copyright (C) 2015 The Android Open Source Project
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="32.0dp"
-        android:height="32.0dp"
-        android:viewportWidth="32.0"
-        android:viewportHeight="32.0">
-    <path
-        android:fillColor="?android:attr/colorError"
-        android:pathData="M15.99,2.5C8.53,2.5 2.5,8.54 2.5,16.0s6.03,13.5 13.49,13.5S29.5,23.46 29.5,16.0S23.45,2.5 15.99,2.5zM16.0,26.8c-5.97,0.0 -10.8,-4.83 -10.8,-10.8S10.03,5.2 16.0,5.2S26.8,10.03 26.8,16.0S21.97,26.8 16.0,26.8z"/>
-    <path
-        android:fillColor="?android:attr/colorError"
-        android:pathData="M14.65,20.05l2.7,0.0l0.0,2.7l-2.7,0.0z"/>
-    <path
-        android:fillColor="?android:attr/colorError"
-        android:pathData="M14.65,9.25l2.7,0.0l0.0,8.1l-2.7,0.0z"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_lock.xml b/packages/SystemUI/res/drawable/ic_lock.xml
deleted file mode 100644
index 3fb8c8d..0000000
--- a/packages/SystemUI/res/drawable/ic_lock.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="32dp"
-        android:height="32dp"
-        android:viewportWidth="32.0"
-        android:viewportHeight="32.0">
-    <path
-        android:pathData="M20.25,6.89C20.25,4.62 18.36,2.75 16,2.75C13.64,2.75 11.75,4.62 11.75,6.89V11.25H20.25V6.89ZM21.75,11.25V6.89C21.75,3.76 19.16,1.25 16,1.25C12.84,1.25 10.25,3.76 10.25,6.89V11.25H10C8.48,11.25 7.25,12.48 7.25,14V26C7.25,27.52 8.48,28.75 10,28.75H22C23.52,28.75 24.75,27.52 24.75,26V14C24.75,12.48 23.52,11.25 22,11.25H21.75ZM10,12.75C9.31,12.75 8.75,13.31 8.75,14V26C8.75,26.69 9.31,27.25 10,27.25H22C22.69,27.25 23.25,26.69 23.25,26V14C23.25,13.31 22.69,12.75 22,12.75H10ZM18,20C18,21.1 17.1,22 16,22C14.9,22 14,21.1 14,20C14,18.9 14.9,18 16,18C17.1,18 18,18.9 18,20Z"
-        android:fillType="evenOdd"
-        android:fillColor="?attr/wallpaperTextColor"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_lock_open.xml b/packages/SystemUI/res/drawable/ic_lock_open.xml
deleted file mode 100644
index 12a811c..0000000
--- a/packages/SystemUI/res/drawable/ic_lock_open.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="32dp"
-        android:height="32dp"
-        android:viewportWidth="32.0"
-        android:viewportHeight="32.0">
-    <path
-        android:pathData="M21.75,6.89C21.75,4.62 23.64,2.75 26,2.75C28.36,2.75 30.25,4.62 30.25,6.89V12H31.75V6.89C31.75,3.76 29.16,1.25 26,1.25C22.84,1.25 20.25,3.76 20.25,6.89V11.25H10C8.48,11.25 7.25,12.48 7.25,14V26C7.25,27.52 8.48,28.75 10,28.75H22C23.52,28.75 24.75,27.52 24.75,26V14C24.75,12.48 23.52,11.25 22,11.25H21.75V6.89ZM10,12.75C9.31,12.75 8.75,13.31 8.75,14V26C8.75,26.69 9.31,27.25 10,27.25H22C22.69,27.25 23.25,26.69 23.25,26V14C23.25,13.31 22.69,12.75 22,12.75H10ZM18,20C18,21.1 17.1,22 16,22C14.9,22 14,21.1 14,20C14,18.9 14.9,18 16,18C17.1,18 18,18.9 18,20Z"
-        android:fillType="evenOdd"
-        android:fillColor="?attr/wallpaperTextColor"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_lock_open_24dp.xml b/packages/SystemUI/res/drawable/ic_lock_open_24dp.xml
deleted file mode 100644
index 232cf70..0000000
--- a/packages/SystemUI/res/drawable/ic_lock_open_24dp.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24.0dp"
-        android:height="24.0dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
-
-    <path
-        android:fillColor="?attr/wallpaperTextColor"
-        android:pathData="M12.0,17.0c1.1,0.0 2.0,-0.9 2.0,-2.0s-0.9,-2.0 -2.0,-2.0c-1.1,0.0 -2.0,0.9 -2.0,2.0S10.9,17.0 12.0,17.0zM18.0,8.0l-1.0,0.0L17.0,6.0c0.0,-2.8 -2.2,-5.0 -5.0,-5.0C9.2,1.0 7.0,3.2 7.0,6.0l1.9,0.0c0.0,-1.7 1.4,-3.1 3.1,-3.1c1.7,0.0 3.1,1.4 3.1,3.1l0.0,2.0L6.0,8.0c-1.1,0.0 -2.0,0.9 -2.0,2.0l0.0,10.0c0.0,1.1 0.9,2.0 2.0,2.0l12.0,0.0c1.1,0.0 2.0,-0.9 2.0,-2.0L20.0,10.0C20.0,8.9 19.1,8.0 18.0,8.0zM18.0,20.0L6.0,20.0L6.0,10.0l12.0,0.0L18.0,20.0z"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_open_in_new.xml b/packages/SystemUI/res/drawable/ic_open_in_new.xml
new file mode 100644
index 0000000..3d53871
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_open_in_new.xml
@@ -0,0 +1,23 @@
+<!-- Copyright (C) 2019 The Android Open Source Project
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at"+
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24"
+        android:viewportHeight="24">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M19,19H5V5h7V3H5c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2v-7h-2v7zM14,3v2h3.59l-9.83,9.83 1.41,1.41L19,6.41V10h2V3h-7z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_sysbar_back_carmode.xml b/packages/SystemUI/res/drawable/ic_sysbar_back_carmode.xml
deleted file mode 100644
index 5844b2e..0000000
--- a/packages/SystemUI/res/drawable/ic_sysbar_back_carmode.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="44dp"
-        android:height="44dp"
-        android:viewportWidth="44.0"
-        android:viewportHeight="44.0">
-    <path
-        android:pathData="M9,22.06C9,21.22 9.51,20.42 10.36,19.95L31.56,7.87C32.57,7.3 33.42,7.49 33.89,7.75C34.92,8.33 35,9.44 35,9.91L35,34.09C35,34.65 34.92,35.69 33.91,36.25C33.46,36.51 32.66,36.69 31.67,36.14L10.26,24.05C9.49,23.61 9,22.87 9,22.06L9,22.06ZM31.5,12L13.5,22.04L31.5,32L31.5,12Z"
-        android:strokeColor="#00000000"
-        android:fillType="evenOdd"
-        android:fillColor="#F8F9FA"
-        android:strokeWidth="1"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_sysbar_home_carmode.xml b/packages/SystemUI/res/drawable/ic_sysbar_home_carmode.xml
deleted file mode 100644
index e07bf6f..0000000
--- a/packages/SystemUI/res/drawable/ic_sysbar_home_carmode.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="44dp"
-        android:height="44dp"
-        android:viewportWidth="44.0"
-        android:viewportHeight="44.0">
-    <path
-        android:pathData="M22.39,22.39m-14.54,0a14.54,14.54 0,1 1,29.07 0a14.54,14.54 0,1 1,-29.07 0"
-        android:fillType="evenOdd"
-        android:strokeColor="#F8F9FA"
-        android:fillColor="#00000000"
-        android:strokeWidth="4"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/lockscreen_fingerprint_draw_off.xml b/packages/SystemUI/res/drawable/lockscreen_fingerprint_draw_off.xml
deleted file mode 100644
index 8d382a3..0000000
--- a/packages/SystemUI/res/drawable/lockscreen_fingerprint_draw_off.xml
+++ /dev/null
@@ -1,86 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2017 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:name="lockscreen_fingerprint_draw_off"
-    android:width="32dp"
-    android:viewportWidth="32"
-    android:height="32dp"
-    android:viewportHeight="32" >
-    <group
-        android:name="white_fingerprint_ridges"
-        android:translateX="16.125"
-        android:translateY="19.75" >
-        <group
-            android:name="white_fingerprint_ridges_pivot"
-            android:translateX="33.2085"
-            android:translateY="30.91685" >
-            <group
-                android:name="ridge_5" >
-                <path
-                    android:name="ridge_5_path"
-                    android:pathData="M -25.3591003418,-24.4138946533 c -0.569000244141,0.106399536133 -1.12660217285,0.140594482422 -1.45460510254,0.140594482422 c -1.29689025879,0.0 -2.53239440918,-0.343307495117 -3.62019348145,-1.12400817871 c -1.67700195312,-1.20349121094 -2.76950073242,-3.17008972168 -2.76950073242,-5.39189147949"
-                    android:strokeColor="?attr/wallpaperTextColor"
-                    android:strokeAlpha="0.5"
-                    android:strokeWidth="1.45"
-                    android:strokeLineCap="round" />
-            </group>
-            <group
-                android:name="ridge_4" >
-                <path
-                    android:name="ridge_7_path"
-                    android:pathData="M -36.1409912109,-21.7843475342 c -1.00540161133,-1.19300842285 -1.57499694824,-1.9181060791 -2.36520385742,-3.50170898438 c -0.827560424805,-1.65869140625 -1.31352233887,-3.49159240723 -1.31352233887,-5.48489379883 c 0.0,-3.66279602051 2.96932983398,-6.63220214844 6.63221740723,-6.63220214844 c 3.6628112793,0.0 6.63220214844,2.96940612793 6.63220214844,6.63220214844"
-                    android:strokeColor="?attr/wallpaperTextColor"
-                    android:strokeAlpha="0.5"
-                    android:strokeWidth="1.45"
-                    android:strokeLineCap="round" />
-            </group>
-            <group
-                android:name="ridge_3" >
-                <path
-                    android:name="ridge_6_path"
-                    android:pathData="M -42.1907958984,-25.6756896973 c -0.758117675781,-2.14370727539 -0.896545410156,-3.86891174316 -0.896545410156,-5.12921142578 c 0.0,-1.46069335938 0.249176025391,-2.84799194336 0.814682006836,-4.09748840332 c 1.56153869629,-3.45030212402 5.03434753418,-5.85076904297 9.0679473877,-5.85076904297 c 5.49430847168,0.0 9.94830322266,4.4539642334 9.94830322266,9.94825744629 c 0.0,1.83151245117 -1.48460388184,3.31610107422 -3.31610107422,3.31610107422 c -1.83149719238,0.0 -3.31610107422,-1.48469543457 -3.31610107422,-3.31610107422 c 0.0,-1.83139038086 -1.48458862305,-3.31610107422 -3.31610107422,-3.31610107422 c -1.83149719238,0.0 -3.31610107422,1.48471069336 -3.31610107422,3.31610107422 c 0.0,2.57020568848 0.989517211914,4.88710021973 2.60510253906,6.5865020752 c 1.22210693359,1.28550720215 2.43139648438,2.09950256348 4.47590637207,2.69030761719"
-                    android:strokeColor="?attr/wallpaperTextColor"
-                    android:strokeAlpha="0.5"
-                    android:strokeWidth="1.45"
-                    android:strokeLineCap="round" />
-            </group>
-            <group
-                android:name="ridge_2" >
-                <path
-                    android:name="ridge_2_path"
-                    android:pathData="M -44.0646514893,-38.1672973633 c 1.19026184082,-1.77430725098 2.67503356934,-3.24531555176 4.55902099609,-4.27278137207 c 1.88395690918,-1.0274810791 4.04466247559,-1.61137390137 6.34175109863,-1.61137390137 c 2.28761291504,0.0 4.43991088867,0.579071044922 6.31831359863,1.59861755371 c 1.8784942627,1.01954650879 3.36059570312,2.4796295166 4.55279541016,4.24153137207"
-                    android:strokeColor="?attr/wallpaperTextColor"
-                    android:strokeAlpha="0.5"
-                    android:strokeWidth="1.45"
-                    android:strokeLineCap="round" />
-            </group>
-            <group
-                android:name="ridge_1"
-                android:translateX="-97.5"
-                android:translateY="-142.5" >
-                <path
-                    android:name="ridge_1_path"
-                    android:pathData="M 71.7812347412,97.0507202148 c -2.27149963379,-1.31344604492 -4.71360778809,-2.07006835938 -7.56221008301,-2.07006835938 c -2.84869384766,0.0 -5.23320007324,0.779556274414 -7.34411621094,2.07006835938"
-                    android:strokeColor="?attr/wallpaperTextColor"
-                    android:strokeAlpha="0.5"
-                    android:strokeWidth="1.45"
-                    android:strokeLineCap="round" />
-            </group>
-        </group>
-    </group>
-</vector>
diff --git a/packages/SystemUI/res/drawable/lockscreen_fingerprint_draw_off_animation.xml b/packages/SystemUI/res/drawable/lockscreen_fingerprint_draw_off_animation.xml
deleted file mode 100644
index 1599577..0000000
--- a/packages/SystemUI/res/drawable/lockscreen_fingerprint_draw_off_animation.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<animated-vector
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:drawable="@drawable/lockscreen_fingerprint_draw_off" >
-    <target
-        android:name="ridge_5_path"
-        android:animation="@anim/lockscreen_fingerprint_draw_off_ridge_5_path_animation" />
-    <target
-        android:name="ridge_7_path"
-        android:animation="@anim/lockscreen_fingerprint_draw_off_ridge_7_path_animation" />
-    <target
-        android:name="ridge_6_path"
-        android:animation="@anim/lockscreen_fingerprint_draw_off_ridge_6_path_animation" />
-    <target
-        android:name="ridge_2_path"
-        android:animation="@anim/lockscreen_fingerprint_draw_off_ridge_2_path_animation" />
-    <target
-        android:name="ridge_1_path"
-        android:animation="@anim/lockscreen_fingerprint_draw_off_ridge_1_path_animation" />
-</animated-vector>
diff --git a/packages/SystemUI/res/drawable/lockscreen_fingerprint_draw_on.xml b/packages/SystemUI/res/drawable/lockscreen_fingerprint_draw_on.xml
deleted file mode 100644
index 4fe160d..0000000
--- a/packages/SystemUI/res/drawable/lockscreen_fingerprint_draw_on.xml
+++ /dev/null
@@ -1,91 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2017 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:name="lockscreen_fingerprint_draw_on"
-    android:width="32dp"
-    android:viewportWidth="32"
-    android:height="32dp"
-    android:viewportHeight="32" >
-    <group
-        android:name="white_fingerprint_ridges"
-        android:translateX="16.125"
-        android:translateY="19.75" >
-        <group
-            android:name="white_fingerprint_ridges_pivot"
-            android:translateX="33.2085"
-            android:translateY="30.91685" >
-            <group
-                android:name="ridge_5" >
-                <path
-                    android:name="ridge_5_path"
-                    android:pathData="M -25.3591003418,-24.4138946533 c -0.569000244141,0.106399536133 -1.12660217285,0.140594482422 -1.45460510254,0.140594482422 c -1.29689025879,0.0 -2.53239440918,-0.343307495117 -3.62019348145,-1.12400817871 c -1.67700195312,-1.20349121094 -2.76950073242,-3.17008972168 -2.76950073242,-5.39189147949"
-                    android:strokeColor="?attr/wallpaperTextColor"
-                    android:strokeAlpha="0.5"
-                    android:strokeWidth="1.45"
-                    android:strokeLineCap="round"
-                    android:trimPathEnd="0" />
-            </group>
-            <group
-                android:name="ridge_4" >
-                <path
-                    android:name="ridge_7_path"
-                    android:pathData="M -36.1409912109,-21.7843475342 c -1.00540161133,-1.19300842285 -1.57499694824,-1.9181060791 -2.36520385742,-3.50170898438 c -0.827560424805,-1.65869140625 -1.31352233887,-3.49159240723 -1.31352233887,-5.48489379883 c 0.0,-3.66279602051 2.96932983398,-6.63220214844 6.63221740723,-6.63220214844 c 3.6628112793,0.0 6.63220214844,2.96940612793 6.63220214844,6.63220214844"
-                    android:strokeColor="?attr/wallpaperTextColor"
-                    android:strokeAlpha="0.5"
-                    android:strokeWidth="1.45"
-                    android:strokeLineCap="round"
-                    android:trimPathEnd="0" />
-            </group>
-            <group
-                android:name="ridge_3" >
-                <path
-                    android:name="ridge_6_path"
-                    android:pathData="M -42.1907958984,-25.6756896973 c -0.758117675781,-2.14370727539 -0.896545410156,-3.86891174316 -0.896545410156,-5.12921142578 c 0.0,-1.46069335938 0.249176025391,-2.84799194336 0.814682006836,-4.09748840332 c 1.56153869629,-3.45030212402 5.03434753418,-5.85076904297 9.0679473877,-5.85076904297 c 5.49430847168,0.0 9.94830322266,4.4539642334 9.94830322266,9.94825744629 c 0.0,1.83151245117 -1.48460388184,3.31610107422 -3.31610107422,3.31610107422 c -1.83149719238,0.0 -3.31610107422,-1.48469543457 -3.31610107422,-3.31610107422 c 0.0,-1.83139038086 -1.48458862305,-3.31610107422 -3.31610107422,-3.31610107422 c -1.83149719238,0.0 -3.31610107422,1.48471069336 -3.31610107422,3.31610107422 c 0.0,2.57020568848 0.989517211914,4.88710021973 2.60510253906,6.5865020752 c 1.22210693359,1.28550720215 2.43139648438,2.09950256348 4.47590637207,2.69030761719"
-                    android:strokeColor="?attr/wallpaperTextColor"
-                    android:strokeAlpha="0.5"
-                    android:strokeWidth="1.45"
-                    android:strokeLineCap="round"
-                    android:trimPathStart="1" />
-            </group>
-            <group
-                android:name="ridge_2" >
-                <path
-                    android:name="ridge_2_path"
-                    android:pathData="M -44.0646514893,-38.1672973633 c 1.19026184082,-1.77430725098 2.67503356934,-3.24531555176 4.55902099609,-4.27278137207 c 1.88395690918,-1.0274810791 4.04466247559,-1.61137390137 6.34175109863,-1.61137390137 c 2.28761291504,0.0 4.43991088867,0.579071044922 6.31831359863,1.59861755371 c 1.8784942627,1.01954650879 3.36059570312,2.4796295166 4.55279541016,4.24153137207"
-                    android:strokeColor="?attr/wallpaperTextColor"
-                    android:strokeAlpha="0.5"
-                    android:strokeWidth="1.45"
-                    android:strokeLineCap="round"
-                    android:trimPathStart="1" />
-            </group>
-            <group
-                android:name="ridge_1"
-                android:translateX="-97.5"
-                android:translateY="-142.5" >
-                <path
-                    android:name="ridge_1_path"
-                    android:pathData="M 71.7812347412,97.0507202148 c -2.27149963379,-1.31344604492 -4.71360778809,-2.07006835938 -7.56221008301,-2.07006835938 c -2.84869384766,0.0 -5.23320007324,0.779556274414 -7.34411621094,2.07006835938"
-                    android:strokeColor="?attr/wallpaperTextColor"
-                    android:strokeAlpha="0.5"
-                    android:strokeWidth="1.45"
-                    android:strokeLineCap="round"
-                    android:trimPathEnd="0" />
-            </group>
-        </group>
-    </group>
-</vector>
diff --git a/packages/SystemUI/res/drawable/lockscreen_fingerprint_draw_on_animation.xml b/packages/SystemUI/res/drawable/lockscreen_fingerprint_draw_on_animation.xml
deleted file mode 100644
index d1aac02..0000000
--- a/packages/SystemUI/res/drawable/lockscreen_fingerprint_draw_on_animation.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<animated-vector
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:drawable="@drawable/lockscreen_fingerprint_draw_on" >
-    <target
-        android:name="ridge_5_path"
-        android:animation="@anim/lockscreen_fingerprint_draw_on_ridge_5_path_animation" />
-    <target
-        android:name="ridge_7_path"
-        android:animation="@anim/lockscreen_fingerprint_draw_on_ridge_7_path_animation" />
-    <target
-        android:name="ridge_6_path"
-        android:animation="@anim/lockscreen_fingerprint_draw_on_ridge_6_path_animation" />
-    <target
-        android:name="ridge_2_path"
-        android:animation="@anim/lockscreen_fingerprint_draw_on_ridge_2_path_animation" />
-    <target
-        android:name="ridge_1_path"
-        android:animation="@anim/lockscreen_fingerprint_draw_on_ridge_1_path_animation" />
-</animated-vector>
diff --git a/packages/SystemUI/res/drawable/lockscreen_fingerprint_error_state_to_fp.xml b/packages/SystemUI/res/drawable/lockscreen_fingerprint_error_state_to_fp.xml
deleted file mode 100644
index 832716a..0000000
--- a/packages/SystemUI/res/drawable/lockscreen_fingerprint_error_state_to_fp.xml
+++ /dev/null
@@ -1,130 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2017 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:name="ic_fingerprint_tofp"
-    android:width="32dp"
-    android:viewportWidth="24"
-    android:height="32dp"
-    android:viewportHeight="24" >
-    <group
-        android:name="fingerprintwhite"
-        android:translateX="12"
-        android:translateY="12.4"
-        android:scaleX="0.738"
-        android:scaleY="0.738"
-        android:rotation="180" >
-        <group
-            android:name="fingerprintwhite_pivot"
-            android:translateX="33"
-            android:translateY="34" >
-            <group
-                android:name="ridge_5" >
-                <path
-                    android:name="ridge_5_path"
-                    android:pathData="M -25.3591003418,-24.4138946533 c -0.569000244141,0.106399536133 -1.12660217285,0.140594482422 -1.45460510254,0.140594482422 c -1.29689025879,0.0 -2.53239440918,-0.343307495117 -3.62019348145,-1.12400817871 c -1.67700195312,-1.20349121094 -2.76950073242,-3.17008972168 -2.76950073242,-5.39189147949"
-                    android:strokeColor="?attr/wallpaperTextColor"
-                    android:strokeAlpha="0.5"
-                    android:strokeWidth="1.45"
-                    android:strokeLineCap="round"
-                    android:trimPathEnd="0" />
-            </group>
-            <group
-                android:name="ridge_4" >
-                <path
-                    android:name="ridge_7_path"
-                    android:pathData="M -36.1409912109,-21.7843475342 c -1.00540161133,-1.19300842285 -1.57499694824,-1.9181060791 -2.36520385742,-3.50170898438 c -0.827560424805,-1.65869140625 -1.31352233887,-3.49159240723 -1.31352233887,-5.48489379883 c 0.0,-3.66279602051 2.96932983398,-6.63220214844 6.63221740723,-6.63220214844 c 3.6628112793,0.0 6.63220214844,2.96940612793 6.63220214844,6.63220214844"
-                    android:strokeColor="?attr/wallpaperTextColor"
-                    android:strokeAlpha="0.5"
-                    android:strokeWidth="1.45"
-                    android:strokeLineCap="round"
-                    android:trimPathEnd="0" />
-            </group>
-            <group
-                android:name="ridge_3" >
-                <path
-                    android:name="ridge_6_path"
-                    android:pathData="M -42.1907958984,-25.6756896973 c -0.758117675781,-2.14370727539 -0.896545410156,-3.86891174316 -0.896545410156,-5.12921142578 c 0.0,-1.46069335938 0.249176025391,-2.84799194336 0.814682006836,-4.09748840332 c 1.56153869629,-3.45030212402 5.03434753418,-5.85076904297 9.0679473877,-5.85076904297 c 5.49430847168,0.0 9.94830322266,4.4539642334 9.94830322266,9.94825744629 c 0.0,1.83151245117 -1.48460388184,3.31610107422 -3.31610107422,3.31610107422 c -1.83149719238,0.0 -3.31610107422,-1.48469543457 -3.31610107422,-3.31610107422 c 0.0,-1.83139038086 -1.48458862305,-3.31610107422 -3.31610107422,-3.31610107422 c -1.83149719238,0.0 -3.31610107422,1.48471069336 -3.31610107422,3.31610107422 c 0.0,2.57020568848 0.989517211914,4.88710021973 2.60510253906,6.5865020752 c 1.22210693359,1.28550720215 2.43139648438,2.09950256348 4.47590637207,2.69030761719"
-                    android:strokeColor="?attr/wallpaperTextColor"
-                    android:strokeAlpha="0.5"
-                    android:strokeWidth="1.45"
-                    android:strokeLineCap="round"
-                    android:trimPathStart="1" />
-            </group>
-            <group
-                android:name="ridge_2" >
-                <path
-                    android:name="ridge_2_path"
-                    android:pathData="M -44.0646514893,-38.1672973633 c 1.19026184082,-1.77430725098 2.67503356934,-3.24531555176 4.55902099609,-4.27278137207 c 1.88395690918,-1.0274810791 4.04466247559,-1.61137390137 6.34175109863,-1.61137390137 c 2.28761291504,0.0 4.43991088867,0.579071044922 6.31831359863,1.59861755371 c 1.8784942627,1.01954650879 3.36059570312,2.4796295166 4.55279541016,4.24153137207"
-                    android:strokeColor="?attr/wallpaperTextColor"
-                    android:strokeAlpha="0.5"
-                    android:strokeWidth="1.45"
-                    android:strokeLineCap="round"
-                    android:trimPathStart="1" />
-            </group>
-            <group
-                android:name="ridge_1"
-                android:translateX="-97.5"
-                android:translateY="-142.5" >
-                <path
-                    android:name="ridge_1_path"
-                    android:pathData="M 71.7812347412,97.0507202148 c -2.27149963379,-1.31344604492 -4.71360778809,-2.07006835938 -7.56221008301,-2.07006835938 c -2.84869384766,0.0 -5.23320007324,0.779556274414 -7.34411621094,2.07006835938"
-                    android:strokeColor="?attr/wallpaperTextColor"
-                    android:strokeAlpha="0.5"
-                    android:strokeWidth="1.45"
-                    android:strokeLineCap="round"
-                    android:trimPathEnd="0" />
-            </group>
-        </group>
-    </group>
-    <group
-        android:name="errorcircle"
-        android:translateX="12"
-        android:translateY="12"
-        android:rotation="10" >
-        <group
-            android:name="circle" >
-            <path
-                android:name="circlepath"
-                android:strokeColor="?android:attr/colorError"
-                android:strokeWidth="2"
-                android:strokeLineCap="round"
-                android:pathData="M 0.0,-9.0 c 4.9705627482,0.0 9.0,4.0294372518 9.0,9.0 c 0.0,4.9705627482 -4.0294372518,9.0 -9.0,9.0 c -4.9705627482,0.0 -9.0,-4.0294372518 -9.0,-9.0 c 0.0,-4.9705627482 4.0294372518,-9.0 9.0,-9.0 Z" />
-        </group>
-    </group>
-    <group
-        android:name="errorexclamation"
-        android:translateX="12"
-        android:translateY="12" >
-        <group
-            android:name="exclamationbottom"
-            android:translateY="4" >
-            <path
-                android:name="bottompath"
-                android:fillColor="?android:attr/colorError"
-                android:pathData="M 0.0,-1.1 l 0.0,0.0 c 0.60751322478,0.0 1.1,0.49248677522 1.1,1.1 l 0.0,0.0 c 0.0,0.60751322478 -0.49248677522,1.1 -1.1,1.1 l 0.0,0.0 c -0.60751322478,0.0 -1.1,-0.49248677522 -1.1,-1.1 l 0.0,0.0 c 0.0,-0.60751322478 0.49248677522,-1.1 1.1,-1.1 Z" />
-        </group>
-        <group
-            android:name="exclamationtop"
-            android:translateY="-2" >
-            <path
-                android:name="toppath"
-                android:fillColor="?android:attr/colorError"
-                android:pathData="M 0.0,-3.0 l 0.0,0.0 c 0.5522847498,0.0 1.0,0.4477152502 1.0,1.0 l 0.0,4.0 c 0.0,0.5522847498 -0.4477152502,1.0 -1.0,1.0 l 0.0,0.0 c -0.5522847498,0.0 -1.0,-0.4477152502 -1.0,-1.0 l 0.0,-4.0 c 0.0,-0.5522847498 0.4477152502,-1.0 1.0,-1.0 Z" />
-        </group>
-    </group>
-</vector>
diff --git a/packages/SystemUI/res/drawable/lockscreen_fingerprint_error_state_to_fp_animation.xml b/packages/SystemUI/res/drawable/lockscreen_fingerprint_error_state_to_fp_animation.xml
deleted file mode 100644
index 2f33306..0000000
--- a/packages/SystemUI/res/drawable/lockscreen_fingerprint_error_state_to_fp_animation.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<animated-vector
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:drawable="@drawable/lockscreen_fingerprint_error_state_to_fp" >
-    <target
-        android:name="fingerprintwhite"
-        android:animation="@anim/ic_fingerprint_tofp_fingerprintwhite_animation" />
-    <target
-        android:name="ridge_5_path"
-        android:animation="@anim/ic_fingerprint_tofp_ridge_5_path_animation" />
-    <target
-        android:name="ridge_7_path"
-        android:animation="@anim/ic_fingerprint_tofp_ridge_7_path_animation" />
-    <target
-        android:name="ridge_6_path"
-        android:animation="@anim/ic_fingerprint_tofp_ridge_6_path_animation" />
-    <target
-        android:name="ridge_2_path"
-        android:animation="@anim/ic_fingerprint_tofp_ridge_2_path_animation" />
-    <target
-        android:name="ridge_1_path"
-        android:animation="@anim/ic_fingerprint_tofp_ridge_1_path_animation" />
-    <target
-        android:name="errorcircle"
-        android:animation="@anim/ic_fingerprint_tofp_errorcircle_animation" />
-    <target
-        android:name="circlepath"
-        android:animation="@anim/ic_fingerprint_tofp_circlepath_animation" />
-    <target
-        android:name="errorexclamation"
-        android:animation="@anim/ic_fingerprint_tofp_errorexclamation_animation" />
-    <target
-        android:name="exclamationbottom"
-        android:animation="@anim/ic_fingerprint_tofp_exclamationbottom_animation" />
-    <target
-        android:name="bottompath"
-        android:animation="@anim/ic_fingerprint_tofp_bottompath_animation" />
-    <target
-        android:name="exclamationtop"
-        android:animation="@anim/ic_fingerprint_tofp_exclamationtop_animation" />
-    <target
-        android:name="toppath"
-        android:animation="@anim/ic_fingerprint_tofp_toppath_animation" />
-</animated-vector>
diff --git a/packages/SystemUI/res/drawable/lockscreen_fingerprint_fp_to_error_state.xml b/packages/SystemUI/res/drawable/lockscreen_fingerprint_fp_to_error_state.xml
deleted file mode 100644
index 7cc2e5c..0000000
--- a/packages/SystemUI/res/drawable/lockscreen_fingerprint_fp_to_error_state.xml
+++ /dev/null
@@ -1,189 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<vector
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:name="ic_fingerprint_toerror"
-    android:width="32dp"
-    android:viewportWidth="24"
-    android:height="32dp"
-    android:viewportHeight="24" >
-    <group
-        android:name="fingerprintwhite"
-        android:translateX="12"
-        android:translateY="12.4"
-        android:scaleX="0.738"
-        android:scaleY="0.738" >
-        <group
-            android:name="fingerprintwhite_pivot"
-            android:translateX="33"
-            android:translateY="34" >
-            <group
-                android:name="ridge_5" >
-                <path
-                    android:name="ridge_5_path"
-                    android:pathData="M -25.3591003418,-24.4138946533 c -0.569000244141,0.106399536133 -1.12660217285,0.140594482422 -1.45460510254,0.140594482422 c -1.29689025879,0.0 -2.53239440918,-0.343307495117 -3.62019348145,-1.12400817871 c -1.67700195312,-1.20349121094 -2.76950073242,-3.17008972168 -2.76950073242,-5.39189147949"
-                    android:strokeColor="?attr/wallpaperTextColor"
-                    android:strokeAlpha="0.5"
-                    android:strokeWidth="1.45"
-                    android:strokeLineCap="round" />
-            </group>
-            <group
-                android:name="ridge_4" >
-                <path
-                    android:name="ridge_7_path"
-                    android:pathData="M -36.1409912109,-21.7843475342 c -1.00540161133,-1.19300842285 -1.57499694824,-1.9181060791 -2.36520385742,-3.50170898438 c -0.827560424805,-1.65869140625 -1.31352233887,-3.49159240723 -1.31352233887,-5.48489379883 c 0.0,-3.66279602051 2.96932983398,-6.63220214844 6.63221740723,-6.63220214844 c 3.6628112793,0.0 6.63220214844,2.96940612793 6.63220214844,6.63220214844"
-                    android:strokeColor="?attr/wallpaperTextColor"
-                    android:strokeAlpha="0.5"
-                    android:strokeWidth="1.45"
-                    android:strokeLineCap="round" />
-            </group>
-            <group
-                android:name="ridge_3" >
-                <path
-                    android:name="ridge_6_path"
-                    android:pathData="M -42.1907958984,-25.6756896973 c -0.758117675781,-2.14370727539 -0.896545410156,-3.86891174316 -0.896545410156,-5.12921142578 c 0.0,-1.46069335938 0.249176025391,-2.84799194336 0.814682006836,-4.09748840332 c 1.56153869629,-3.45030212402 5.03434753418,-5.85076904297 9.0679473877,-5.85076904297 c 5.49430847168,0.0 9.94830322266,4.4539642334 9.94830322266,9.94825744629 c 0.0,1.83151245117 -1.48460388184,3.31610107422 -3.31610107422,3.31610107422 c -1.83149719238,0.0 -3.31610107422,-1.48469543457 -3.31610107422,-3.31610107422 c 0.0,-1.83139038086 -1.48458862305,-3.31610107422 -3.31610107422,-3.31610107422 c -1.83149719238,0.0 -3.31610107422,1.48471069336 -3.31610107422,3.31610107422 c 0.0,2.57020568848 0.989517211914,4.88710021973 2.60510253906,6.5865020752 c 1.22210693359,1.28550720215 2.43139648438,2.09950256348 4.47590637207,2.69030761719"
-                    android:strokeColor="?attr/wallpaperTextColor"
-                    android:strokeAlpha="0.5"
-                    android:strokeWidth="1.45"
-                    android:strokeLineCap="round" />
-            </group>
-            <group
-                android:name="ridge_2" >
-                <path
-                    android:name="ridge_2_path"
-                    android:pathData="M -44.0646514893,-38.1672973633 c 1.19026184082,-1.77430725098 2.67503356934,-3.24531555176 4.55902099609,-4.27278137207 c 1.88395690918,-1.0274810791 4.04466247559,-1.61137390137 6.34175109863,-1.61137390137 c 2.28761291504,0.0 4.43991088867,0.579071044922 6.31831359863,1.59861755371 c 1.8784942627,1.01954650879 3.36059570312,2.4796295166 4.55279541016,4.24153137207"
-                    android:strokeColor="?attr/wallpaperTextColor"
-                    android:strokeAlpha="0.5"
-                    android:strokeWidth="1.45"
-                    android:strokeLineCap="round" />
-            </group>
-            <group
-                android:name="ridge_1"
-                android:translateX="-97.5"
-                android:translateY="-142.5" >
-                <path
-                    android:name="ridge_1_path"
-                    android:pathData="M 71.7812347412,97.0507202148 c -2.27149963379,-1.31344604492 -4.71360778809,-2.07006835938 -7.56221008301,-2.07006835938 c -2.84869384766,0.0 -5.23320007324,0.779556274414 -7.34411621094,2.07006835938"
-                    android:strokeColor="?attr/wallpaperTextColor"
-                    android:strokeAlpha="0.5"
-                    android:strokeWidth="1.45"
-                    android:strokeLineCap="round" />
-            </group>
-        </group>
-    </group>
-    <group
-        android:name="fingerprinterror"
-        android:translateX="12"
-        android:translateY="12.4"
-        android:scaleX="0.738"
-        android:scaleY="0.738" >
-        <group
-            android:name="fingerprinterror_pivot"
-            android:translateX="33"
-            android:translateY="34" >
-            <group
-                android:name="ridge_6" >
-                <path
-                    android:name="ridge_5_path_0"
-                    android:pathData="M -25.3591003418,-24.4138946533 c -0.569000244141,0.106399536133 -1.12660217285,0.140594482422 -1.45460510254,0.140594482422 c -1.29689025879,0.0 -2.53239440918,-0.343307495117 -3.62019348145,-1.12400817871 c -1.67700195312,-1.20349121094 -2.76950073242,-3.17008972168 -2.76950073242,-5.39189147949"
-                    android:strokeColor="?android:attr/colorError"
-                    android:strokeWidth="1.45"
-                    android:strokeLineCap="round"
-                    android:trimPathEnd="0" />
-            </group>
-            <group
-                android:name="ridge_7" >
-                <path
-                    android:name="ridge_7_path_0"
-                    android:pathData="M -36.1409912109,-21.7843475342 c -1.00540161133,-1.19300842285 -1.57499694824,-1.9181060791 -2.36520385742,-3.50170898438 c -0.827560424805,-1.65869140625 -1.31352233887,-3.49159240723 -1.31352233887,-5.48489379883 c 0.0,-3.66279602051 2.96932983398,-6.63220214844 6.63221740723,-6.63220214844 c 3.6628112793,0.0 6.63220214844,2.96940612793 6.63220214844,6.63220214844"
-                    android:strokeColor="?android:attr/colorError"
-                    android:strokeWidth="1.45"
-                    android:strokeLineCap="round"
-                    android:trimPathEnd="0" />
-            </group>
-            <group
-                android:name="ridge_8" >
-                <path
-                    android:name="ridge_6_path_0"
-                    android:pathData="M -42.1907958984,-25.6756896973 c -0.758117675781,-2.14370727539 -0.896545410156,-3.86891174316 -0.896545410156,-5.12921142578 c 0.0,-1.46069335938 0.249176025391,-2.84799194336 0.814682006836,-4.09748840332 c 1.56153869629,-3.45030212402 5.03434753418,-5.85076904297 9.0679473877,-5.85076904297 c 5.49430847168,0.0 9.94830322266,4.4539642334 9.94830322266,9.94825744629 c 0.0,1.83151245117 -1.48460388184,3.31610107422 -3.31610107422,3.31610107422 c -1.83149719238,0.0 -3.31610107422,-1.48469543457 -3.31610107422,-3.31610107422 c 0.0,-1.83139038086 -1.48458862305,-3.31610107422 -3.31610107422,-3.31610107422 c -1.83149719238,0.0 -3.31610107422,1.48471069336 -3.31610107422,3.31610107422 c 0.0,2.57020568848 0.989517211914,4.88710021973 2.60510253906,6.5865020752 c 1.22210693359,1.28550720215 2.43139648438,2.09950256348 4.47590637207,2.69030761719"
-                    android:strokeColor="?android:attr/colorError"
-                    android:strokeWidth="1.45"
-                    android:strokeLineCap="round"
-                    android:trimPathEnd="0" />
-            </group>
-            <group
-                android:name="ridge_9" >
-                <path
-                    android:name="ridge_2_path_0"
-                    android:pathData="M -44.0646514893,-38.1672973633 c 1.19026184082,-1.77430725098 2.67503356934,-3.24531555176 4.55902099609,-4.27278137207 c 1.88395690918,-1.0274810791 4.04466247559,-1.61137390137 6.34175109863,-1.61137390137 c 2.28761291504,0.0 4.43991088867,0.579071044922 6.31831359863,1.59861755371 c 1.8784942627,1.01954650879 3.36059570312,2.4796295166 4.55279541016,4.24153137207"
-                    android:strokeColor="?android:attr/colorError"
-                    android:strokeWidth="1.45"
-                    android:strokeLineCap="round"
-                    android:trimPathStart="1" />
-            </group>
-            <group
-                android:name="ridge_10"
-                android:translateX="-97.5"
-                android:translateY="-142.5" >
-                <path
-                    android:name="ridge_1_path_0"
-                    android:pathData="M 71.7812347412,97.0507202148 c -2.27149963379,-1.31344604492 -4.71360778809,-2.07006835938 -7.56221008301,-2.07006835938 c -2.84869384766,0.0 -5.23320007324,0.779556274414 -7.34411621094,2.07006835938"
-                    android:strokeColor="?android:attr/colorError"
-                    android:strokeWidth="1.45"
-                    android:strokeLineCap="round"
-                    android:trimPathEnd="0" />
-            </group>
-        </group>
-    </group>
-    <group
-        android:name="errorcircle"
-        android:translateX="12"
-        android:translateY="12"
-        android:rotation="190" >
-        <group
-            android:name="circle" >
-            <path
-                android:name="circlepath"
-                android:strokeColor="?android:attr/colorError"
-                android:strokeWidth="2"
-                android:strokeLineCap="round"
-                android:trimPathStart="1"
-                android:pathData="M 0.0,-9.0 c 4.9705627482,0.0 9.0,4.0294372518 9.0,9.0 c 0.0,4.9705627482 -4.0294372518,9.0 -9.0,9.0 c -4.9705627482,0.0 -9.0,-4.0294372518 -9.0,-9.0 c 0.0,-4.9705627482 4.0294372518,-9.0 9.0,-9.0 Z" />
-        </group>
-    </group>
-    <group
-        android:name="errorexclamation"
-        android:translateX="12"
-        android:translateY="12"
-        android:rotation="180" >
-        <group
-            android:name="exclamationbottom"
-            android:translateY="4" >
-            <path
-                android:name="bottompath"
-                android:fillColor="?android:attr/colorError"
-                android:pathData="M 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
-        </group>
-        <group
-            android:name="exclamationtop" >
-            <path
-                android:name="toppath"
-                android:fillColor="?android:attr/colorError"
-                android:pathData="M -1.0,0.0 l 2.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l -2.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
-        </group>
-    </group>
-</vector>
diff --git a/packages/SystemUI/res/drawable/lockscreen_fingerprint_fp_to_error_state_animation.xml b/packages/SystemUI/res/drawable/lockscreen_fingerprint_fp_to_error_state_animation.xml
deleted file mode 100644
index 38096a9..0000000
--- a/packages/SystemUI/res/drawable/lockscreen_fingerprint_fp_to_error_state_animation.xml
+++ /dev/null
@@ -1,77 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<animated-vector
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:drawable="@drawable/lockscreen_fingerprint_fp_to_error_state" >
-    <target
-        android:name="fingerprintwhite"
-        android:animation="@anim/ic_fingerprint_toerror_fingerprintwhite_animation" />
-    <target
-        android:name="ridge_5_path"
-        android:animation="@anim/ic_fingerprint_toerror_ridge_5_path_animation" />
-    <target
-        android:name="ridge_7_path"
-        android:animation="@anim/ic_fingerprint_toerror_ridge_7_path_animation" />
-    <target
-        android:name="ridge_6_path"
-        android:animation="@anim/ic_fingerprint_toerror_ridge_6_path_animation" />
-    <target
-        android:name="ridge_2_path"
-        android:animation="@anim/ic_fingerprint_toerror_ridge_2_path_animation" />
-    <target
-        android:name="ridge_1_path"
-        android:animation="@anim/ic_fingerprint_toerror_ridge_1_path_animation" />
-    <target
-        android:name="fingerprinterror"
-        android:animation="@anim/ic_fingerprint_toerror_fingerprinterror_animation" />
-    <target
-        android:name="ridge_5_path_0"
-        android:animation="@anim/ic_fingerprint_toerror_ridge_5_path_0_animation" />
-    <target
-        android:name="ridge_7_path_0"
-        android:animation="@anim/ic_fingerprint_toerror_ridge_7_path_0_animation" />
-    <target
-        android:name="ridge_6_path_0"
-        android:animation="@anim/ic_fingerprint_toerror_ridge_6_path_0_animation" />
-    <target
-        android:name="ridge_2_path_0"
-        android:animation="@anim/ic_fingerprint_toerror_ridge_2_path_0_animation" />
-    <target
-        android:name="ridge_1_path_0"
-        android:animation="@anim/ic_fingerprint_toerror_ridge_1_path_0_animation" />
-    <target
-        android:name="errorcircle"
-        android:animation="@anim/ic_fingerprint_toerror_errorcircle_animation" />
-    <target
-        android:name="circlepath"
-        android:animation="@anim/ic_fingerprint_toerror_circlepath_animation" />
-    <target
-        android:name="errorexclamation"
-        android:animation="@anim/ic_fingerprint_toerror_errorexclamation_animation" />
-    <target
-        android:name="exclamationbottom"
-        android:animation="@anim/ic_fingerprint_toerror_exclamationbottom_animation" />
-    <target
-        android:name="bottompath"
-        android:animation="@anim/ic_fingerprint_toerror_bottompath_animation" />
-    <target
-        android:name="exclamationtop"
-        android:animation="@anim/ic_fingerprint_toerror_exclamationtop_animation" />
-    <target
-        android:name="toppath"
-        android:animation="@anim/ic_fingerprint_toerror_toppath_animation" />
-</animated-vector>
diff --git a/packages/SystemUI/res/drawable/trusted_state_to_error.xml b/packages/SystemUI/res/drawable/trusted_state_to_error.xml
deleted file mode 100755
index 4a8e452..0000000
--- a/packages/SystemUI/res/drawable/trusted_state_to_error.xml
+++ /dev/null
@@ -1,104 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<vector
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:name="trusted_state_to_error"
-    android:width="24dp"
-    android:viewportWidth="24"
-    android:height="24dp"
-    android:viewportHeight="24" >
-    <group
-        android:name="lock"
-        android:translateX="12"
-        android:translateY="12" >
-        <group
-            android:name="middle_ellipse"
-            android:translateY="2.9375" >
-            <path
-                android:name="ellipse_path_1"
-                android:fillColor="?attr/wallpaperTextColor"
-                android:fillAlpha="0.5"
-                android:pathData="M 0.0,-1.988645 c 1.09829830627,0.0 1.988645,0.890346693734 1.988645,1.988645 c 0.0,1.09829830627 -0.890346693734,1.988645 -1.988645,1.988645 c -1.09829830627,0.0 -1.988645,-0.890346693734 -1.988645,-1.988645 c 0.0,-1.09829830627 0.890346693734,-1.988645 1.988645,-1.988645 Z" />
-        </group>
-        <group
-            android:name="lock_right_side" >
-            <path
-                android:name="path_1"
-                android:pathData="M 6.00561523438,-4.046875 c 0.0,0.0 -5.98999023438,0.0 -5.98999023438,0.0 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 5.98812866211,0.0 5.98812866211,0.0 c 0.0,0.0 0.00064086914062,10.0 0.00064086914062,10.0 c 0.0,0.0 -5.98840332031,0.0 -5.98840332031,0.0 c 0.0,0.0 -0.0052490234375,2.0 -0.0052490234375,2.0 c 0.0,0.0 5.99487304688,0.0 5.99487304688,0.0 c 1.10000610352,0.0 2.0,-0.900024414062 2.0,-2.0 c 0.0,0.0 0.0,-10.0 0.0,-10.0 c 0.0,-1.09997558594 -0.899993896484,-2.0 -2.0,-2.0 Z"
-                android:fillColor="?attr/wallpaperTextColor"
-                android:fillAlpha="0.5" />
-        </group>
-        <group
-            android:name="lock_left_side" >
-            <path
-                android:name="path_2"
-                android:pathData="M -5.9959564209,-2.04727172852 c 0.0,0.0 6.01173400879,0.00039672851562 6.01173400879,0.00039672851562 c 0.0,0.0 -0.00015258789062,-2.0 -0.00015258789062,-2.0 c 0.0,0.0 -6.01000976562,0.0 -6.01000976562,0.0 c -1.10000610352,0.0 -2.0,0.900024414062 -2.0,2.0 c 0.0,0.0 0.0,10.0 0.0,10.0 c 0.0,1.09997558594 0.899993896484,2.0 2.0,2.0 c 0.0,0.0 6.01000976562,0.0 6.01000976562,0.0 c 0.0,0.0 -0.000244140625,-2.0009765625 -0.000244140625,-2.0009765625 c 0.0,0.0 -6.01171875,0.0003662109375 -6.01171875,0.0003662109375 c 0.0,0.0 0.00038146972656,-9.99978637695 0.00038146972656,-9.99978637695 Z"
-                android:fillColor="?attr/wallpaperTextColor"
-                android:fillAlpha="0.5" />
-        </group>
-        <group
-            android:name="lock_top" >
-            <path
-                android:name="path_3"
-                android:pathData="M 5.00619506836,-6.046875 c 0.0,-2.76000976562 -2.23999023438,-5.0 -5.0,-5.0 c -2.76000976562,0.0 -5.0,2.23999023438 -5.0,5.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,-1.71002197266 1.38999938965,-3.09997558594 3.10000610352,-3.09997558594 c 1.71000671387,0.0 3.10000610352,1.38995361328 3.10000610352,3.09997558594 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,0.0 0.0,-2.0 0.0,-2.0 Z"
-                android:fillColor="?attr/wallpaperTextColor"
-                android:fillAlpha="0.5" />
-        </group>
-    </group>
-    <group
-        android:name="errorexclamationdot"
-        android:translateX="12"
-        android:translateY="8" >
-        <group
-            android:name="exclamationbottom"
-            android:translateY="4" >
-            <path
-                android:name="bottompath"
-                android:fillColor="?android:attr/colorError"
-                android:pathData="M 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
-        </group>
-    </group>
-    <group
-        android:name="errorexclamation"
-        android:translateX="12"
-        android:translateY="12" >
-        <group
-            android:name="exclamationtop"
-            android:translateY="2.5" >
-            <path
-                android:name="toppath"
-                android:fillColor="?android:attr/colorError"
-                android:pathData="M 0.0,-7.0 l 0.0,0.0 c 1.9329966243,0.0 3.5,1.5670033757 3.5,3.5 l 0.0,7.0 c 0.0,1.9329966243 -1.5670033757,3.5 -3.5,3.5 l 0.0,0.0 c -1.9329966243,0.0 -3.5,-1.5670033757 -3.5,-3.5 l 0.0,-7.0 c 0.0,-1.9329966243 1.5670033757,-3.5 3.5,-3.5 Z" />
-        </group>
-    </group>
-    <group
-        android:name="errorcircle"
-        android:translateX="12"
-        android:translateY="12"
-        android:rotation="184" >
-        <group
-            android:name="circle" >
-            <path
-                android:name="circlepath"
-                android:strokeColor="?android:attr/colorError"
-                android:strokeWidth="2"
-                android:strokeLineCap="round"
-                android:trimPathStart="1"
-                android:pathData="M 0.0,-9.0 c 4.9705627482,0.0 9.0,4.0294372518 9.0,9.0 c 0.0,4.9705627482 -4.0294372518,9.0 -9.0,9.0 c -4.9705627482,0.0 -9.0,-4.0294372518 -9.0,-9.0 c 0.0,-4.9705627482 4.0294372518,-9.0 9.0,-9.0 Z" />
-        </group>
-    </group>
-</vector>
diff --git a/packages/SystemUI/res/drawable/trusted_state_to_error_animation.xml b/packages/SystemUI/res/drawable/trusted_state_to_error_animation.xml
deleted file mode 100755
index 3457be5..0000000
--- a/packages/SystemUI/res/drawable/trusted_state_to_error_animation.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<animated-vector
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:drawable="@drawable/trusted_state_to_error" >
-    <target
-        android:name="ellipse_path_1"
-        android:animation="@anim/trusted_state_to_error_ellipse_path_1_animation" />
-    <target
-        android:name="path_1"
-        android:animation="@anim/trusted_state_to_error_path_1_animation" />
-    <target
-        android:name="path_2"
-        android:animation="@anim/trusted_state_to_error_path_2_animation" />
-    <target
-        android:name="lock_top"
-        android:animation="@anim/trusted_state_to_error_lock_top_animation" />
-    <target
-        android:name="path_3"
-        android:animation="@anim/trusted_state_to_error_path_3_animation" />
-    <target
-        android:name="errorexclamationdot"
-        android:animation="@anim/trusted_state_to_error_errorexclamationdot_animation" />
-    <target
-        android:name="bottompath"
-        android:animation="@anim/trusted_state_to_error_bottompath_animation" />
-    <target
-        android:name="exclamationtop"
-        android:animation="@anim/trusted_state_to_error_exclamationtop_animation" />
-    <target
-        android:name="toppath"
-        android:animation="@anim/trusted_state_to_error_toppath_animation" />
-    <target
-        android:name="errorcircle"
-        android:animation="@anim/trusted_state_to_error_errorcircle_animation" />
-    <target
-        android:name="circlepath"
-        android:animation="@anim/trusted_state_to_error_circlepath_animation" />
-</animated-vector>
diff --git a/packages/SystemUI/res/layout/bubble_expanded_view.xml b/packages/SystemUI/res/layout/bubble_expanded_view.xml
index 1aeb52c..f0d2b2e 100644
--- a/packages/SystemUI/res/layout/bubble_expanded_view.xml
+++ b/packages/SystemUI/res/layout/bubble_expanded_view.xml
@@ -18,6 +18,7 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_height="wrap_content"
     android:layout_width="match_parent"
+    android:orientation="vertical"
     android:id="@+id/bubble_expanded_view">
 
     <View
@@ -26,17 +27,48 @@
         android:layout_height="@dimen/bubble_pointer_height"
     />
 
-    <TextView
-        android:id="@+id/bubble_content_header"
-        android:background="@drawable/bubble_expanded_header_bg"
-        android:textAppearance="@*android:style/TextAppearance.Material.Title"
-        android:textSize="18sp"
-        android:layout_width="match_parent"
+    <LinearLayout
+        android:id="@+id/header_layout"
         android:layout_height="@dimen/bubble_expanded_header_height"
-        android:gravity="start|center_vertical"
-        android:singleLine="true"
-        android:paddingLeft="@dimen/bubble_expanded_header_horizontal_padding"
-        android:paddingRight="@dimen/bubble_expanded_header_horizontal_padding"
-    />
+        android:layout_width="match_parent"
+        android:orientation="horizontal"
+        android:background="@drawable/bubble_expanded_header_bg">
+
+        <TextView
+            android:id="@+id/header_text"
+            android:textAppearance="@*android:style/TextAppearance.Material.Title"
+            android:textSize="18sp"
+            android:layout_weight="1"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:gravity="start|center_vertical"
+            android:singleLine="true"
+            android:paddingLeft="@dimen/bubble_expanded_header_horizontal_padding"
+            android:paddingRight="@dimen/bubble_expanded_header_horizontal_padding"
+        />
+
+        <ImageButton
+            android:id="@+id/deep_link_button"
+            android:layout_width="@dimen/bubble_header_icon_size"
+            android:layout_height="@dimen/bubble_header_icon_size"
+            android:gravity="end|center_vertical"
+            android:src="@drawable/ic_open_in_new"
+            android:scaleType="center"
+            android:tint="?android:attr/colorForeground"
+            android:background="?android:attr/selectableItemBackground"
+        />
+
+        <ImageButton
+            android:id="@id/settings_button"
+            android:layout_width="@dimen/bubble_header_icon_size"
+            android:layout_height="@dimen/bubble_header_icon_size"
+            android:src="@drawable/ic_settings"
+            android:gravity="end|center_vertical"
+            android:scaleType="center"
+            android:tint="?android:attr/colorForeground"
+            android:background="?android:attr/selectableItemBackground"
+        />
+
+    </LinearLayout>
 
 </com.android.systemui.bubbles.BubbleExpandedViewContainer>
diff --git a/packages/SystemUI/res/layout/keyguard_bottom_area.xml b/packages/SystemUI/res/layout/keyguard_bottom_area.xml
index 96a1bab..53b3a7e 100644
--- a/packages/SystemUI/res/layout/keyguard_bottom_area.xml
+++ b/packages/SystemUI/res/layout/keyguard_bottom_area.xml
@@ -37,22 +37,16 @@
             android:id="@+id/keyguard_indication_enterprise_disclosure"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:gravity="center_horizontal"
-            android:textStyle="italic"
-            android:textColor="?attr/wallpaperTextColorSecondary"
-            android:textSize="16sp"
-            android:textAppearance="?android:attr/textAppearanceSmall"
+            android:gravity="center"
+            android:textAppearance="@style/TextAppearance.Keyguard.BottomArea"
             android:visibility="gone" />
 
         <com.android.systemui.statusbar.phone.KeyguardIndicationTextView
             android:id="@+id/keyguard_indication_text"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:gravity="center_horizontal"
-            android:textStyle="italic"
-            android:textColor="?attr/wallpaperTextColorSecondary"
-            android:textSize="16sp"
-            android:textAppearance="?android:attr/textAppearanceSmall"
+            android:gravity="center"
+            android:textAppearance="@style/TextAppearance.Keyguard.BottomArea"
             android:accessibilityLiveRegion="polite" />
 
     </LinearLayout>
@@ -78,19 +72,20 @@
         android:layout_height="@dimen/keyguard_affordance_height"
         android:layout_width="@dimen/keyguard_affordance_width"
         android:layout_gravity="bottom|start"
-        android:src="@drawable/ic_phone_24dp"
+        android:src="@*android:drawable/ic_phone"
         android:scaleType="center"
         android:contentDescription="@string/accessibility_phone_button"
         android:tint="?attr/wallpaperTextColor" />
 
     <com.android.systemui.statusbar.phone.LockIcon
         android:id="@+id/lock_icon"
-        android:layout_width="@dimen/keyguard_affordance_width"
-        android:layout_height="@dimen/keyguard_affordance_height"
+        android:layout_width="@dimen/keyguard_lock_width"
+        android:layout_height="@dimen/keyguard_lock_height"
         android:layout_gravity="bottom|center_horizontal"
-        android:src="@drawable/ic_lock"
+        android:layout_marginBottom="@dimen/keyguard_lock_padding"
+        android:src="@*android:drawable/ic_lock_24dp"
         android:contentDescription="@string/accessibility_unlock_button"
-        android:scaleType="center" />
+        android:scaleType="fitCenter" />
 
     <FrameLayout
         android:id="@+id/overlay_container"
diff --git a/packages/SystemUI/res/layout/qs_footer_impl.xml b/packages/SystemUI/res/layout/qs_footer_impl.xml
index abf9e05..67e31ac 100644
--- a/packages/SystemUI/res/layout/qs_footer_impl.xml
+++ b/packages/SystemUI/res/layout/qs_footer_impl.xml
@@ -109,7 +109,7 @@
                 android:contentDescription="@string/accessibility_quick_settings_edit"
                 android:focusable="true"
                 android:padding="15dp"
-                android:src="@drawable/ic_mode_edit"
+                android:src="@*android:drawable/ic_mode_edit"
                 android:tint="?android:attr/colorForeground"/>
 
             <com.android.systemui.statusbar.AlphaOptimizedFrameLayout
diff --git a/packages/SystemUI/res/layout/status_bar_alarm_group.xml b/packages/SystemUI/res/layout/status_bar_alarm_group.xml
deleted file mode 100644
index 3528f9e..0000000
--- a/packages/SystemUI/res/layout/status_bar_alarm_group.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2016 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:systemui="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/date_time_alarm_group"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:padding="4dp"
-    android:gravity="center_vertical"
-    android:orientation="horizontal"
-    android:background="?android:attr/selectableItemBackground">
-
-    <com.android.systemui.statusbar.policy.DateView
-        android:id="@+id/date"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:singleLine="true"
-        android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Date"
-        android:textSize="@dimen/qs_time_collapsed_size"
-        android:gravity="center_vertical"
-        systemui:datePattern="@string/abbrev_wday_month_day_no_year_alarm" />
-
-    <com.android.systemui.statusbar.AlphaOptimizedImageView
-        android:id="@+id/alarm_status_collapsed"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:src="@drawable/ic_access_alarms_small"
-        android:tint="?android:attr/textColorPrimary"
-        android:paddingStart="6dp"
-        android:paddingEnd="6dp"
-        android:gravity="center"
-        android:visibility="gone" />
-
-    <com.android.systemui.statusbar.AlphaOptimizedButton
-        android:id="@+id/alarm_status"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Clock"
-        android:gravity="center_vertical"
-        android:background="@null"
-        android:clickable="false"
-        android:visibility="gone" />
-
-</LinearLayout>
diff --git a/packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl b/packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl
new file mode 100644
index 0000000..11d73a9
--- /dev/null
+++ b/packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl
@@ -0,0 +1,33 @@
+precision mediump float;
+
+uniform sampler2D uTexture;
+uniform float uCenterReveal;
+uniform float uReveal;
+uniform float uAod2Opacity;
+uniform int uAodMode;
+varying vec2 vTextureCoordinates;
+
+vec3 luminosity(vec3 color) {
+    float lum = 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b;
+    return vec3(lum);
+}
+
+vec4 transform(vec3 diffuse) {
+    // TODO: Add well comments here, tracking on b/123615467.
+    vec3 lum = luminosity(diffuse);
+    diffuse = mix(diffuse, lum, smoothstep(0., uCenterReveal, uReveal));
+    float val = mix(uReveal, uCenterReveal, step(uCenterReveal, uReveal));
+    diffuse = smoothstep(val, 1.0, diffuse);
+    diffuse *= uAod2Opacity * (1. - smoothstep(uCenterReveal, 1., uReveal));
+    return vec4(diffuse.r, diffuse.g, diffuse.b, 1.);
+}
+
+void main() {
+    vec4 fragColor = texture2D(uTexture, vTextureCoordinates);
+    // TODO: Remove the branch logic here, tracking on b/123615467.
+    if (uAodMode != 0) {
+        gl_FragColor = transform(fragColor.rgb);
+    } else {
+        gl_FragColor = fragColor;
+    }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/res/raw/image_wallpaper_vertex_shader.glsl b/packages/SystemUI/res/raw/image_wallpaper_vertex_shader.glsl
new file mode 100644
index 0000000..4393e2b
--- /dev/null
+++ b/packages/SystemUI/res/raw/image_wallpaper_vertex_shader.glsl
@@ -0,0 +1,8 @@
+attribute vec4 aPosition;
+attribute vec2 aTextureCoordinates;
+varying vec2 vTextureCoordinates;
+
+void main() {
+    vTextureCoordinates = aTextureCoordinates;
+    gl_Position = aPosition;
+}
\ No newline at end of file
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index de2a950..31e450b 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Laat USB-ontfouting toe?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Die rekenaar se RSA-sleutel-vingerafdruk is:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Laat altyd toe van hierdie rekenaar af"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-ontfouting word nie toegelaat nie"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Die gebruiker wat tans by hierdie toestel aangemeld is, kan nie USB-ontfouting aanskakel nie. Skakel na die primêre gebruiker toe oor om hierdie kenmerk te gebruik."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Zoem om skerm te vul"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Strek om skerm te vul"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Skermkiekie"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Kanselleer"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Hulpboodskapgebied"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bevestig"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Probeer weer"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Raak die vingerafdruksensor"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Vingerafdrukikoon"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Soek tans vir jou …"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Oudio"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Kopstuk"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Invoer"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Gehoortoestelle"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Skakel tans aan …"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Helderheid"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Outo-draai"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Jy maak hierdie kennisgewings gewoonlik toe. \nMoet ons aanhou om hulle te wys?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Hou aan om hierdie kennisgewings te wys?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Stop kennisgewings"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Blokkeer"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Hou aan wys"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimeer"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Wys sonder klank"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Bly stil"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Waarsku my"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Hou aan waarsku"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Hou aan om kennisgewings van hierdie program af te wys?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Hierdie kennisgewings kan nie afgeskakel word nie"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Instellings"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Het dit"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Stort SysUI-hoop"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> programme</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> program</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> gebruik tans jou <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Programme gebruik tans jou <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Kanselleer"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> programme gebruik jou <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> program gebruik jou <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Bekyk details"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Program wat jou <xliff:g id="TYPES_LIST">%s</xliff:g> gebruik"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Programme wat jou <xliff:g id="TYPES_LIST">%s</xliff:g> gebruik"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 4154643..731acce 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"የUSB ማረሚያ ይፈቀድ?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"የኮምፒውተሩ RSA ቁልፍ ጣት አሻራ ይሄ ነው፦\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"ሁልጊዜ ከዚህ ኮምፒውተር ፍቀድ"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"የዩኤስቢ እርማት አይፈቀድም"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"አሁን ወደዚህ መሣሪያ የገባው ተጠቃሚ የዩኤስቢ እርማትን ማብራት አይችልም። ይህን ባህሪ ለመጠቀም ወደ ዋና ተጠቃሚ ይቀይሩ።"</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"ማያ እንዲሞላ አጉላ"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"ማያ ለመሙለት ሳብ"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"ቅጽበታዊ ገጽ እይታ"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"ይቅር"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"የእገዛ መልዕክት አካባቢ"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"አረጋግጥ"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"እንደገና ይሞክሩ"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"የጣት አሻራ ዳሳሹን ይንኩ"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"የጣት አሻራ አዶ"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"እርስዎን በመፈለግ ላይ…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ኦዲዮ"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ማዳመጫ"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ግቤት"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"አጋዥ መስሚያዎች"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"በማብራት ላይ..."</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"ብሩህነት"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"በራስ ሰር አሽከርክር"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"አብዛኛውን ጊዜ እነዚህን ማሳወቂያዎች ያሰናብቷቸዋል። \nመታየታቸው ይቀጥል??"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"እነዚህን ማሳወቂያዎች ማሳየት ይቀጥሉ?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"ማሳወቂያዎችን አስቁም"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"አግድ"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"ማሳየትን ቀጥል"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"አሳንስ"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"በፀጥታ አሳይ"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"ጸጥ እንዳለ ቆይ"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"አሳውቀኝ"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"ማንቃቱን ቀጥል"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"ከዚህ መተግበሪያ ማሳወቂያዎችን ማሳየት ይቀጥል?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"እነዚህ ማሳወቂያዎች ሊጠፉ አይችሉም"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"በ<xliff:g id="APP_NAME">%1$s</xliff:g> በኩል"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"ቅንብሮች"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"ገባኝ"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI Heap አራግፍ"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> መተግበሪያዎች</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> መተግበሪያዎች</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> የእርስዎን <xliff:g id="TYPES_LIST">%2$s</xliff:g> እየተጠቀመ ነው።"</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"መተግበሪያዎች የእርስዎን <xliff:g id="TYPES_LIST">%s</xliff:g> እየተጠቀሙ ነው።"</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"ይቅር"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> መተግበሪያዎች የእርስዎን <xliff:g id="TYPE_5">%2$s</xliff:g> እየተጠቀሙ ነው።</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> መተግበሪያዎች የእርስዎን <xliff:g id="TYPE_5">%2$s</xliff:g> እየተጠቀሙ ነው።</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"ዝርዝሮችን አሳይ"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"የእርስዎን <xliff:g id="TYPES_LIST">%s</xliff:g> የሚጠቀሙ መተግበሪያዎች"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"የእርስዎን <xliff:g id="TYPES_LIST">%s</xliff:g> የሚጠቀሙ መተግበሪያዎች"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 579964d..3306388 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"‏هل تريد السماح بتصحيح أخطاء USB؟"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"‏الملف المرجعي الرئيسي لـ RSA في هذا الكمبيوتر هو:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"السماح دائمًا من هذا الكمبيوتر"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"‏لا يُسمح بتصحيح أخطاء USB"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"‏لا يمكن للمستخدم الذي يسجّل دخوله حاليًا إلى هذا الجهاز تشغيل تصحيح أخطاء USB. لاستخدام هذه الميزة، يمكنك التبديل إلى المستخدم الأساسي."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"تكبير/تصغير لملء الشاشة"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"توسيع بملء الشاشة"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"لقطة شاشة"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"إلغاء"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"منطقة رسالة المساعدة"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"تأكيد"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"إعادة المحاولة"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"المس جهاز استشعار بصمات الإصبع"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"رمز بصمة الإصبع"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"جارٍ البحث عن وجهك…"</string>
@@ -300,8 +305,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"صوت"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"سماعة الرأس"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"الإدخال"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"سماعات الأذن الطبية"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"جارٍ التفعيل…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"السطوع"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"دوران تلقائي"</string>
@@ -623,17 +627,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"أنت تتجاهل عادةً هذه الإشعارات. \nهل تريد الاستمرار في عرضها؟"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"هل تريد الاستمرار في تلقي هذه الإشعارات؟"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"إيقاف الإشعارات"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"حظر"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"الاستمرار في تلقّي الإشعارات"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"تصغير"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"عرض بدون تنبيه صوتي"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"متابعة عرض الإشعارات بدون صوت"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"إرسال تنبيه إليّ"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"متابعة إرسال التنبيهات"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"هل تريد الاستمرار في تلقي إشعارات من هذا التطبيق؟"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"يتعذَّر إيقاف هذه الإشعارات."</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"عبر <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -755,7 +755,7 @@
   </string-array>
     <string name="menu_ime" msgid="4998010205321292416">"مفتاح تبديل لوحة المفاتيح"</string>
     <string name="save" msgid="2311877285724540644">"حفظ"</string>
-    <string name="reset" msgid="2448168080964209908">"إعادة تعيين"</string>
+    <string name="reset" msgid="2448168080964209908">"إعادة الضبط"</string>
     <string name="adjust_button_width" msgid="6138616087197632947">"ضبط عرض الزر"</string>
     <string name="clipboard" msgid="1313879395099896312">"الحافظة"</string>
     <string name="accessibility_key" msgid="5701989859305675896">"زر التنقل المخصص"</string>
@@ -891,11 +891,26 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"الإعدادات"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"حسنًا"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"‏تفريغ ذاكرة SysUI"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="zero"><xliff:g id="NUM_APPS_2">%d</xliff:g> تطبيق</item>
+      <item quantity="two">تطبيقان (<xliff:g id="NUM_APPS_2">%d</xliff:g>)</item>
+      <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> تطبيقات</item>
+      <item quantity="many"><xliff:g id="NUM_APPS_2">%d</xliff:g> تطبيقًا</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> تطبيق</item>
+      <item quantity="one">تطبيق واحد (<xliff:g id="NUM_APPS_0">%d</xliff:g>)</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"التطبيق <xliff:g id="APP">%1$s</xliff:g> يستخدم <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"تستخدم التطبيقات <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"إلغاء"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="zero">هناك <xliff:g id="NUM_APPS_4">%1$d</xliff:g> تطبيق يستخدِم <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="two">هناك تطبيقان (<xliff:g id="NUM_APPS_4">%1$d</xliff:g>) يستخدِمان <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="few">هناك <xliff:g id="NUM_APPS_2">%1$d</xliff:g> تطبيقات تستخدِم <xliff:g id="TYPE_3">%2$s</xliff:g>.</item>
+      <item quantity="many">هناك <xliff:g id="NUM_APPS_4">%1$d</xliff:g> تطبيقًا يستخدِم <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="other">هناك <xliff:g id="NUM_APPS_4">%1$d</xliff:g> تطبيق يستخدِم <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="one">هناك تطبيق واحد (<xliff:g id="NUM_APPS_0">%1$d</xliff:g>) يستخدِم <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"عرض التفاصيل"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"التطبيق الذي يستخدِم <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"التطبيقات التي تستخدِم <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index 8113504..4a09194 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"ইউএছবি ডিবাগিংৰ অনুমতি দিবনে?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"এয়া হৈছে কম্পিউটাৰটোৰ RSA কী ফিংগাৰপ্ৰিণ্ট:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"এই কম্পিউটাৰটোৰ পৰা সদায় অনুমতি দিয়ক"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"ইউএছবি ডিবাগিঙৰ অনুমতি নাই"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"এই ডিভাইচটোত বর্তমান ছাইন ইন হৈ থকা ব্যৱহাৰকাৰীজনে ইউএছবি ডিবাগিং অন কৰিব নোৱাৰে। এই সুবিধাটো ব্যৱহাৰ কৰিবলৈ হ\'লে মুখ্য ব্যৱহাৰকাৰী হিচাপে ছাইন ইন কৰক।"</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"স্ক্ৰীণ পূর্ণ কৰিবলৈ জুম কৰক"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"স্ক্ৰীণ পূর্ণ কৰিবলৈ প্ৰসাৰিত কৰক"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"স্ক্ৰীণশ্বট"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"বাতিল কৰক"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"সহায় বাৰ্তাৰ ক্ষেত্ৰ"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"নিশ্চিত কৰক"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"আকৌ চেষ্টা কৰক"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ফিংগাৰপ্ৰিণ্ট ছেন্সৰটো স্পৰ্শ কৰক"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ফিংগাৰপ্ৰিণ্ট আইকন"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"আপোনাৰ মুখমণ্ডল বিচাৰি আছে…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"অডিঅ’"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"হেডছেট"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ইনপুট"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"শ্ৰৱণ যন্ত্ৰ"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"অন কৰি থকা হৈছে…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"উজ্জ্বলতা"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"স্বয়ং-ঘূৰ্ণন"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"আপুনি সাধাৰণতে এই জাননীসমূহ অগ্ৰাহ্য কৰে। \nসেইবোৰ দেখুওৱাই থাকিব লাগিবনে?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"এই জাননীসমূহ দেখুওৱাই থাকিব লাগিবনে?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"জাননী বন্ধ কৰক"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"অৱৰোধ কৰক"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"দেখুওৱাই থাকক"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"সৰু কৰক"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"নিৰৱে দেখুৱাওক"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"নীৰৱ হৈ থাকক"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"মোক সতৰ্ক কৰি দিব"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"সতৰ্ক কৰি থাকক"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"এই এপটোৰ জাননী দেখুওৱাই থাকিব লাগিবনে?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"এই জাননীসমূহ বন্ধ কৰিব নোৱাৰি"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ জৰিয়তে"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"ছেটিংবোৰ"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"বুজি পালোঁ"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI হীপ ডাম্প কৰক"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g>টা এপ্</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g>টা এপ্</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g>এ আপোনাৰ <xliff:g id="TYPES_LIST">%2$s</xliff:g> ব্যৱহাৰ কৰি আছে।"</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"এপ্লিকেশ্বনসমূহে আপোনাৰ <xliff:g id="TYPES_LIST">%s</xliff:g> ব্যৱহাৰ কৰি আছে।"</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"বাতিল কৰক"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g>টা এপ্লিকেশ্বনে আপোনাৰ <xliff:g id="TYPE_5">%2$s</xliff:g> ব্যৱহাৰ কৰি আছে।</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g>টা এপ্লিকেশ্বনে আপোনাৰ <xliff:g id="TYPE_5">%2$s</xliff:g> ব্যৱহাৰ কৰি আছে।</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"সবিশেষ চাওক"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"এপটোৱে আপোনাৰ <xliff:g id="TYPES_LIST">%s</xliff:g> ব্যৱহাৰ কৰি আছে"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"এপসমূহে আপোনাৰ <xliff:g id="TYPES_LIST">%s</xliff:g> ব্যৱহাৰ কৰি আছে"</string>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 907e19d..b8bace9 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"USB sazlamaya icazə verilsin?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Kompüterin RSA barmaq izi: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Bu kompüterdən həmişə icazə verilsin"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB debaq prosesinə icazə verilmir"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Hazırda bu cihaza daxil olmuş istifadəçi USB sazlama prosesini aktiv edə bilməz. Bu funksiyadan istifadə etmək üçün əsas istifadəçi hesaba daxil olmalıdır."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Ekranı doldurmaq üçün yaxınlaşdır"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Ekranı doldurmaq üçün uzat"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Skrinşot"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Ləğv et"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Yardım mesajı bölməsi"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Təsdiq"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Yenidən cəhd edin"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Barmaq izi sensoruna klikləyin"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Barmaq izi ikonası"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Siz axtarılırsınız…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Qulaqlıq"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Giriş"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Eşitmə Aparatı"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Aktiv edilir..."</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Parlaqlıq"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Avtodönüş"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Adətən bu bildirişləri rədd edirsiniz. \nBildirişlər göstərilsin?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Bu bildirişlər göstərilməyə davam edilsin?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Bildirişləri dayandırın"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Blok edin"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Göstərməyə davam edin"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Kiçildin"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Səssiz göstərin"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Səssiz göstərilsin"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Məni xəbərdar edin"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Xəbərdarlıq göndərməyə davam edin"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Bu tətbiqin bildirişləri göstərilməyə davam edilsin?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Bu bildirişlər deaktiv edilə bilməz"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> vasitəsilə"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Ayarlar"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Anladım"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> tətbiq</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> tətbiq</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="TYPES_LIST">%2$s</xliff:g> tətbiqlərindən istifadə edir."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Tətbiqlər <xliff:g id="TYPES_LIST">%s</xliff:g> istifadə edir."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Ləğv edin"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> tətbiq <xliff:g id="TYPE_5">%2$s</xliff:g> tətbiqindən istifadə edir.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> tətbiq <xliff:g id="TYPE_1">%2$s</xliff:g> tətbiqindən istifadə edir.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Detallara baxın"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"<xliff:g id="TYPES_LIST">%s</xliff:g> tətbiqindən istifadə edən tətbiq"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"<xliff:g id="TYPES_LIST">%s</xliff:g> tətbiqindən istifadə edən tətbiqlər"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 8668c6b..eed9ce6 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Želite li da dozvolite otklanjanje USB grešaka?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Digitalni otisak RSA ključa ovog računara je:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Uvek dozvoli sa ovog računara"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Otklanjanje grešaka na USB-u nije dozvoljeno"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Korisnik koji je trenutno prijavljen na ovaj uređaj ne može da uključi otklanjanje grešaka na USB-u. Da biste koristili ovu funkciju, prebacite na primarnog korisnika."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Zumiraj na celom ekranu"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Razvuci na ceo ekran"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Snimak ekrana"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Otkaži"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Oblast poruke za pomoć"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potvrdi"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Probaj ponovo"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dodirnite senzor za otisak prsta"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona otiska prsta"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Tražimo vas…"</string>
@@ -297,8 +302,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Slušalice"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Unos"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Slušni aparati"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Uključuje se..."</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Osvetljenost"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatska rotacija"</string>
@@ -614,17 +618,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Obično odbacujete ova obaveštenja. \nŽelite li da se i dalje prikazuju?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Želite li da se ova obaveštenja i dalje prikazuju?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Prestani da prikazuješ obaveštenja"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Blokiraj"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Nastavi da prikazuješ"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Umanji"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Prikaži bez zvuka"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Ne uključuj zvuk"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Obavesti me"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Nastavi sa obaveštenjima"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Želite li da se obaveštenja iz ove aplikacije i dalje prikazuju?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Ne možete da isključite ova obaveštenja"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"preko aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -876,11 +876,20 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Podešavanja"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Važi"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Izdvoji SysUI mem."</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacija</item>
+      <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> aplikacije</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacija</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> koristi <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikacije koriste <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Otkaži"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacija koristi dozvolu <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="few"><xliff:g id="NUM_APPS_2">%1$d</xliff:g> aplikacije koriste dozvolu <xliff:g id="TYPE_3">%2$s</xliff:g>.</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacija koristi dozvolu <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Prikaži detalje"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplikacija koja koristi dozvole <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplikacije koje koriste dozvole <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 6a27dbb..8bc87cd 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Дазволіць адладку USB?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Адбiтак ключа RSA на гэтым камп\'ютары:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Заўсёды дазваляць з гэтага камп\'ютара"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Адладка USB не дапускаецца"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Карыстальнік, які зараз увайшоў у гэту прыладу, не можа ўключыць адладку USB. Каб выкарыстоўваць гэту функцыю, пераключыцеся на асноўнага карыстальніка."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Павял. на ўвесь экран"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Расцягн. на ўвесь экран"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Здымак экрана"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Скасаваць"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Поле даведачнага паведамлення"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Пацвердзіць"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Паўтарыць спробу"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Дакраніцеся да сканера адбіткаў пальцаў"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Значок адбіткаў пальцаў"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Ідзе пошук вашага твару…"</string>
@@ -300,8 +305,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Гук"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Гарнітура"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Увод"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Слыхавыя апараты"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Уключэнне…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Яркасць"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Аўтапаварот"</string>
@@ -619,17 +623,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Звычайна вы адхіляеце гэтыя апавяшчэнні. \nПаказваць іх?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Працягваць паказваць гэтыя апавяшчэнні?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Спыніць апавяшчэнні"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Заблакіраваць"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Працягваць паказваць"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Згарнуць"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Паказваць бязгучна"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Не ўключаць гук"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Апавясціць мяне"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Апавяшчаць далей"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Працягваць паказваць апавяшчэнні гэтай праграмы?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Немагчыма адключыць гэтыя апавяшчэнні"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"праз праграму \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
@@ -883,11 +883,22 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Налады"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Зразумела"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Дамп кучы SysUI"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> праграма</item>
+      <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> праграмы</item>
+      <item quantity="many"><xliff:g id="NUM_APPS_2">%d</xliff:g> праграм</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> праграмы</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Праграма \"<xliff:g id="APP">%1$s</xliff:g>\" выкарыстоўвае: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Праграмы выкарыстоўваюць: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Скасаваць"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one">Функцыю \"<xliff:g id="TYPE_5">%2$s</xliff:g>\" выкарыстоўвае <xliff:g id="NUM_APPS_4">%1$d</xliff:g> праграма.</item>
+      <item quantity="few">Функцыю \"<xliff:g id="TYPE_3">%2$s</xliff:g>\" выкарыстоўваюць <xliff:g id="NUM_APPS_2">%1$d</xliff:g> праграмы.</item>
+      <item quantity="many">Функцыю \"<xliff:g id="TYPE_5">%2$s</xliff:g>\" выкарыстоўваюць <xliff:g id="NUM_APPS_4">%1$d</xliff:g> праграм.</item>
+      <item quantity="other">Функцыю \"<xliff:g id="TYPE_5">%2$s</xliff:g>\" выкарыстоўваюць <xliff:g id="NUM_APPS_4">%1$d</xliff:g> праграмы.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Падрабязнасці"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Праграма, якая выкарыстоўвае: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Праграмы, якія выкарыстоўваюць: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index e9effcf..63111276 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Да се разреши ли отстраняването на грешки през USB?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Отпечатъкът на RSA ключа на компютъра е:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Винаги да се разрешава от този компютър"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Отстраняването на грешки през USB не е разрешено"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Потребителят, който понастоящем е влязъл в това устройство, не може да включи функцията за отстраняване на грешки през USB. За да я използвате, превключете към основния потребител."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Мащаб – запълва екрана"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Разпъване – запълва екрана"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Екранна снимка"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Отказ"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Област за помощно съобщение"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Потвърждаване"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Нов опит"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Докоснете сензора за отпечатъци"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Икона за отпечатък"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Търсим ви…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Аудио"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Слушалки"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Вход"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Слухови апарати"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Включва се..."</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Яркост"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Автоматична ориентация"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Обикновено отхвърляте тези известия. \nИскате ли да продължат да се показват?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Тези известия да продължат ли да се показват?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Спиране на известията"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Блокиране"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Да продължат да се показват"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Намаляване"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Показване без звук"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Показване на известията без звук"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Сигнализиране"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Продължаване на сигнализирането"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Да продължат ли да се показват известията от това приложение?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Тези известия не могат да бъдат изключени"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"чрез <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Настройки"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Разбрах"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> прилож.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> прилож.</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> използва <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Някои приложения използват <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Отказ"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> приложения използват <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> приложение използва <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Преглед на подробностите"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Приложение, което използва <xliff:g id="TYPES_LIST">%s</xliff:g> ви"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Приложения, които използват <xliff:g id="TYPES_LIST">%s</xliff:g> ви"</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 0724e37..58678ba 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"USB ডিবাগিং মঞ্জুর করবেন?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"কম্পিউটারের RSA কী আঙ্গুলের ছাপ হল:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"এই কম্পিউটার থেকে সর্বদা অনুমতি দিন"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB ডিবাগিং অনুমোদিত নয়"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ব্যবহারকারী এখন এই ডিভাইসে সাইন-ইন করেছেন তাই USB ডিবাগিং চালু করা যাবে না। এই বৈশিষ্ট্যটি ব্যবহার করতে, প্রাথমিক ব্যবহারকারীতে পাল্টে নিন।"</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"স্ক্রীণ পূরণ করতে জুম করুন"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"ফুল স্ক্রিন করুন"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"স্ক্রিনশট নিন"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"বাতিল করুন"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"সহায়তার মেসেজ দেখানোর জায়গা"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"কনফার্ম করুন"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"আবার চেষ্টা করুন"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"আঙ্গুলের ছাপের সেন্সর স্পর্শ করুন"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"আঙ্গুলের ছাপের আইকন"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"আপনার জন্য খোঁজা হচ্ছে…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"অডিও"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"হেডসেট"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ইনপুট"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"হিয়ারিং এড"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"চালু করা হচ্ছে…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"উজ্জ্বলতা"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"স্বতঃ ঘূর্ণায়মান"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"এই বিজ্ঞপ্তিগুলিকে আপনি সাধারণত বাতিল করেন। \nসেগুলি দেখতে চান?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"এই বিজ্ঞপ্তিগুলি পরেও দেখে যেতে চান?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"বিজ্ঞপ্তি বন্ধ করুন"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"ব্লক করুন"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"দেখতে থাকুন"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"ছোট করে দিন"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"নিঃশব্দে দেখুন"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"বিজ্ঞপ্তি মিউট করুন"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"আমাকে জানানো হোক"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"বিজ্ঞপ্তি পান"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"এই অ্যাপের বিজ্ঞপ্তি পরেও দেখে যেতে চান?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"এই বিজ্ঞপ্তিগুলি বন্ধ করা যাবে না"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এর মাধ্যমে"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"সেটিংস"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"বুঝেছি"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g>টি অ্যাপ</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g>টি অ্যাপ</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> আপনার <xliff:g id="TYPES_LIST">%2$s</xliff:g> ব্যবহার করছে।"</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"অ্যাপ্লিকেশনগুলি আপনার <xliff:g id="TYPES_LIST">%s</xliff:g> ব্যবহার করছে।"</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"বাতিল করুন"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g>টি অ্যাপ আপনার <xliff:g id="TYPE_5">%2$s</xliff:g> ব্যবহার করছে।</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g>টি অ্যাপ আপনার <xliff:g id="TYPE_5">%2$s</xliff:g> ব্যবহার করছে।</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"বিবরণ দেখুন"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"অ্যাপ আপনার <xliff:g id="TYPES_LIST">%s</xliff:g> ব্যবহার করছে"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"অ্যাপ আপনার <xliff:g id="TYPES_LIST">%s</xliff:g> ব্যবহার করছে"</string>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 77429a0d..b2b2ee7 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Omogućiti otklanjanje grešaka putem uređaja spojenog na USB?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"RSA otisak prsta za otključavanje računara je: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Uvijek dozvoli sa ovog računara"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Otklanjanje grešaka putem uređaja spojenog na USB nije dozvoljeno"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Korisnik koji je trenutno prijavljen na ovaj uređaj ne može uključiti opciju za otklanjanje grešaka koristeći USB. Da koristite tu funkciju, prebacite se na primarnog korisnika."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Uvećaj prikaz na ekran"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Razvuci prikaz na ekran"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Snimak ekrana"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Otkaži"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Prostor za poruku za pomoć"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potvrdite"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Pokušaj ponovo"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dodirnite senzor za otisak prsta"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona za otisak prsta"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Tražimo vas…"</string>
@@ -297,8 +302,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Zvuk"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Slušalice"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Ulaz"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Slušni aparat"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Uključivanje…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Osvjetljenje"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatsko rotiranje"</string>
@@ -616,17 +620,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Obično odbacujete ova obavještenja. \nNastaviti ih prikazivati?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Nastaviti prikazivanje ovih obavještenja?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Zaustavi obavještenja"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Blokiraj"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Nastavi prikazivanje"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimiziraj"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Prikaži bez zvuka"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Ostani u nečujnom načinu rada"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Upozori me"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Nastavi upozoravati"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Nastaviti prikazivanje obavještenja iz ove aplikacije?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Ova obavještenja nije moguće isključiti"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"preko aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -878,11 +878,20 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Postavke"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Razumijem"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Izdvoji SysUI mem."</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacija</item>
+      <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> aplikacije</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacija</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> koristi <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikacije koriste <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Otkaži"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacija koristi <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="few"><xliff:g id="NUM_APPS_2">%1$d</xliff:g> aplikacije koriste <xliff:g id="TYPE_3">%2$s</xliff:g>.</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacija koristi <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Prikaži detalje"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplikacija koristi odobrenja <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplikacije koriste odobrenja <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 4e8e833..45ad570 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Vols permetre la depuració per USB?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"L\'empremta digital de la clau RSA de l\'equip és:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Dona sempre permís des d\'aquest equip"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"No es permet la depuració per USB"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"L\'usuari que té iniciada la sessió al dispositiu en aquest moment no pot activar la depuració per USB. Per utilitzar aquesta funció, cal canviar a l\'usuari principal."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Zoom per omplir pantalla"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Estira per omplir pant."</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Captura de pantalla"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Cancel·la"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Àrea de missatge d\'ajuda"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirma"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Torna-ho a provar"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toca el sensor d\'empremtes digitals"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icona d\'empremta digital"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"S\'està cercant la teva cara…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Àudio"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Auriculars"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrada"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Audiòfons"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"S\'està activant…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brillantor"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Gira automàticament"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Normalment ignores aquestes notificacions. \nVols que es continuïn mostrant?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Vols continuar rebent aquestes notificacions?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Deixa d\'enviar notificacions"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Bloqueja"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Continua rebent"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimitza"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Mostra de manera silenciosa"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Continua silenciant"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Avisa\'m"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Continua avisant-me"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Vols continuar rebent notificacions d\'aquesta aplicació?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Aquestes notificacions no es poden desactivar"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"mitjançant <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Configuració"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"D\'acord"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Aboca espai de SysUI"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplicacions</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplicació</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> està fent servir el següent: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Algunes aplicacions estan fent servir el següent: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancel·la"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplicacions estan fent servir: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplicació està fent servir: <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Mostra els detalls"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplicació que fa servir: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplicacions que fan servir: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 30bf1de..3b3dc00 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Povolit ladění přes USB?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Digitální otisk RSA počítače je:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Vždy povolit z tohoto počítače"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Ladění přes USB není povoleno"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Uživatel aktuálně přihlášený k tomuto zařízení nemůže zapnout ladění přes USB. Chcete-li tuto funkci použít, přepněte na primárního uživatele."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Přiblížit na celou obrazovku"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Na celou obrazovku"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Snímek obrazovky"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Zrušit"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Oblast pro zprávu nápovědy"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potvrdit"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Zkusit znovu"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dotkněte se snímače otisků prstů"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona otisku prstu"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Hledáme vás…"</string>
@@ -298,8 +303,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Zvuk"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Sluchátka"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Vstup"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Naslouchátka"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Zapínání…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Jas"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatické otáčení"</string>
@@ -617,17 +621,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Tato oznámení obvykle odmítáte. \nChcete je nadále zobrazovat?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Mají se tato oznámení nadále zobrazovat?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Přestat zobrazovat oznámení"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Blokovat"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Nadále zobrazovat"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimalizovat"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Zobrazovat tiše"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Nadále bez zvuku"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Upozornit"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Dál upozorňovat"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Mají se oznámení z této aplikace nadále zobrazovat?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Tato oznámení nelze deaktivovat"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"prostřednictvím aplikace <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -881,11 +881,22 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Nastavení"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Rozumím"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Výpis haldy SysUI"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> aplikace</item>
+      <item quantity="many"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikace</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikací</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplikace</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Aplikace <xliff:g id="APP">%1$s</xliff:g> využívá tato oprávnění: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikace využívají tato oprávnění: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Zrušit"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="few"><xliff:g id="NUM_APPS_2">%1$d</xliff:g> aplikace využívají tato oprávnění: <xliff:g id="TYPE_3">%2$s</xliff:g>.</item>
+      <item quantity="many"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikace využívá tato oprávnění: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikací využívá tato oprávnění: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplikace využívá tato oprávnění: <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Zobrazit podrobnosti"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplikace používající vaše údaje: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplikace používající vaše údaje: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index ad4afcf..118204e 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Vil du tillade USB-fejlretning?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Fingeraftrykket for computerens RSA-nøgle er:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Tillad altid fra denne computer"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-fejlretning er ikke tilladt"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Den bruger, der i øjeblikket er logget ind på denne enhed, kan ikke aktivere USB-fejlretning. Skift til den primære bruger for at bruge denne funktion."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Zoom til fuld skærm"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Stræk til fuld skærm"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Annuller"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Område med hjælpemeddelelse"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bekræft"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Prøv igen"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Sæt fingeren på fingeraftrykslæseren"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon for fingeraftryk"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Forsøger at finde dig…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Lyd"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Input"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Høreapparater"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Aktiverer…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Lysstyrke"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Roter automatisk"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Du afviser som regel disse notifikationer. \nVil du blive ved med at se dem?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Vil du fortsætte med at se disse notifikationer?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Stop notifikationer"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Bloker"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Fortsæt med at vise notifikationer"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimer"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Vis lydløst"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Fortsæt med lydløse notifikationer"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Underret mig"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Fortsæt med at underrette"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Vil du fortsætte med at se notifikationer fra denne app?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Disse notifikationer kan ikke deaktiveres"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Indstillinger"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Gem SysUI-heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> app</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> anvender enhedens <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Apps anvender enhedens <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Luk"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> app anvender din/dit <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> apps anvender din/dit <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Se info"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App, der anvender din/dit <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps, der anvender din/dit <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 0be730a..d91e678 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"USB-Debugging zulassen?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Der Fingerabdruck des RSA-Schlüssels für diesen Computer lautet: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Von diesem Computer immer zulassen"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-Debugging nicht zulässig"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Der momentan auf diesem Gerät angemeldete Nutzer kann das USB-Debugging nicht aktivieren. Um diese Funktion verwenden zu können, wechsle zum primären Nutzer."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Zoom auf Bildschirmgröße"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Auf Bildschirmgröße anpassen"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Abbrechen"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Bereich für die Hilfemeldung"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bestätigen"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Noch einmal versuchen"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Berühre den Fingerabdrucksensor"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerabdruck-Symbol"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Wir suchen nach dir…"</string>
@@ -300,8 +305,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Eingabe"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Hörhilfen"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Wird aktiviert…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Helligkeit"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatisch drehen"</string>
@@ -615,17 +619,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Normalerweise schließt du diese Benachrichtigungen. \nSollen sie trotzdem weiter angezeigt werden?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Diese Benachrichtigungen weiterhin anzeigen?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Benachrichtigungen nicht mehr anzeigen"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Blockieren"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Weiterhin anzeigen"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimieren"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Ohne Ton anzeigen"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Weiter lautlos bleiben"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Benachrichtigung an mich"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Weiterhin Benachrichtigungen senden"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Benachrichtigungen dieser App weiterhin anzeigen?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Diese Benachrichtigungen können nicht deaktiviert werden"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"über <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -875,11 +875,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Einstellungen"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> Apps</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> App</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> verwendet gerade Folgendes: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Apps verwenden gerade Folgendes: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Abbrechen"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> Apps verwenden gerade: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> App verwendet gerade: <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Details ansehen"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App, die <xliff:g id="TYPES_LIST">%s</xliff:g> verwendet"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps, die <xliff:g id="TYPES_LIST">%s</xliff:g> verwenden"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 7468b3a..52bcfce 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Να επιτρέπεται ο εντοπισμός σφαλμάτων USB;"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Το μοναδικό χαρακτηριστικό του κλειδιού RSA είναι:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Να επιτρέπεται πάντα από αυτόν τον υπολογιστή"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Δεν επιτρέπεται ο εντοπισμός σφαλμάτων USB"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Ο χρήστης που είναι συνδεδεμένος αυτήν τη στιγμή σε αυτήν τη συσκευή δεν μπορεί να ενεργοποιήσει τον εντοπισμό σφαλμάτων USB. Για να χρησιμοποιήσετε αυτήν τη λειτουργία, κάντε εναλλαγή στον κύριο χρήστη."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Ζουμ σε πλήρη οθόνη"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Προβoλή σε πλήρη οθ."</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Στιγμιότυπο οθόνης"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Ακύρωση"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Περιοχή μηνυμάτων βοήθειας"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Επιβεβαίωση"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Δοκιμάστε ξανά"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Αγγίξτε τον αισθητήρα δακτυλικών αποτυπωμάτων"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Εικονίδιο δακτυλικών αποτυπωμάτων"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Αναζήτηση για εσάς…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Ήχος"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Ακουστικά"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Είσοδος"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Βοηθήματα ακρόασης"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Ενεργοποίηση…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Φωτεινότητα"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Αυτόματη περιστροφή"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Συνήθως απορρίπτετε αυτές τις ειδοποιήσεις. \nΝα εξακολουθήσουν να εμφανίζονται;"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Να συνεχίσουν να εμφανίζονται αυτές οι ειδοποιήσεις;"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Διακοπή ειδοποιήσεων"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Αποκλεισμός"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Συνέχιση εμφάνισης"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Ελαχιστοποίηση"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Εμφάνιση σιωπηλά"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Διατήρηση σε σίγαση"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Να ειδοποιούμαι"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Να συνεχιστούν οι ειδοποιήσεις"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Να συνεχίσουν να εμφανίζονται ειδοποιήσεις από αυτήν την εφαρμογή;"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Αδύνατη η απενεργοποίηση αυτών των ειδοποιήσεων"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"μέσω <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Ρυθμίσεις"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Το κατάλαβα"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Στιγμ. μνήμης SysUI"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> εφαρμογές</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> εφαρμογή</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Η εφαρμογή <xliff:g id="APP">%1$s</xliff:g> χρησιμοποιεί τις λειτουργίες <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Οι εφαρμογές χρησιμοποιούν τις λειτουργίες <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Ακύρωση"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> εφαρμογές χρησιμοποιούν το <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> εφαρμογή χρησιμοποιεί το <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Προβολή λεπτομ."</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Εφαρμογή που χρησιμοποιεί τις λειτουργίες <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Εφαρμογές που χρησιμοποιούν τις λειτουργίες <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index 703bc40..70208fb 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Allow USB debugging?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"The computer\'s RSA key fingerprint is:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Always allow from this computer"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB debugging not allowed"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Zoom to fill screen"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Stretch to fill screen"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Cancel"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Help message area"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirm"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Try again"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Looking for you…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Input"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Hearing Aids"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Turning on…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brightness"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Auto-rotate"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"You usually dismiss these notifications. \nKeep showing them?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Keep showing these notifications?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Stop notifications"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Block"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Keep showing"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimise"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Show silently"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Stay silent"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Alert me"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Keep alerting"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Keep showing notifications from this app?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"These notifications can\'t be turned off"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Settings"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> is using your <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Applications are using your <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancel"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> applications are using your <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> application is using your <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"View details"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App using your <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps using your <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index 31fd04a..3084403 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Allow USB debugging?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"The computer\'s RSA key fingerprint is:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Always allow from this computer"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB debugging not allowed"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Zoom to fill screen"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Stretch to fill screen"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Cancel"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Help message area"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirm"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Try again"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Looking for you…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Input"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Hearing Aids"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Turning on…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brightness"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Auto-rotate"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"You usually dismiss these notifications. \nKeep showing them?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Keep showing these notifications?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Stop notifications"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Block"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Keep showing"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimise"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Show silently"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Stay silent"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Alert me"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Keep alerting"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Keep showing notifications from this app?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"These notifications can\'t be turned off"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Settings"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> is using your <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Applications are using your <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancel"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> applications are using your <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> application is using your <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"View details"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App using your <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps using your <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 703bc40..70208fb 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Allow USB debugging?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"The computer\'s RSA key fingerprint is:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Always allow from this computer"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB debugging not allowed"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Zoom to fill screen"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Stretch to fill screen"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Cancel"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Help message area"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirm"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Try again"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Looking for you…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Input"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Hearing Aids"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Turning on…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brightness"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Auto-rotate"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"You usually dismiss these notifications. \nKeep showing them?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Keep showing these notifications?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Stop notifications"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Block"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Keep showing"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimise"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Show silently"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Stay silent"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Alert me"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Keep alerting"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Keep showing notifications from this app?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"These notifications can\'t be turned off"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Settings"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> is using your <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Applications are using your <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancel"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> applications are using your <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> application is using your <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"View details"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App using your <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps using your <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 703bc40..70208fb 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Allow USB debugging?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"The computer\'s RSA key fingerprint is:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Always allow from this computer"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB debugging not allowed"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Zoom to fill screen"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Stretch to fill screen"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Cancel"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Help message area"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirm"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Try again"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Looking for you…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Input"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Hearing Aids"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Turning on…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brightness"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Auto-rotate"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"You usually dismiss these notifications. \nKeep showing them?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Keep showing these notifications?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Stop notifications"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Block"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Keep showing"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimise"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Show silently"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Stay silent"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Alert me"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Keep alerting"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Keep showing notifications from this app?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"These notifications can\'t be turned off"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Settings"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> is using your <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Applications are using your <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancel"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> applications are using your <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> application is using your <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"View details"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App using your <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps using your <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index d53d61b..0154c82 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -57,8 +57,11 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‏‎‏‎‎‏‎‎‏‎‏‎‏‎‎‎‏‏‎‏‏‏‎‎‏‏‏‎‏‏‏‎‏‏‏‏‎‎‎‏‎‏‎‎‏‎‏‏‎‎‏‏‏‏‎‏‎Allow USB debugging?‎‏‎‎‏‎"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‏‎‎‏‏‏‏‏‎‎‎‏‎‎‏‎‎‎‏‎‎‏‎‏‏‏‏‏‎‎‏‏‏‏‎‏‏‎‎‎‏‎‏‏‎‎‎‏‎‏‏‎‎‎‎‎The computer\'s RSA key fingerprint is:‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="FINGERPRINT">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‎‎‏‏‎‏‎‏‏‎‏‎‏‎‏‎‎‎‎‎‎‏‏‎‏‏‏‏‎‎‎‎‏‏‏‎‏‎‏‏‎‏‏‎‏‏‎‏‏‎‎‏‏‏‏‎‎Always allow from this computer‎‏‎‎‏‎"</string>
+    <string name="usb_debugging_allow" msgid="2272145052073254852">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎‎‎‏‎‎‎‎‏‎‎‎‏‏‏‏‏‏‎‎‎‏‎‏‏‏‏‎‎‏‎‏‏‏‏‏‏‎‎‏‏‎‏‏‏‏‏‏‏‎‎‎‏‎‎‎Allow‎‏‎‎‏‎"</string>
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‏‏‎‏‎‏‎‎‎‎‏‏‎‏‎‏‏‏‏‎‎‏‎‏‎‏‏‏‎‏‎‏‏‎‏‏‎‎‏‏‎‏‏‏‎‏‎‎‎‏‎‏‎USB debugging not allowed‎‏‎‎‏‎"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‏‎‎‏‎‏‎‏‏‏‏‏‏‏‎‏‏‏‎‎‏‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‎‎‎‎‎‎‏‎‎‎‏‎‏‏‎‎‏‎The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user.‎‏‎‎‏‎"</string>
+    <string name="usb_contaminant_title" msgid="206854874263058490">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‏‏‎‏‏‏‏‎‏‏‏‎‎‏‎‏‎‏‏‎‏‎‎‏‏‎‎‎‎‏‎‎‏‎‎‎‎‎‎‏‏‏‏‏‏‎‎‎‎‎‏‏‏‎‏‎‎USB port disabled‎‏‎‎‏‎"</string>
+    <string name="usb_contaminant_message" msgid="2205845572186473860">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‎‎‏‏‏‎‎‏‎‏‏‏‏‎‎‏‏‎‏‏‏‎‎‎‏‎‏‏‏‏‏‏‎‎‎‏‎‏‏‎‎‎‎‎‏‎‏‏‎‎‎‎‏‎‎‎To protect your device from liquid or debris, the USB port is disabled and won’t detect any accessories.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎You’ll be notified when it’s safe to use the USB port again.‎‏‎‎‏‎"</string>
     <string name="compat_mode_on" msgid="6623839244840638213">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‏‏‎‏‏‎‎‏‎‎‏‏‎‏‎‏‎‏‏‎‎‏‎‏‏‎‏‎‏‏‎‎‎‎‎‎‏‎‎‏‎‎‏‎‏‏‏‎‎‎‎‎‏‎‏‎Zoom to fill screen‎‏‎‎‏‎"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‎‏‎‏‎‎‏‏‎‎‏‎‎‏‏‎‎‎‎‏‏‎‎‏‎‏‎‎‎‏‎‎‎‏‎‏‏‏‏‎‏‎‏‏‎‎‎‎‏‏‎‏‎‎Stretch to fill screen‎‏‎‎‏‎"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‏‎‎‏‏‎‎‎‎‎‎‏‎‏‏‎‏‎‏‎‎‎‎‎‎‎‎‏‎‎‏‏‏‎‎‎‎‏‎‎‏‏‎‎‎‏‏‎‏‎‏‏‎Screenshot‎‏‎‎‏‎"</string>
@@ -875,7 +878,7 @@
       <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‎‏‏‏‎‎‏‎‎‎‏‏‏‎‏‏‏‏‏‎‎‏‏‎‎‎‎‏‏‎‎‎‎‎‎‎‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‎‎‎‎‎‏‎‎‏‏‎<xliff:g id="NUM_APPS_4">%1$d</xliff:g>‎‏‎‎‏‏‏‎ applications are using your ‎‏‎‎‏‏‎<xliff:g id="TYPE_5">%2$s</xliff:g>‎‏‎‎‏‏‏‎.‎‏‎‎‏‎</item>
       <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‎‏‏‏‎‎‏‎‎‎‏‏‏‎‏‏‏‏‏‎‎‏‏‎‎‎‎‏‏‎‎‎‎‎‎‎‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‎‎‎‎‎‏‎‎‏‏‎<xliff:g id="NUM_APPS_0">%1$d</xliff:g>‎‏‎‎‏‏‏‎ application is using your ‎‏‎‎‏‏‎<xliff:g id="TYPE_1">%2$s</xliff:g>‎‏‎‎‏‏‏‎.‎‏‎‎‏‎</item>
     </plurals>
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‎‎‏‎‎‏‏‏‎‎‎‎‏‎‏‎‏‏‏‎‎‏‏‏‎‎‏‏‎‎‏‎‏‎‎‏‏‏‏‏‏‏‎‏‎‏‏‎‎‏‎‏‏‎‎Cancel‎‏‎‎‏‎"</string>
+    <string name="ongoing_privacy_dialog_ok" msgid="3273300106348958308">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‎‏‏‎‏‏‎‏‎‎‎‏‏‎‎‏‎‎‎‏‏‎‏‎‏‎‏‎‎‎‏‎‎‎‏‎‏‏‎‏‏‎‎‏‎‎‏‎‎‏‏‎‎‏‎‎‎Got it‎‏‎‎‏‎"</string>
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‏‎‎‏‎‏‏‎‏‎‏‎‏‎‎‏‎‎‎‎‎‏‎‏‏‎‏‏‏‎‏‎‎‎‎‏‎‏‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‏‏‎View details‎‏‎‎‏‎"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‎‎‏‎‏‎‎‎‎‏‎‏‎‏‎‎‎‎‎‏‎‎‏‎‏‏‏‏‎‎‏‎‎‏‎‎‎‎‎‎‎‎‎‏‎‎‎‏‏‏‏‎‎‎‎App using your ‎‏‎‎‏‏‎<xliff:g id="TYPES_LIST">%s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‏‎‏‎‏‎‎‏‎‏‎‎‏‎‎‎‎‎‏‏‏‎‎‏‏‏‎‎‏‎‏‎‎‎‎‏‏‏‎‎‎‏‎‏‏‎‎‎‎‎‏‎‏‎Apps using your ‎‏‎‎‏‏‎<xliff:g id="TYPES_LIST">%s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 761acf6..4ee4006 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"¿Permitir depuración por USB?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"La huella digital de tu clave RSA es:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Permitir siempre desde esta computadora"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"No tienes permitida la depuración por USB"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"El usuario al que accediste en este dispositivo no puede activar la depuración por USB. Para usar esta función, debes cambiar al usuario principal."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Zoom para ocupar la pantalla"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Estirar p/ ocupar la pantalla"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Captura de pantalla"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Cancelar"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área de mensajes de ayuda"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Volver a intentarlo"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toca el sensor de huellas digitales"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícono de huella digital"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Autenticando tu rostro…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Auriculares"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrada"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Audífonos"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Activando…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brillo"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotación automática"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Sueles descartar estas notificaciones. \n¿Quieres seguir recibiéndolas?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"¿Quieres seguir viendo estas notificaciones?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Detener notificaciones"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Bloquear"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Seguir viendo"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimizar"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Mostrar sin emitir sonido"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Silenciar notificaciones"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Avisarme"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Seguir recibiendo alertas"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"¿Quieres seguir viendo las notificaciones de esta app?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"No se pueden desactivar estas notificaciones"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"por medio de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Configuración"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Entendido"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Volcar pila de SysUI"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> está usando tu <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Hay aplicaciones que están usando tu <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancelar"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplicaciones están usando tu <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplicación está usando tu <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Ver detalles"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Una app está usando tu <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps que están usando tu <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 0b3ba5d..446b6ac 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"¿Permitir depuración por USB?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"La huella digital de tu clave RSA es:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Permitir siempre desde este ordenador"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Depuración USB no permitida"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"El usuario con el que se ha iniciado sesión en este dispositivo no puede activar la depuración USB. Para utilizar esta función, inicia sesión con la cuenta de usuario principal."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Zoom para ajustar"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Expandir para ajustar"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Captura de pantalla"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Cancelar"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área de mensaje de ayuda"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Reintentar"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toca el sensor de huellas digitales"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icono de huella digital"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Buscando tu cara…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Auriculares"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrada"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Audífonos"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Activando…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brillo"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Girar automáticamente"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Normalmente ignoras estas notificaciones. \n¿Quieres seguir viéndolas?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"¿Quieres seguir viendo estas notificaciones?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Detener las notificaciones"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Bloquear"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Seguir mostrando"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimizar"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Mostrar en silencio"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Silenciar notificaciones"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Quiero recibir alertas"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Quiero seguir recibiendo alertas"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"¿Quieres seguir viendo las notificaciones de esta aplicación?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Estas notificaciones no se pueden desactivar"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"mediante <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Ajustes"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Entendido"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Volcar pila de SysUI"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> está usando tu <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Hay aplicaciones que usan tu <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancelar"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplicaciones están usando tu <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplicación está usando tu <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Ver detalles"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplicación que usa tu <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplicaciones que usan tu <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index e318291..080f206 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Kas luban USB silumise?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Arvuti RSA-võtme sõrmejälg:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Luba alati sellest arvutist"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-silumine pole lubatud"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Sellesse seadmesse praegu sisse logitud kasutaja ei saa USB-silumist sisse lülitada. Selle funktsiooni kasutamiseks vahetage peamisele kasutajale."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Suumi ekraani täitmiseks"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Venita ekraani täitmiseks"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Ekraanipilt"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Tühista"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Abisõnumi ala"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Kinnita"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Proovi uuesti"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Puudutage sõrmejäljeandurit"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Sõrmejälje ikoon"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Otsitakse teid …"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Heli"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Peakomplekt"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Sisend"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Kuuldeaparaadid"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Sisselülitamine …"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Heledus"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automaatne pööramine"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Tavaliselt loobute nendest märguannetest. \nKas soovite neid jätkuvalt näidata?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Kas soovite nende märguannete kuvamist jätkata?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Peata märguanded"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Blokeeri"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Jätka kuvamist"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimeeri"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Kuva vaikselt"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Kuva helita"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Teavita mind"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Teavita ka edaspidi"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Kas jätkata selle rakenduse märguannete kuvamist?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Neid märguandeid ei saa välja lülitada"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> kaudu"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Seaded"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Selge"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> rakendust</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> rakendus</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> kasutab järgmisi: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Rakendused kasutavad järgmisi: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Tühista"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> rakendust kasutavad üksust <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> rakendus kasutab üksust <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Kuva üksikasjad"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Rakendus, mis kasutab üksusi <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Rakendused, mis kasutavad üksusi <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 5b9f0cf..8d62bcf 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"USB arazketa onartu?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Ordenagailuaren RSA gakoaren erreferentzia-gako digitala hau da:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Onartu beti ordenagailu honetatik"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Ez da onartzen USB arazketa"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Gailu honetan saioa hasita duen erabiltzaileak ezin du aktibatu USB arazketa. Eginbide hori erabiltzeko, aldatu erabiltzaile nagusira."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Handiagotu pantaila betetzeko"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Luzatu pantaila betetzeko"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Pantaila-argazkia"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Utzi"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Laguntza-mezuaren eremua"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Berretsi"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Saiatu berriro"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Sakatu hatz-marken sentsorea"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Hatz-markaren ikonoa"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Zure bila…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audioa"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Entzungailua"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Sarrera"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Audiofonoak"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Aktibatzen…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Distira"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Biratze automatikoa"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Baztertu egin ohi dituzu jakinarazpen hauek. \nHaiek erakusten jarraitzea nahi duzu?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Jakinarazpenak erakusten jarraitzea nahi duzu?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Blokeatu jakinarazpenak"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Blokeatu"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Jarraitu erakusten"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimizatu"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Erakutsi soinurik egin gabepen"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Jarraitu isilik"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Bidali jakinarazpenak"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Jarraitu jakinarazpenak bidaltzen"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Aplikazio honen jakinarazpenak erakusten jarraitzea nahi duzu?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Jakinarazpen hauek ezin dira desaktibatu"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioaren bidez"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Ezarpenak"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Ados"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikazio</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplikazio</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="TYPES_LIST">%2$s</xliff:g> erabiltzen ari da."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikazio batzuk <xliff:g id="TYPES_LIST">%s</xliff:g> erabiltzen ari dira."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Utzi"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikazio ari dira <xliff:g id="TYPE_5">%2$s</xliff:g> erabiltzen.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplikazio ari da <xliff:g id="TYPE_1">%2$s</xliff:g> erabiltzen.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Ikusi datuak"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"<xliff:g id="TYPES_LIST">%s</xliff:g> erabiltzen ari den aplikazioa"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"<xliff:g id="TYPES_LIST">%s</xliff:g> erabiltzen ari diren aplikazioak"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index e89f906..035c6f3 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"‏اشکال‌زدایی USB مجاز است؟"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"‏اثر انگشت کلید RSA رایانه: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"همیشه از این رایانه انجام شود"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"‏اشکال‌زدایی USB مجاز نیست"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"‏کاربری که درحال حاضر در این دستگاه وارد سیستم شده است نمی‌تواند اشکال‌زدایی USB را روشن کند. برای استفاده از این قابلیت، به کاربر اصلی تغییر وضعیت دهید."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"بزرگ‌نمایی برای پر کردن صفحه"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"گسترده کردن برای پر کردن صفحه"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"عکس صفحه‌نمایش"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"لغو"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"بخش پیام راهنما"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"تأیید"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"امتحان مجدد"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"حسگر اثر انگشت را لمس کنید"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"نماد اثر انگشت"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"درحال جستجوی شما…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"صوت"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"هدست"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ورودی"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"سمعک"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"روشن کردن…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"روشنایی"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"چرخش خودکار"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"معمولاً این اعلان‌ها را رد می‌کنید. \nهمچنان نشان داده شود؟"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"نمایش این اعلان‌ها ادامه یابد؟"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"توقف اعلان‌ها"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"مسدود کردن"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"همچنان نشان داده شود"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"کوچک کردن"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"نمایش به‌صورت بی‌صدا"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"بی‌صدا بماند"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"به من اطلاع داده شود"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"همچنان اطلاع داده شود"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"نمایش اعلان از این برنامه ادامه یابد؟"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"نمی‌توان این اعلان‌ها را خاموش کرد"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"ازطریق <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"تنظیمات"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"متوجه شدم"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> برنامه</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> برنامه</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> از <xliff:g id="TYPES_LIST">%2$s</xliff:g> شما استفاده می‌کند."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"برنامه‌ها از <xliff:g id="TYPES_LIST">%s</xliff:g> شما استفاده می‌‌کنند."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"لغو"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> برنامه درحال استفاده از <xliff:g id="TYPE_5">%2$s</xliff:g> شما است.</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> برنامه درحال استفاده از <xliff:g id="TYPE_5">%2$s</xliff:g> شما است.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"مشاهده جزئیات"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"برنامه‌ای که از <xliff:g id="TYPES_LIST">%s</xliff:g> شما استفاده می‌کند"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"برنامه‌هایی که از <xliff:g id="TYPES_LIST">%s</xliff:g> شما استفاده می‌کنند"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 931def7..c2ccd99 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Sallitaanko USB-vianetsintä?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Tietokoneen RSA-avaintunnistetiedosto on:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Salli aina tällä tietokoneella"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-vianetsintää ei sallita"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Laitteelle tällä hetkellä kirjautunut käyttäjä ei voi ottaa USB-vianetsintää käyttöön. Vaihda käyttäjäksi ensisijainen käyttäjä, jotta voit käyttää tätä ominaisuutta."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Zoomaa koko näyttöön"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Venytä koko näyttöön"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Kuvakaappaus"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Peruuta"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Ohjeviestialue"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Vahvista"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Yritä uudelleen"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Kosketa sormenjälkitunnistinta"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Sormenjälkikuvake"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Etsitään kasvoja…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Ääni"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Syöttölaite"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Kuulolaitteet"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Otetaan käyttöön…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Kirkkaus"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automaattinen kääntö"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Hylkäät yleensä nämä ilmoitukset. \nHaluatko, että niitä näytetään myös jatkossa?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Jatketaanko näiden ilmoitusten näyttämistä?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Lopeta ilmoitukset"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Estä"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Jatka näyttämistä"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Pienennä"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Näytä ilman ääntä"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Jatka äänettömyyttä"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Hälytä"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Jatka ilmoituksista hälyttämistä"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Jatketaanko ilmoitusten näyttämistä tästä sovelluksesta?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Näitä ilmoituksia ei voi poistaa käytöstä"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Asetukset"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Selvä"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Luo SysUI-keon vedos"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> sovellusta</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> sovellus</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> käyttää ominaisuuksia (<xliff:g id="TYPES_LIST">%2$s</xliff:g>)."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"<xliff:g id="TYPES_LIST">%s</xliff:g> ovat sovellusten käytössä."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Peruuta"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="TYPE_5">%2$s</xliff:g> on <xliff:g id="NUM_APPS_4">%1$d</xliff:g> sovelluksen käytössä.</item>
+      <item quantity="one"><xliff:g id="TYPE_1">%2$s</xliff:g> on <xliff:g id="NUM_APPS_0">%1$d</xliff:g> sovelluksen käytössä.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Näytä tiedot"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Sovellus, jolla on <xliff:g id="TYPES_LIST">%s</xliff:g> ‑käyttöoikeus"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Sovellukset, joilla on <xliff:g id="TYPES_LIST">%s</xliff:g> ‑käyttöoikeus"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index d1412aa..98e6489 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Autoriser le débogage USB?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Empreinte numérique de la clé RSA de l\'ordinateur : \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Toujours autoriser sur cet ordinateur"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Débogage USB non autorisé"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"L\'utilisateur actuellement connecté sur cet appareil ne peut pas activer le débogage USB. Pour utiliser cette fonctionnalité, l\'utilisateur principal doit se connecter."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Zoomer pour remplir l\'écran"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Étirer pour remplir l\'écran"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Capture d\'écran"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Annuler"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Zone de message d\'aide"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmer"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Réessayer"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touchez le capteur d\'empreintes digitales"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icône d\'empreinte digitale"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Recherche de votre visage…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Écouteurs"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrée"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Prothèses auditives"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Activation en cours…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Luminosité"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotation automatique"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Vous ignorez habituellement ces notifications. \nSouhaitez-vous continuer à les afficher?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Continuer à afficher ces notifications?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Arrêter les notifications"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Bloquer"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Continuer à afficher"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Réduire"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Afficher en silence"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Continuer d\'util. mode silencieux"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"M\'alerter"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Continuer d\'envoyer des alertes"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Continuer à afficher les notifications de cette application?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Ces notifications ne peuvent pas être désactivées"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"par <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Paramètres"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Capturer mémoire SysUI"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> application</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> applications</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> utilise votre <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Des applications utilisent votre <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Annuler"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> application utilise votre <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> applications utilisent votre <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Afficher détails"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Application qui utilise votre <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Applications qui utilisent votre <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 8ba575b..1233bbe 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Autoriser le débogage USB ?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Empreinte numérique de la clé RSA de l\'ordinateur : \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Toujours autoriser sur cet ordinateur"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Débogage USB non autorisé"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"L\'utilisateur actuellement connecté sur cet appareil ne peut pas activer le débogage USB. Pour utiliser cette fonctionnalité, l\'utilisateur principal doit se connecter."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Zoomer pour remplir l\'écran"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Étirer pour remplir l\'écran"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Capture d\'écran"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Annuler"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Zone de message d\'aide"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmer"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Réessayer"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Appuyez sur le lecteur d\'empreinte digitale"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icône d\'empreinte digitale"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Recherche de votre visage…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Casque"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrée"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Appareils auditifs"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Activation…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Luminosité"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotation automatique"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Vous ignorez généralement ces notifications. \nSouhaitez-vous continuer de les recevoir ?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Continuer d\'afficher ces notifications ?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Arrêter les notifications"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Bloquer"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Continuer d\'afficher les notifications"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Réduire"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Affichage silencieux"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Notifications silencieuses"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"M\'avertir"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Continuer de m\'avertir"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Continuer d\'afficher les notifications de cette application ?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Ces notifications ne peuvent pas être désactivées"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Paramètres"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Copier mémoire SysUI"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> application</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> applications</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> utilise votre <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Des applications utilisent votre <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Annuler"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> application utilise votre <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> applications utilisent votre <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Voir les détails"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Application utilisant votre/vos <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Applications utilisant votre/vos <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 2784567..38554d1 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Permitir a depuración de erros de USB?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"A impresión dixital da clave de RSA do ordenador é:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Permitir sempre desde este ordenador"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Non se permite a depuración por USB"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"O usuario coa sesión iniciada actualmente neste dispositivo non pode activar a depuración por USB. Para utilizar esta función, cambia ao usuario principal."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Ampliar ata ocupar todo"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Estirar ata ocupar todo"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Captura de pantalla"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Cancelar"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área de mensaxes de axuda"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Tentar de novo"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toca o sensor de impresión dixital"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icona de impresión dixital"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Buscándote…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Auriculares"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrada"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Audiófonos"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Activando…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brillo"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Xirar automaticamente"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Ignoras estas notificacións a miúdo. \nQueres seguir recibíndoas?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Queres seguir mostrando estas notificacións?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Deter notificacións"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Bloquear"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Continuar mostrando notificacións"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimizar"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Mostrar en silencio"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Notificacións silenciosas"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Recibir notificacións"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Continuar recibindo notificacións"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Queres seguir mostrando as notificacións desta aplicación?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Non se poden desactivar estas notificacións"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"mediante <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Configuración"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"De acordo"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Baleirar mont. SysUI"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplicacións</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplicación</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> está utilizando <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Hai aplicacións que están utilizando <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancelar"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplicacións utilizan o teu dispositivo (<xliff:g id="TYPE_5">%2$s</xliff:g>).</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplicación utiliza o teu dispositivo (<xliff:g id="TYPE_1">%2$s</xliff:g>).</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Ver detalles"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplicación que utiliza o seguinte: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplicacións que utilizan o seguinte: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index f17a7f6..878d0b9 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"USB ડિબગિંગને મંજૂરી આપીએ?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"કમ્પ્યુટરની RSA મુખ્ય ફિંગરપ્રિંટ આ છે:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"હંમેશા આ કમ્પ્યુટરથી મંજૂરી આપો"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB ડીબગિંગની મંજૂરી નથી"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"હાલમાં આ ઉપકરણમાં સાઇન ઇન થયેલ વપરાશકર્તા USB ડિબગીંગ ચાલુ કરી શકતા નથી. આ સુવિધાનો ઉપયોગ કરવા માટે પ્રાથમિક વપરાશકર્તા પર સ્વિચ કરો."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"સ્ક્રીન ભરવા માટે ઝૂમ કરો"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"સ્ક્રીન ભરવા માટે ખેંચો"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"સ્ક્રીનશૉટ"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"રદ કરો"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"સહાય સંદેશનું ક્ષેત્ર"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"કન્ફર્મ કરો"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ફરી પ્રયાસ કરો"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ફિંગરપ્રિન્ટના સેન્સરને સ્પર્શ કરો"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ફિંગરપ્રિન્ટનું આઇકન"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"તમારા માટે શોધી રહ્યાં છે..."</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ઑડિઓ"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"હૅડસેટ"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ઇનપુટ"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"શ્રવણ યંત્રો"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ચાલુ કરી રહ્યાં છીએ…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"તેજ"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"આપમેળે ફેરવો"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"તમે સામાન્ય રીતે આ નોટીફિકેશનને છોડી દો છો. \nતેમને બતાવવાનું ચાલુ રાખીએ?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"આ નોટિફિકેશન બતાવવાનું ચાલુ રાખીએ?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"નોટિફિકેશન બંધ કરો"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"બ્લૉક કરો"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"બતાવવાનું ચાલુ રાખો"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"નાનું કરો"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"સાઇલન્ટલી બતાવો"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"સાઇલન્ટ મોડ ચાલુ રાખો"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"મને અલર્ટ બતાવો"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"અલર્ટ કરવાનું ચાલુ રાખો"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"આ ઍપમાંથી નોટિફિકેશન બતાવવાનું ચાલુ રાખીએ?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"આ નોટિફિકેશન બંધ કરી શકશો નહીં"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> મારફતે"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"સેટિંગ"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"સમજાઈ ગયું"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> ઍપ</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ઍપ</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> ઍપ તમારા <xliff:g id="TYPES_LIST">%2$s</xliff:g>નો ઉપયોગ કરી રહી છે."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"ઍપ્લિકેશન તમારા <xliff:g id="TYPES_LIST">%s</xliff:g>નો ઉપયોગ કરી રહી છે."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"રદ કરો"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ઍપ્લિકેશન તમારા <xliff:g id="TYPE_5">%2$s</xliff:g>નો ઉપયોગ કરી રહી છે.</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ઍપ્લિકેશનો તમારા <xliff:g id="TYPE_5">%2$s</xliff:g>નો ઉપયોગ કરી રહી છે.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"વિગતો જુઓ"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"અ‍ૅપ તમારા <xliff:g id="TYPES_LIST">%s</xliff:g>નો ઉપયોગ કરી રહી છે"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"અ‍ૅપ તમારા <xliff:g id="TYPES_LIST">%s</xliff:g>નો ઉપયોગ કરી રહી છે"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 1c69910..96c6f6e 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"USB डीबगिंग करने दें?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"कंप्यूटर का RSA कुंजी फ़िंगरप्रिंट है:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"इस कंप्यूटर से हमेशा अनुमति दें"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB डीबगिंग की अनुमति नहीं है"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"अभी इस डिवाइस में जिस उपयोगकर्ता ने साइन इन किया है, वो USB डीबगिंग चालू नहीं कर सकता. इस सुविधा का इस्तेमाल करने के लिए, प्राथमिक उपयोगकर्ता में बदलें."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"स्‍क्रीन भरने के लिए ज़ूम करें"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"स्‍क्रीन भरने के लिए खींचें"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"स्क्रीनशॉट"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"रद्द करें"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"सहायता का मैसेज दिखाने की जगह"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"पुष्टि करें"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"फिर से कोशिश करें"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"फ़िंगरप्रिंट सेंसर को छुएं"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"फ़िंगरप्रिंट आइकॉन"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"आपको पहचान रहा है…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ऑडियो"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"हेडसेट"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"इनपुट"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"सुनने में मददगार डिवाइस"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ब्लूटूथ चालू हो रहा है…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"स्क्रीन की रोशनी"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"स्वत: घुमाएं"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"अाप अक्सर इन सूचनाओं को खारिज कर देते हैं. \nआगे भी इन्हें देखना जारी रखना चाहते हैं?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"ये सूचनाएं दिखाना जारी रखें?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"सूचनाएं दिखाना बंद करें"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"ब्लॉक करें"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"दिखाना जारी रखें"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"सूचनाएं छोटी करें"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"बिना आवाज़ के दिखाएं"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"साइलेंट मोड में सूचनाएं पाएं"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"मुझे सूचना दें"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"सूचना देना जारी रखें"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"इस ऐप्लिकेशन से जुड़ी सूचनाएं दिखाना जारी रखें?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"ये सूचनाएं दिखाया जाना बंद नहीं किया जा सकता"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> के ज़रिए"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"सेटिंग"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"ठीक है"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> ऐप्लिकेशन</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ऐप्लिकेशन</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> आपकी <xliff:g id="TYPES_LIST">%2$s</xliff:g> का इस्तेमाल कर रहा है."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"ऐप्लिकेशन आपकी <xliff:g id="TYPES_LIST">%s</xliff:g> का इस्तेमाल कर रहे हैं."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"रद्द करें"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ऐप्लिकेशन आपके <xliff:g id="TYPE_5">%2$s</xliff:g> का इस्तेमाल कर रहे हैं.</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ऐप्लिकेशन आपके <xliff:g id="TYPE_5">%2$s</xliff:g> का इस्तेमाल कर रहे हैं.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"विवरण देखें"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"<xliff:g id="TYPES_LIST">%s</xliff:g> का इस्तेमाल कर रहा ऐप्लिकेशन"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"आपके <xliff:g id="TYPES_LIST">%s</xliff:g> का इस्तेमाल कर रहे ऐप्लिकेशन"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 8f3a11b..17e1cc3 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Omogućiti otklanjanje pogrešaka putem USB-a?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Otisak prsta RSA ključa računala je: \n <xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Uvijek dopusti s ovog računala"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Otklanjanje pogrešaka putem USB-a nije dopušteno"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Korisnik koji je trenutačno prijavljen na ovaj uređaj ne može uključiti otklanjanje pogrešaka putem USB-a. Da biste upotrebljavali tu značajku, prijeđite na primarnog korisnika."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Zumiraj i ispuni zaslon"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Rastegni i ispuni zaslon"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Snimka zaslona"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Odustani"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Područje poruke za pomoć"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potvrdi"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Pokušaj ponovo"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dodirnite senzor otiska prsta"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona otiska prsta"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Tražimo vas…"</string>
@@ -297,8 +302,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Slušalice"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Unos"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Slušni aparati"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Uključivanje…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Svjetlina"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatsko izmjenjivanje"</string>
@@ -614,17 +618,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Obično odbacujete te obavijesti. \nŽelite li da se nastave prikazivati?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Želite li da se obavijesti nastave prikazivati?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Zaustavi obavijesti"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Blokiraj"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Nastavi prikazivati"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimiziraj"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Prikaži tiho"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Nastavi tiho"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Obavijesti me"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Nastavi obavještavati"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Želite li da se obavijesti te aplikacije nastave prikazivati?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Te se obavijesti ne mogu isključiti"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"putem aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -876,11 +876,20 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Postavke"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Shvaćam"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Izdvoji mem. SysUI-a"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacija</item>
+      <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> aplikacije</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacija</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> upotrebljava <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikacije upotrebljavaju <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Odustani"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacija upotrebljava <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="few"><xliff:g id="NUM_APPS_2">%1$d</xliff:g> aplikacije upotrebljavaju <xliff:g id="TYPE_3">%2$s</xliff:g>.</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacija upotrebljava <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Prikaži detalje"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplikacije koje upotrebljavaju <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplikacije koje upotrebljavaju <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 49d923a..6e14200 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Engedélyezi az USB hibakeresést?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"A számítógép RSA kulcs ujjlenyomata:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Mindig engedélyezze erről a számítógépről"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Az USB hibakeresése nem engedélyezett"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Az eszközre jelenleg bejelentkezett felhasználó nem engedélyezheti az USB-hibakeresést. A funkció használatához váltson az elsődleges felhasználóra."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Nagyítás a kitöltéshez"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Nyújtás kitöltéshez"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Képernyőkép"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Mégse"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Súgószöveg területe"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Megerősítés"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Újrapróbálkozás"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Érintse meg az ujjlenyomat-érzékelőt"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ujjlenyomat ikonja"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Keresem az Ön arcát…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Hang"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Bevitel"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Hallókészülékek"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Bekapcsolás…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Fényerő"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatikus elforgatás"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Általában elveti ezeket az értesítéseket.\nSzeretné, hogy továbbra is megjelenjenek?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Továbbra is megjelenjenek ezek az értesítések?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Értesítések letiltása"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Tiltás"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Megjelenítés továbbra is"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Kis méret"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Megjelenítés hang nélkül"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Néma megjelenítés"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Értesítsen"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Értesítések folytatása"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Továbbra is megjelenjenek az alkalmazás értesítései?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Ezeket az értesítéseket nem lehet kikapcsolni"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazás használatával"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Beállítások"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Értem"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI-memória-kiírás"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> alkalmazás</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> alkalmazás</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"A(z) <xliff:g id="APP">%1$s</xliff:g> használja a következőket: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Több alkalmazás használja a következőket: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Mégse"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> alkalmazás használja a következőt: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> alkalmazás használja a következőt: <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Részletek"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"A következőket használó alkalmazás: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"A következőt használó alkalmazások: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index dc592c5..37512e6 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Թույլատրե՞լ USB-ի կարգաբերումը:"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Համակարգչի RSA-ի բանալի մատնահետքն է`\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Միշտ թույլատրել այս համակարգչից"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB վրիպազերծումը արգելված է"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Ընթացիկ հաշվի օգտատերը չի կարող միացնել USB վրիպազերծումը: Այս գործառույթը միացնելու համար մուտք գործեք հիմնական օգտատիրոջ հաշվով:"</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Խոշորացնել` էկրանը լցնելու համար"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Ձգել` էկրանը լցնելու համար"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Սքրինշոթ"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Չեղարկել"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Օգնության հաղորդագրության դաշտ"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Հաստատել"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Նորից փորձել"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Հպեք մատնահետքերի սկաներին"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Մատնահետքի պատկերակ"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Դեմքի ճանաչում…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Աուդիո"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Ականջակալ"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Մուտքագրում"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Լսողական ապարատ"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Միացում…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Պայծառություն"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Ինքնապտտում"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Դուք սովորաբար փակում եք այս ծանուցումները: \nՇարունակե՞լ ցուցադրել դրանք:"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Ցուցադրե՞լ այս ծանուցումները։"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Չցուցադրել ծանուցումներ"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Արգելափակել"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Ցուցադրել"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Ծալել"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Ցույց տալ անձայն"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Չմիացնել ձայնը"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Ծանուցել ինձ"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Ծանուցել"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Ցուցադրե՞լ ծանուցումներ այս հավելվածից։"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Այս ծանուցումները հնարավոր չէ անջատել"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածի միջոցով"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Կարգավորումներ"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Եղավ"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> հավելված</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> հավելված</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> հավելվածն օգտագործում է ձեր <xliff:g id="TYPES_LIST">%2$s</xliff:g>:"</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Հավելվածներն օգտագործում են ձեր <xliff:g id="TYPES_LIST">%s</xliff:g>:"</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Չեղարկել"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one">Ձեր սարքում <xliff:g id="NUM_APPS_4">%1$d</xliff:g> հավելված օգտագործում է <xliff:g id="TYPE_5">%2$s</xliff:g>։</item>
+      <item quantity="other">Ձեր սարքում <xliff:g id="NUM_APPS_4">%1$d</xliff:g> հավելված օգտագործում է <xliff:g id="TYPE_5">%2$s</xliff:g>:</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Մանրամասն"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Հավելված, որն օգտագործում է <xliff:g id="TYPES_LIST">%s</xliff:g> ձեր սարքում"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Հավելվածներ, որոնք օգտագործում են <xliff:g id="TYPES_LIST">%s</xliff:g> ձեր սարքում"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 1b43e65..9d49bdc 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Izinkan debugging USB?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Sidik jari kunci RSA komputer adalah:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Selalu izinkan dari komputer ini"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Debug USB tidak diizinkan"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Pengguna yang sedang login ke perangkat ini tidak dapat mengaktifkan proses debug USB. Beralihlah ke pengguna utama untuk menggunakan fitur ini."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Perbesar utk mengisi layar"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Rentangkn utk mngisi layar"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Batal"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Area pesan bantuan"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Konfirmasi"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Coba lagi"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Sentuh sensor sidik jari"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon sidik jari"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Mencari wajah Anda…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Masukan"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Alat Bantu Dengar"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Mengaktifkan…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Kecerahan"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotasi otomatis"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Anda biasanya menutup notifikasi ini. \nTerus tampilkan?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Terus tampilkan notifikasi ini?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Hentikan notifikasi"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Blokir"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Terus tampilkan"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Perkecil"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Tampilkan tanpa suara"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Tetap nonaktif"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Beri tahu saya"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Terus beri tahu"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Terus tampilkan notifikasi dari aplikasi ini?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Notifikasi ini tidak dapat dinonaktifkan"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"melalui <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Setelan"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Hapus Heap SysUI"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikasi</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplikasi</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> menggunakan <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikasi menggunakan <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Batal"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikasi menggunakan <xliff:g id="TYPE_5">%2$s</xliff:g> Anda.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplikasi menggunakan <xliff:g id="TYPE_1">%2$s</xliff:g> Anda.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Lihat detail"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplikasi yang menggunakan <xliff:g id="TYPES_LIST">%s</xliff:g> Anda"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplikasi yang menggunakan <xliff:g id="TYPES_LIST">%s</xliff:g> Anda"</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 36b557d..0cc367b 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Leyfa USB-villuleit?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Fingrafar RSA-lykils tölvunnar er:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Leyfa alltaf úr þessari tölvu"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-villuleit ekki leyfð"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Notandinn sem er skráður inn í þetta tæki núna getur ekki kveikt á USB-villuleit. Til þess að nota þennan eiginleika skaltu skipta yfir í aðalnotandann."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Fylla skjá með aðdrætti"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Teygja yfir allan skjáinn"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Skjámynd"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Hætta við"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Svæði hjálparskilaboða"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Staðfesta"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Reyna aftur"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Snertu fingrafaralesarann"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingrafaratákn"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Leitar að þér ..."</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Hljóð"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Höfuðtól"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Inntak"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Heyrnartæki"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Kveikir…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Birtustig"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Sjálfvirkur snúningur"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Þú hunsar yfirleitt þessar tilkynningar. \nViltu halda áfram að fá þær?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Sýna áfram þessar tilkynningar?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Stöðva tilkynningar"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Loka á"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Sýna áfram"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minnka"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Sýna án hljóðs"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Áfram hljóðlaust"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Láta mig vita"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Halda áfram að gera viðvart"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Sýna áfram tilkynningar frá þessu forriti?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Ekki er hægt að slökkva á þessum tilkynningum"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"með <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Stillingar"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Ég skil"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Vista SysUI-gögn"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> forrit</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> forrit</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> er að nota <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Forrit eru að nota <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Hætta við"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> forrit er að nota <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> forrit eru að nota <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Sjá nánar"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Forrit sem nota <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Forrit sem nota <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 21c259a..27998bf 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Consentire debug USB?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Fingerprint della chiave RSA del computer: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Consenti sempre da questo computer"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Debug USB non consentito"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"L\'utente che ha eseguito l\'accesso a questo dispositivo non può attivare il debug USB. Per utilizzare questa funzione, passa all\'utente principale."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Zoom per riempire schermo"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Estendi per riemp. schermo"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Annulla"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Area dei messaggi di assistenza"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confermo"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Riprova"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Tocca il sensore di impronte digitali"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icona dell\'impronta digitale"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"In attesa del volto…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Auricolare"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Ingresso"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Apparecchi acustici"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Attivazione…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Luminosità"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotazione automatica"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"In genere ignori queste notifiche. \nVuoi continuare a riceverle?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Continuare a ricevere queste notifiche?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Interrompi la ricezione di notifiche"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Blocca"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Continua a mostrare"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Riduci a icona"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Mostra silenziosamente"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Continua con notifiche silenziose"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Avvisami"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Continua ad avvisare"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Continuare a ricevere notifiche da questa app?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Queste notifiche non possono essere disattivate"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"tramite <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Impostazioni"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Esegui dump heap SysUI"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> app</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"L\'app <xliff:g id="APP">%1$s</xliff:g> sta usando <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Le app stanno usando <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Annulla"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> applicazioni stanno utilizzando <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> applicazione sta utilizzando <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Vedi dettagli"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App che usa <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"App che utilizzano <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index d43551d..71cf575 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"‏האם לאפשר ניפוי באגים ב-USB?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"‏טביעת האצבע של מפתח ה-RSA של המחשב היא:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"אפשר תמיד ממחשב זה"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"‏לא ניתן לבצע ניפוי באגים ב-USB"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"‏למשתמש המחובר לחשבון במכשיר הזה אין אפשרות להפעיל ניפוי באגים ב-USB. כדי להשתמש בתכונה הזו יש לעבור אל המשתמש הראשי."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"הגדל תצוגה כדי למלא את המסך"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"מתח כדי למלא את המסך"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"צילום מסך"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"ביטול"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"אזור הודעת עזרה"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"אישור"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ניסיון נוסף"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"יש לגעת בחיישן טביעות האצבע"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"סמל טביעת אצבע"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"מחפש אותך…"</string>
@@ -298,8 +303,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"אודיו"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"אוזניות"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"קלט"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"מכשירי שמיעה"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ההפעלה מתבצעת…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"בהירות"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"סיבוב אוטומטי"</string>
@@ -617,17 +621,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"הודעות אלה בדרך כלל נדחות על ידיך. \nלהמשיך להציג אותן?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"שנמשיך להציג לך את ההודעות האלה?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"לא, אל תמשיכו"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"חסימה"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"כן, המשיכו"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"מזעור"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"הצגה ללא צליל"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"בשקט"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"אבקש התראה"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"המשך שליחת התראות"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"שנמשיך להציג לך הודעות מהאפליקציה הזאת?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"לא ניתן לכבות את ההודעות האלה"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"באמצעות <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -881,11 +881,22 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"הגדרות"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"הבנתי"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"‏ערימת Dump SysUI"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="two"><xliff:g id="NUM_APPS_2">%d</xliff:g> אפליקציות</item>
+      <item quantity="many"><xliff:g id="NUM_APPS_2">%d</xliff:g> אפליקציות</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> אפליקציות</item>
+      <item quantity="one">אפליקציה אחת (<xliff:g id="NUM_APPS_0">%d</xliff:g>)</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> משתמשת ב<xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"אפליקציות משתמשות ב<xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"ביטול"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="two"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> אפליקציות משתמשות ב<xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="many"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> אפליקציות משתמשות ב<xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> אפליקציות משתמשות ב<xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="one">אפליקציה אחת (<xliff:g id="NUM_APPS_0">%1$d</xliff:g>) משתמשת ב<xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"הצגת פרטים"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"האפליקציה משתמשת ב<xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"אפליקציות משתמשות ב<xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index ff88a0d..2430500 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"USBデバッグを許可しますか?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"このパソコンのRSAキーのフィンガープリント:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"このパソコンからのUSBデバッグを常に許可する"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USBデバッグは許可されていません"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"この端末に現在ログインしているユーザーでは、USB デバッグを ON にすることはできません。この機能を使用するには、メインユーザーに切り替えてください。"</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"画面サイズに合わせて拡大"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"画面サイズに合わせて拡大"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"スクリーンショット"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"キャンセル"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"ヘルプ メッセージ領域"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"確認"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"再試行"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"指紋認証センサーをタップしてください"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指紋アイコン"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"顔を認証しています…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"オーディオ"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ヘッドセット"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"入力"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"補聴器"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ON にしています…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"画面の明るさ"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"自動回転"</string>
@@ -595,7 +599,7 @@
     <string name="enable_bluetooth_title" msgid="5027037706500635269">"BluetoothをONにしますか?"</string>
     <string name="enable_bluetooth_message" msgid="9106595990708985385">"タブレットでキーボードに接続するには、最初にBluetoothをONにする必要があります。"</string>
     <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"ONにする"</string>
-    <string name="show_silently" msgid="6841966539811264192">"通知をマナーモードで表示する"</string>
+    <string name="show_silently" msgid="6841966539811264192">"通知をポップアップで知らせる"</string>
     <string name="block" msgid="2734508760962682611">"通知をすべてブロックする"</string>
     <string name="do_not_silence" msgid="6878060322594892441">"音声で知らせる"</string>
     <string name="do_not_silence_block" msgid="4070647971382232311">"音声で知らせる / ブロックしない"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"通常、この通知はスワイプして非表示にしています。\n今後も表示しますか?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"この通知を今後も表示しますか?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"通知を表示しない"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"ブロック"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"今後も表示する"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"最小化"</string>
-    <string name="inline_silent_button_silent" msgid="4411510650503783646">"サイレント モードで表示"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_silent" msgid="4411510650503783646">"ポップアップで知らせる"</string>
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"音なしで通知"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"アラートを設定"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"今後もアラートを受け取る"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"このアプリからの通知を今後も表示しますか?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"この通知を OFF にすることはできません"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> 経由"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"設定"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI ヒープのダンプ"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g>個のアプリ</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g>個のアプリ</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g>は<xliff:g id="TYPES_LIST">%2$s</xliff:g>を使用しています。"</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"アプリは<xliff:g id="TYPES_LIST">%s</xliff:g>を使用しています。"</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"キャンセル"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> 個のアプリが <xliff:g id="TYPE_5">%2$s</xliff:g> を使用しています。</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> 個のアプリが <xliff:g id="TYPE_1">%2$s</xliff:g> を使用しています。</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"詳細を表示"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"<xliff:g id="TYPES_LIST">%s</xliff:g>を使用しているアプリ"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"<xliff:g id="TYPES_LIST">%s</xliff:g>を使用しているアプリ"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index e1ee20e..40f13039f 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"გააქტიურდეს USB გამართვა?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"კომპიუტერის RSA გასაღების თითის ანაბეჭდია:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"ყოველთვის დართე ნება ამ კომპიუტერიდან."</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB ხარვეზების გამართვა ნებადართული არაა"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ამ მოწყობილობაზე ამჟამად შესულ მომხმარებელს არ შეუძლია USB ხარვეზების გამართვის ფუნქციის ჩართვა. ამ ფუნქციის გამოსაყენებლად, მიუერთდით მთავარ მომხმარებელს."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"მასშტაბი შეცვალეთ ეკრანის შესავსებად."</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"გაწიეთ ეკრანის შესავსებად."</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"ეკრანის ანაბეჭდი"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"გაუქმება"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"დამხმარე შეტყობინების არე"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"დადასტურება"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ხელახლა ცდა"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"შეეხეთ თითის ანაბეჭდის სენსორს"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"თითის ანაბეჭდის ხატულა"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"მიმდინარეობს თქვენი ძიება…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"აუდიო"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ყურსაცვამი"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"შეყვანა"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"სმენის მოწყობილობები"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ირთვება…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"სიკაშკაშე"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"ავტოროტაცია"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"როგორც წესი, თქვენ ასეთ შეტყობინებებს ხურავთ. \nგსურთ მათი ჩვენების გაგრძელება?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"გაგრძელდეს ამ შეტყობინებათა ჩვენება?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"შეტყობინებების შეწყვეტა"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"დაბლოკვა"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"ჩვენების გაგრძელება"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"ჩაკეცვა"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"უხმოდ ჩვენება"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"კვლავ ჩუმად ჩვენება"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"გაფრთხილების მიღება"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"გაფრთხილების გაგრძელება"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"გაგრძელდეს შეტყობინებათა ჩვენება ამ აპიდან?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"ამ შეტყობინებათა გამორთვა ვერ მოხერხდება"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g>-დან"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"პარამეტრები"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"გასაგებია"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI გროვის გამოტანა"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> აპი</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> აპი</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g>-ის მიერ გამოიყენება თქვენი <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"აპლიკაციების მიერ გამოიყენება თქვენი <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"გაუქმება"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other">თქვენი <xliff:g id="TYPE_5">%2$s</xliff:g> გამოიყენება <xliff:g id="NUM_APPS_4">%1$d</xliff:g> აპლიკაციის მიერ.</item>
+      <item quantity="one">თქვენი <xliff:g id="TYPE_1">%2$s</xliff:g> გამოიყენება <xliff:g id="NUM_APPS_0">%1$d</xliff:g> აპლიკაციის მიერ.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"დეტალების ნახვა"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"აპი, რომლის მიერაც გამოიყენება თქვენი <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"აპები, რომელთა მიერაც გამოიყენება თქვენი <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index 41ef3e2..b00c560 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"USB жөндеуге рұқсат берілсін бе?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Бұл компьютердің  RSA перне саусақ таңбасы:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Осы компьютерден әрқашан рұқсат беру"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB жөндеу рұқсат етілмеген"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Бұл құрылғыға жаңа кірген пайдаланушы USB түзетуін іске қосылмайды. Бұл мүмкіндікті пайдалану үшін негізгі пайдаланушыға ауысыңыз."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Экранды толтыру үшін ұлғайту"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Экранды толтыру үшін созу"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Скриншот"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Бас тарту"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Анықтама хабары аумағы"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Растау"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Қайталап көріңіз"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Саусақ ізін оқу сканерін түртіңіз"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Саусақ ізі белгішесі"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Бет ізделуде…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Aудио"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Гарнитура"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Кіріс"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Есту аппараттары"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Қосылуда…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Жарықтығы"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Автоматты түрде бұру"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Әдетте хабарландыруларды көрмейсіз. \nОлар көрсетілсін бе?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Хабарландырулар көрсетілсін бе?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Хабарландыруларға тыйым салу"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Бөгеу"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Көрсету"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Жасыру"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Дыбыссыз көрсету"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Хабарландырулар алғым келмейді"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Хабарландырулар алғым келеді"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Хабарландырулар келе берсін"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Осы қолданбаның хабарландырулары көрсетілсін бе?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Хабарландыруларды өшіру мүмкін емес"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> арқылы"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Параметрлер"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Түсінікті"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> қолданба</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> қолданба</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> қолданбасында <xliff:g id="TYPES_LIST">%2$s</xliff:g> пайдалануда."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Қолданбаларда <xliff:g id="TYPES_LIST">%s</xliff:g> пайдаланылуда."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Бас тарту"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="TYPE_5">%2$s</xliff:g> опциясын <xliff:g id="NUM_APPS_4">%1$d</xliff:g> қолданба пайдаланып жатыр.</item>
+      <item quantity="one"><xliff:g id="TYPE_1">%2$s</xliff:g> опциясын <xliff:g id="NUM_APPS_0">%1$d</xliff:g> қолданба пайдаланып жатыр.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Мәліметті көру"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"<xliff:g id="TYPES_LIST">%s</xliff:g> пайдаланып жатқан қолданба"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"<xliff:g id="TYPES_LIST">%s</xliff:g> пайдаланып жатқан қолданбалар"</string>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 5520cb0..a3c37a6 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"អនុញ្ញាត​ការ​កែ​កំហុសតាម USB ឬ?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"ស្នាម​ម្រាម​ដៃ​ RSA របស់​កុំព្យូទ័រ​គឺ៖ \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"អនុញ្ញាត​ជា​និច្ច​សម្រាប់​កុំព្យូទ័រ​នេះ"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"មិនអនុញ្ញាតការកែកំហុសតាម USB ទេ"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"អ្នកប្រើ​ដែលបច្ចុប្បន្ន​បានចូលគណនី​នៅលើឧបករណ៍នេះ​មិនអាចបើកការកែកំហុស USB បានទេ។ ដើម្បីប្រើមុខងារនេះ សូមប្តូរទៅអ្នកប្រើចម្បង។"</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"ពង្រីក​​ដើម្បី​ឲ្យ​ពេញ​អេក្រង់"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"ទាញ​ដើម្បី​ឲ្យ​ពេញ​អេក្រង់"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"រូបថតអេក្រង់"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"បោះ​បង់​"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"តំបន់សារ​ជំនួយ"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"បញ្ជាក់"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ព្យាយាម​ម្ដង​ទៀត"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ប៉ះ​ឧបករណ៍​ចាប់ស្នាម​ម្រាមដៃ"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"រូបតំណាង​ស្នាម​ម្រាមដៃ"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"កំពុងស្វែងរកអ្នក…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"សំឡេង"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"កាស"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"បញ្ចូល"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"ឧបករណ៍​ជំនួយការ​ស្ដាប់"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"កំពុង​បើក..."</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"ពន្លឺ"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"បង្វិល​ស្វ័យ​ប្រវត្តិ"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"ជាធម្មតា​អ្នក​ច្រានចោល​ការ​ជូន​ដំណឹង​ទាំង​នេះ។ \nបន្ត​បង្ហាញ​ពួកវា​ទៀត​ដែរ​ទេ?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"បន្ត​បង្ហាញ​ការជូនដំណឹង​ទាំងនេះ?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"បញ្ឈប់​ការជូនដំណឹង"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"ទប់ស្កាត់"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"បន្ត​បង្ហាញ"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"បង្រួម"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"បង្ហាញ​ស្ងាត់ៗ"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"បន្ត​បិទសំឡេង"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"ជូន​ដំណឹង​ដល់ខ្ញុំ"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"បន្ត​ជូនដំណឹង"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"បន្ត​បង្ហាញ​ការជូនដំណឹង​ពីកម្មវិធីនេះ?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"​មិនអាច​បិទការជូនដំណឹង​ទាំងនេះបានទេ"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"តាមរយៈ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"ការកំណត់"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"យល់ហើយ"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"ចម្លង SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other">កម្មវិធី <xliff:g id="NUM_APPS_2">%d</xliff:g></item>
+      <item quantity="one">កម្មវិធី <xliff:g id="NUM_APPS_0">%d</xliff:g></item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> កំពុងប្រើ <xliff:g id="TYPES_LIST">%2$s</xliff:g> របស់អ្នក។"</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"កម្មវិធី​កំពុងប្រើ <xliff:g id="TYPES_LIST">%s</xliff:g> របស់អ្នក។"</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"បោះបង់"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other">កម្មវិធី <xliff:g id="NUM_APPS_4">%1$d</xliff:g> កំពុងប្រើប្រាស់ <xliff:g id="TYPE_5">%2$s</xliff:g> របស់អ្នក។</item>
+      <item quantity="one">កម្មវិធី <xliff:g id="NUM_APPS_0">%1$d</xliff:g> កំពុងប្រើប្រាស់ <xliff:g id="TYPE_1">%2$s</xliff:g> របស់អ្នក។</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"មើល​ព័ត៌មាន​លម្អិត"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"កម្មវិធី​កំពុង​ប្រើប្រាស់ <xliff:g id="TYPES_LIST">%s</xliff:g> របស់អ្នក"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"កម្មវិធី​កំពុង​ប្រើប្រាស់ <xliff:g id="TYPES_LIST">%s</xliff:g> របស់អ្នក"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index f829c12..8c553f5 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"USB ಡೀಬಗ್ ಮಾಡುವಿಕೆಯನ್ನು ಅನುಮತಿಸುವುದೇ?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"ಕಂಪ್ಯೂಟರ್‌ನ RSA ಕೀ ಫಿಂಗರ್ ಪ್ರಿಂಟ್ ಹೀಗಿದೆ :\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"ಈ ಕಂಪ್ಯೂಟರ್‌ನಿಂದ ಯಾವಾಗಲೂ ಅನುಮತಿಸಿ"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB ಡೀಬಗ್ ಮಾಡುವಿಕೆಯನ್ನು ಅನುಮತಿಸಲಾಗಿಲ್ಲ"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ಬಳಕೆದಾರರು ಪ್ರಸ್ತುತ ಈ ಸಾಧನಕ್ಕೆ ಸೈನ್ ಇನ್ ಮಾಡಿದ್ದಾರೆ USB ಡೀಬಗ್ ಮಾಡುವುದನ್ನು ಆನ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬಳಸಲು, ಪ್ರಾಥಮಿಕ ಬಳಕೆದಾರರಿಗೆ ಬದಲಾಯಿಸಿ."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"ಪರದೆ ತುಂಬಿಸಲು ಝೂಮ್ ಮಾಡು"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"ಪರದೆ ತುಂಬಿಸಲು ವಿಸ್ತಾರಗೊಳಿಸು"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"ಸ್ಕ್ರೀನ್‌ಶಾಟ್"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"ರದ್ದುಮಾಡಿ"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"ಸಹಾಯ ಸಂದೇಶ ಪ್ರದೇಶ"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"ದೃಢೀಕರಿಸಿ"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್‌‌ ಅನ್ನು ಸ್ಪರ್ಶಿಸಿ"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಐಕಾನ್"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ನಿಮಗಾಗಿ ಹುಡುಕಲಾಗುತ್ತಿದೆ…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ಆಡಿಯೋ"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ಹೆಡ್‌ಸೆಟ್"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ಇನ್‌ಪುಟ್"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"ಶ್ರವಣ ಸಾಧನಗಳು"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ಆನ್ ಮಾಡಲಾಗುತ್ತಿದೆ..."</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"ಪ್ರಕಾಶಮಾನ"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"ಸ್ವಯಂ-ತಿರುಗುವಿಕೆ"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"ನೀವು ಸಾಮಾನ್ಯವಾಗಿ ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ವಜಾಗೊಳಿಸಿದ್ದೀರಿ. \nಅವುಗಳನ್ನು ತೋರಿಸುತ್ತಲೇ ಇರಬೇಕೆ?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೋರಿಸುತ್ತಲೇ ಇರಬೇಕೆ?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"ಅಧಿಸೂಚನೆಗಳನ್ನು ನಿಲ್ಲಿಸಿ"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"ನಿರ್ಬಂಧಿಸಿ"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"ತೋರಿಸುತ್ತಲಿರಿ"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"ಕಿರಿದುಗೊಳಿಸಿ"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"ಮೌನವಾಗಿ ತೋರಿಸಿ"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"ಮೌನವಾಗಿರಿ"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"ನನ್ನನ್ನು ಎಚ್ಚರಿಸಿ"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"ಎಚ್ಚರಿಸುತ್ತಿರಿ"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"ಈ ಅಪ್ಲಿಕೇಶನ್‌ನಿಂದ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೋರಿಸುತ್ತಲೇ ಇರಬೇಕೆ?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ಆಫ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಮೂಲಕ"</string>
@@ -734,7 +734,7 @@
     <item msgid="586019486955594690">"ಬಲ-ಬಾಗುವಿಕೆ"</item>
   </string-array>
     <string name="menu_ime" msgid="4998010205321292416">"ಕೀಬೋರ್ಡ್ ಬದಲಾಯಿಸುವಿಕೆ"</string>
-    <string name="save" msgid="2311877285724540644">"ಉಳಿಸು"</string>
+    <string name="save" msgid="2311877285724540644">"ಉಳಿಸಿ"</string>
     <string name="reset" msgid="2448168080964209908">"ಮರುಹೊಂದಿಸು"</string>
     <string name="adjust_button_width" msgid="6138616087197632947">"ಬಟನ್ ಅಳತೆ ಹೊಂದಿಸು"</string>
     <string name="clipboard" msgid="1313879395099896312">"ಕ್ಲಿಪ್‌ಬೋರ್ಡ್"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"ಅರ್ಥವಾಯಿತು"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI ಹೀಪ್ ಡಂಪ್ ಮಾಡಿ"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> ಆ್ಯಪ್‌ಗಳು</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ಆ್ಯಪ್‌ಗಳು</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"ನಿಮ್ಮ <xliff:g id="TYPES_LIST">%2$s</xliff:g> ಅನ್ನು <xliff:g id="APP">%1$s</xliff:g> ಬಳಸುತ್ತಿದೆ."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"ನಿಮ್ಮ <xliff:g id="TYPES_LIST">%s</xliff:g> ಅನ್ನು ಆ್ಯಪ್‌ಗಳು ಬಳಸುತ್ತಿವೆ."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"ರದ್ದುಮಾಡಿ"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ಆ್ಯಪ್‌ಗಳು ನಿಮ್ಮ <xliff:g id="TYPE_5">%2$s</xliff:g> ಅನ್ನು ಬಳಸುತ್ತಿವೆ.</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ಆ್ಯಪ್‌ಗಳು ನಿಮ್ಮ <xliff:g id="TYPE_5">%2$s</xliff:g> ಅನ್ನು ಬಳಸುತ್ತಿವೆ.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"ವಿವರಗಳನ್ನು ನೋಡಿ"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"ಆ್ಯಪ್ ನಿಮ್ಮ <xliff:g id="TYPES_LIST">%s</xliff:g> ಅನ್ನು ಬಳಸುತ್ತಿದೆ"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"ಆ್ಯಪ್‌ಗಳು ನಿಮ್ಮ <xliff:g id="TYPES_LIST">%s</xliff:g> ಅನ್ನು ಬಳಸುತ್ತಿವೆ"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index f5168fb..559357f 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"USB 디버깅을 허용하시겠습니까?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"컴퓨터 RSA 키 지문:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"이 컴퓨터에서 항상 허용"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB 디버깅이 허용되지 않음"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"현재 이 기기에 로그인한 사용자는 USB 디버깅을 사용 설정할 수 없습니다. 이 기능을 사용하려면 기본 사용자로 전환하세요."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"전체화면 모드로 확대"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"전체화면 모드로 확대"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"스크린샷"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"취소"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"도움말 메시지 영역"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"확인"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"다시 시도하세요."</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"지문 센서를 터치하세요."</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"지문 아이콘"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"찾는 중..."</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"오디오"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"헤드셋"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"입력"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"보청기"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"켜는 중..."</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"밝기"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"자동 회전"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"보통 이 알림을 닫았습니다. \n알림을 계속 표시하시겠습니까?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"이 알림을 계속 표시하시겠습니까?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"알림 중지"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"차단"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"계속 표시하기"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"최소화"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"소리 없이 표시"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"계속 무음으로 알림"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"내게 알림"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"계속 알림"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"이 앱의 알림을 계속 표시하시겠습니까?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"이 알림은 끌 수 없습니다"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"제공: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"설정"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"확인"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other">앱 <xliff:g id="NUM_APPS_2">%d</xliff:g>개</item>
+      <item quantity="one">앱 <xliff:g id="NUM_APPS_0">%d</xliff:g>개</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g>이(가) <xliff:g id="TYPES_LIST">%2$s</xliff:g>을(를) 사용 중입니다."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"애플리케이션이 <xliff:g id="TYPES_LIST">%s</xliff:g>을(를) 사용 중입니다."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"취소"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other">애플리케이션 <xliff:g id="NUM_APPS_4">%1$d</xliff:g>개가 <xliff:g id="TYPE_5">%2$s</xliff:g>을(를) 사용하고 있습니다.</item>
+      <item quantity="one">애플리케이션 <xliff:g id="NUM_APPS_0">%1$d</xliff:g>개가 <xliff:g id="TYPE_1">%2$s</xliff:g>을(를) 사용하고 있습니다.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"세부정보 보기"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"<xliff:g id="TYPES_LIST">%s</xliff:g>을(를) 사용 중인 앱"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"<xliff:g id="TYPES_LIST">%s</xliff:g>을(를) 사용 중인 앱"</string>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index 9558c3a..5725d16 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"USB аркылуу жөндөөгө уруксат берилсинби?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Компүтердин RSA ачкычынын контролдук суммасы:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Бул компүтерден дайыма уруксат берилсин"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB мүчүлүштүктөрүн оңдоого уруксат жок"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Учурда бул аккаунтта USB аркылуу мүчүлүштүктөрдү оңдоо функциясын иштетүүгө болбойт. Негизги колдонуучунун аккаунтуна кириңиз."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Экрнд тлтр ү. чен өлч өзг"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Экранды толтуруу ү-н чоюу"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Скриншот"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Жокко чыгаруу"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Жардам билдирүүсү"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Ырастоо"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Кайталоо"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Манжа изинин сенсорун басыңыз"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Манжа изинин сүрөтчөсү"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Жүзүңүз изделүүдө…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Аудио"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Гарнитура"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Киргизүү"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Угуу аппараттары"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Күйгүзүлүүдө…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Жарыктыгы"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Автоматтык бурулуу"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Адатта мындай эскертмелерди өткөрүп жибересиз. \nАлар көрсөтүлө берсинби?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Бул эскертмелер көрсөтүлө берсинби?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Эскертмелерди токтотуу"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Бөгөттөө"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Көрсөтүлө берсин"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Кичирейтүү"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Үнсүз көрсөтүү"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Үнү чыкпасын"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Мага кабар берилсин"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Кабар бериле берсин"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Бул колдонмонун эскертмелери көрсөтүлө берсинби?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Бул эскертмелерди өчүрүүгө болбойт"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> аркылуу"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Жөндөөлөр"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Түшүндүм"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> колдонмо</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> колдонмо</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> төмөнкүлөрдү колдонуп жатат: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Колдонмолор төмөнкүлөрдү пайдаланып жатышат: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Жок"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="TYPE_5">%2$s</xliff:g> <xliff:g id="NUM_APPS_4">%1$d</xliff:g> колдонмо аркылуу пайдаланылууда.</item>
+      <item quantity="one"><xliff:g id="TYPE_1">%2$s</xliff:g> <xliff:g id="NUM_APPS_0">%1$d</xliff:g> колдонмо аркылуу пайдаланылууда.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Кеңири маалымат"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"<xliff:g id="TYPES_LIST">%s</xliff:g> программаларын пайдаланып жаткан колдонмо"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"<xliff:g id="TYPES_LIST">%s</xliff:g> программаларын пайдаланып жаткан колдонмолор"</string>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index a4ffffb..4472fc5 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"ອະນຸຍາດການດີບັ໊ກຜ່ານ USB?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"ລາຍນິ້ມື RSA ຂອງຄອມພິວເຕີແມ່ນ:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"ອະນຸຍາດຈາກຄອມພິວເຕີນີ້ຕະຫຼອດ"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"ບໍ່​ອະ​ນຸ​ຍາດ​ໃຫ້​ມີ​ການ​ແກ້​ໄຂ​ບັນ​ຫາ USB"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ຜູ້ໃຊ້ທີ່ກຳລັງເຂົ້າສູ່ລະບົບອຸປະກອນຢູ່ໃນຕອນນີ້ບໍ່ສາມາດເປີດໃຊ້ການດີບັກ USB ໄດ້. ເພື່ອໃຊ້ຄຸນສົມບັດນີ້, ໃຫ້ສະຫຼັບໄປໃຊ້ຜູ້ໃຊ້ຫຼັກ."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"ຊູມໃຫ້ເຕັມໜ້າຈໍ"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"ປັບໃຫ້ເຕັມໜ້າຈໍ"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"ພາບໜ້າຈໍ"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"ຍົກເລີກ"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"ຊ່ວຍພື້ນທີ່ຂໍ້ຄວາມ"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"ຢືນຢັນ"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ລອງໃໝ່"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ໄອຄອນລາຍນິ້ວມື"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ກຳລັງຊອກຫາທ່ານ…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ສຽງ"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ຊຸດຫູຟັງ"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ການປ້ອນຂໍ້ມູນ"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"ເຄື່ອງຊ່ວຍຟັງ"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ກຳລັງເປີດ..."</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"ຄວາມສະຫວ່າງ"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"ໝຸນ​ອັດ​ຕະ​ໂນ​ມັດ"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"ໂດຍປົກກະຕິທ່ານປິດການແຈ້ງເຕືອນເຫຼົ່ານີ້ໄວ້. \nສືບຕໍ່ສະແດງພວກມັນບໍ?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"ສະແດງການແຈ້ງເຕືອນເຫຼົ່ານີ້ຕໍ່ໄປບໍ?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"ຢຸດການແຈ້ງເຕືອນ"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"ບລັອກ"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"ສະແດງຕໍ່ໄປ"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"ຫຍໍ້"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"ສະແດງແບບງຽບໆ"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"ສືບຕໍ່ມິດງຽບ"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"ແຈ້ງເຕືອນຂ້ອຍ"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"ສືບຕໍ່ແຈ້ງເຕືອນ"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"ສະແດງການແຈ້ງເຕືອນຈາກແອັບນີ້ຕໍ່ໄປບໍ?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"ບໍ່ສາມາດປິດການແຈ້ງເຕືອນເຫຼົ່ານີ້ໄດ້"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"ຜ່ານ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"ການຕັ້ງຄ່າ"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"ເຂົ້າໃຈແລ້ວ"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ແອັບ</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> ແອັບ</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> ກຳລັງໃຊ້ <xliff:g id="TYPES_LIST">%2$s</xliff:g> ຂອງທ່ານ."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"ແອັບພລິເຄຊັນກຳລັງໃຊ້ <xliff:g id="TYPES_LIST">%s</xliff:g> ຂອງທ່ານ."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"ຍົກເລີກ"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ແອັບພລິເຄຊັນກຳລັງໃຊ້ <xliff:g id="TYPE_5">%2$s</xliff:g> ຂອງທ່ານຢູ່.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> ແອັບພລິເຄຊັນກຳລັງໃຊ້ <xliff:g id="TYPE_1">%2$s</xliff:g> ຂອງທ່ານຢູ່.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"ເບິ່ງລາຍລະອຽດ"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"ແອັບກຳລັງໃຊ້ <xliff:g id="TYPES_LIST">%s</xliff:g> ຂອງທ່ານ"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"ແອັບກຳລັງໃຊ້ <xliff:g id="TYPES_LIST">%s</xliff:g> ຂອງທ່ານ"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 5786fb0..a99df69 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Leisti USB derinimą?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Šio kompiuterio RSA rakto piršto antspaudas yra:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Visada leisti iš šio kompiuterio"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB derinimas neleidžiamas"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Šiuo metu prie įrenginio prisijungęs naudotojas negali įjungti USB derinimo. Kad galėtumėte naudoti šią funkciją, perjunkite į pagrindinį naudotoją."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Keisti mast., kad atit. ekr."</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Ištempti, kad atit. ekr."</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Ekrano kopija"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Atšaukti"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Pagalbos pranešimo sritis"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Patvirtinkite"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Bandyti dar kartą"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Palieskite piršto antspaudo jutiklį"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Piršto antspaudo piktograma"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Ieškoma jūsų…"</string>
@@ -298,8 +303,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Garsas"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Virtualiosios realybės įrenginys"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Įvestis"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Klausos aparatai"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Įjungiama…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Šviesumas"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatinis pasukimas"</string>
@@ -617,17 +621,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Paprastai šių pranešimų atsisakote. \nToliau juos rodyti?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Toliau rodyti šiuos pranešimus?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Sustabdyti pranešimus"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Blokuoti"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Toliau rodyti"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Sumažinti"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Rodyti tyliai"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Neskambėti"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Įspėti mane"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Toliau įspėti"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Toliau rodyti iš šios programos gautus pranešimus?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Šių pranešimų negalima išjungti"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"naudojant „<xliff:g id="APP_NAME">%1$s</xliff:g>“"</string>
@@ -881,11 +881,22 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Nustatymai"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Supratau"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Pat. „SysUI“ krūvą"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> programa</item>
+      <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> programos</item>
+      <item quantity="many"><xliff:g id="NUM_APPS_2">%d</xliff:g> programos</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> programų</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Programa „<xliff:g id="APP">%1$s</xliff:g>“ naudoja: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Programos naudoja: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Atšaukti"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> programa naudoja jūsų <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="few"><xliff:g id="NUM_APPS_2">%1$d</xliff:g> programos naudoja jūsų <xliff:g id="TYPE_3">%2$s</xliff:g>.</item>
+      <item quantity="many"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> programos naudoja jūsų <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> programų naudoja jūsų <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Žr. išsam. inf."</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Programa, kuri naudoja: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Programos, kurios naudoja: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index cebd91c..250920d 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Vai atļaut USB atkļūdošanu?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Datora RSA atslēgas ciparfails: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Vienmēr atļaut no šī datora"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB atkļūdošana nav atļauta"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Lietotājs, kurš pašlaik ir pierakstījies šajā ierīcē, nevar iespējot USB atkļūdošanu. Lai izmantotu šo funkciju, pārslēdzieties uz galveno lietotāju."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Tālumm., lai aizp. ekr."</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Stiepiet, lai aizp. ekr."</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Ekrānuzņēmums"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Atcelt"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Palīdzības ziņojuma apgabals"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Apstiprināt"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Mēģināt vēlreiz"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Pieskarieties pirksta nospieduma sensoram"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Pirksta nospieduma ikona"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Notiek jūsu sejas meklēšana…"</string>
@@ -297,8 +302,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Austiņas"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Ievade"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Dzirdes aparāti"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Notiek ieslēgšana…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Spilgtums"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automātiska pagriešana"</string>
@@ -614,17 +618,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Parasti jūs noraidāt šādus paziņojumus. \nVai turpināt tos rādīt?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Vai turpināt rādīt šos paziņojumus?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Apturēt paziņojumu rādīšanu"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Bloķēt"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Turpināt rādīt"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimizēt"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Rādīt bez skaņas signāla"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Neslēgt skaļumu"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Brīdināt mani"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Turpināt paziņošanu"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Vai turpināt rādīt paziņojumus no šīs lietotnes?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Šos paziņojumus nevar izslēgt."</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"lietotnē <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -876,11 +876,20 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Iestatījumi"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Labi"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="zero"><xliff:g id="NUM_APPS_2">%d</xliff:g> lietotņu</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> lietotne</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> lietotnes</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Lietotne <xliff:g id="APP">%1$s</xliff:g> izmanto funkcijas <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Lietojumprogrammas izmanto šādas funkcijas: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Atcelt"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="zero"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> lietojumprogrammās tiek izmantots: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> lietojumprogrammā tiek izmantots: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> lietojumprogrammās tiek izmantots: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Skatīt detalizētu informāciju"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Lietotne, kurā tiek izmantots: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Lietotnes, kurās tiek izmantots: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index df1bdbb..49a7655 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Овозможи отстранување грешки на USB?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Клучниот отпечаток на RSA на компјутерот е:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Секогаш дозволувај од овој компјутер"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Отстранувањето грешки на USB не е дозволено"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Корисникот што моментално е најавен на уредов не може да вклучи отстранување грешки на USB. За да ја користите функцијава, префрлете се на примарниот корисник."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Зумирај да се исполни екранот"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Растегни да се исполни екранот"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Слика од екранот"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Откажи"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Област за пораки за помош"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Потврди"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Обиди се повторно"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Допрете го сензорот за отпечатоци"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Икона за отпечатоци"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Ве бараме вас…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Аудио"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Слушалки"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Влез"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Слушни помагала"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Се вклучува…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Осветленост"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Автоматско ротирање"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Обично ги отфрлате известувањава. \nДа продолжат да се прикажуваат?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Дали да продолжат да се прикажуваат известувањава?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Запри ги известувањата"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Блокирај"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Продолжи да ги прикажуваш"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Минимизирај"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Прикажи тивко"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Продолжи со безгласно прикажување"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Предупреди ме"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Продолжи да ме предупредуваш"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Дали да продолжат да се прикажуваат известувања од апликацијава?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Известувањава не може да се исклучат"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"преку <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Поставки"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Сфатив"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Извади SysUI-слика"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> апликација</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> апликации</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> користи <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Апликациите користат <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Откажи"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one"><xliff:g id="TYPE_5">%2$s</xliff:g> се користи од <xliff:g id="NUM_APPS_4">%1$d</xliff:g> апликација.</item>
+      <item quantity="other"><xliff:g id="TYPE_5">%2$s</xliff:g> се користи од <xliff:g id="NUM_APPS_4">%1$d</xliff:g> апликации.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Прикажи ги деталите"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Апликации што ја користат вашата <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Апликации што ја користат вашата <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 5800e0e..ba93974 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"USB ഡീബഗ്ഗിംഗ് അനുവദിക്കണോ?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"ഈ കമ്പ്യൂട്ടറിന്റെ RSA കീ ഫിംഗർപ്രിന്റ് ഇതാണ്:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"ഈ കമ്പ്യൂട്ടറിൽ നിന്ന് എല്ലായ്പ്പോഴും അനുവദിക്കുക"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB ഡീബഗ്ഗിംഗ് അനുവദനീയമല്ല"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ഉപകരണത്തിൽ ഇപ്പോൾ സൈൻ ഇൻ ചെയ്‌തിരിക്കുന്ന ഉപയോക്താവിന് USB ഡീബഗ്ഗിംഗ് ഓണാക്കാനാകില്ല. ഈ ഫീച്ചർ ഉപയോഗിക്കാൻ പ്രാഥമിക ഉപയോക്താവിലേക്ക് മാറുക."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"സ്‌ക്രീനിൽ ഉൾക്കൊള്ളിക്കാൻ സൂം ചെയ്യുക"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"സ്‌ക്രീനിൽ ഉൾക്കൊള്ളിക്കാൻ വലിച്ചുനീട്ടുക"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"സ്‌ക്രീൻഷോട്ട്"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"റദ്ദാക്കുക"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"സഹായ സന്ദേശ ഏരിയ"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"സ്ഥിരീകരിക്കുക"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"വീണ്ടും ശ്രമിക്കുക"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"വിരലടയാള സെൻസർ സ്‌പർശിക്കുക"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"വിരലടയാള ഐക്കൺ"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"നിങ്ങൾക്കായി തിരയുന്നു…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ഓഡിയോ"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ഹെഡ്‌സെറ്റ്"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ഇൻപുട്ട്"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"ശ്രവണ സഹായികൾ"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ഓണാക്കുന്നു…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"തെളിച്ചം"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"സ്‌ക്രീൻ സ്വമേധയാ തിരിയുക"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"സാധാരണയായി നിങ്ങൾ ഈ അറിയിപ്പുകൾ നിരാകരിക്കുന്നു. \nഅവ തുടർന്നും കാണിക്കണോ?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"ഈ അറിയിപ്പുകൾ തുടർന്നും കാണിക്കണോ?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"അറിയിപ്പുകൾ നിർത്തുക"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"ബ്ലോക്ക് ചെയ്യുക"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"തുടർന്നും കാണിക്കുക"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"ചെറുതാക്കുക‍"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"നിശബ്‌ദമായി കാണിക്കുക"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"നിശബ്‌ദമായ നിലയിൽ തുടരുക"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"എനിക്ക് അലേർട്ട് നൽകുക"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"മുന്നറിയിപ്പ് നൽകുന്നത് തുടരുക"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"ഈ ആപ്പിൽ നിന്നുള്ള അറിയിപ്പുകൾ തുടർന്നും കാണിക്കണോ?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"ഈ അറിയിപ്പുകൾ ഓഫാക്കാനാവില്ല"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> വഴി"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"ക്രമീകരണം"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"മനസ്സിലായി"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI ഹീപ്പ് ഡമ്പ് ചെയ്യുക"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ആപ്പുകൾ</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> ആപ്പ്</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> നിങ്ങളുടെ <xliff:g id="TYPES_LIST">%2$s</xliff:g> ഉപയോഗിക്കുന്നു."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"ആപ്പുകൾ നിങ്ങളുടെ <xliff:g id="TYPES_LIST">%s</xliff:g> ഉപയോഗിക്കുന്നു."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"റദ്ദാക്കുക"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ആപ്പുകൾ നിങ്ങളുടെ <xliff:g id="TYPE_5">%2$s</xliff:g> ഉപയോഗിക്കുന്നു.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> ആപ്പ് നിങ്ങളുടെ <xliff:g id="TYPE_1">%2$s</xliff:g> ഉപയോഗിക്കുന്നു.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"വിശദാംശങ്ങൾ കാണുക"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"നിങ്ങളുടെ <xliff:g id="TYPES_LIST">%s</xliff:g> ഉപയോഗിക്കുന്ന ആപ്പ്"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"നിങ്ങളുടെ <xliff:g id="TYPES_LIST">%s</xliff:g> ഉപയോഗിക്കുന്ന ആപ്പുകൾ"</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index e96865e..e19cb2b 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"USB дебаг хийхийг зөвшөөрөх үү?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Компьютерийн RSA түлхүүрийн хурууны хээ :\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Энэ компьютерээс орохыг байнга зөвшөөрөх"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB алдаа засалт хийх боломжгүй"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Энэ төхөөрөмжид нэвтэрсэн хэрэглэгч USB дебаг хийх онцлогийг асаах боломжгүй байна. Энэ онцлогийг ашиглахын тулд үндсэн хэрэглэгч рүү сэлгэнэ үү."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Дэлгэц дүүргэх бол өсгөнө үү"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Дэлгэц дүүргэх бол татна уу"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Дэлгэцийн зураг дарах"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Цуцлах"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Тусламжийн зурвасын хэсэг"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Баталгаажуулах"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Дахин оролдох"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Хурууны хээ мэдрэгчид хүрэх"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Хурууны хээний дүрс тэмдэг"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Таныг хайж байна…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Аудио"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Чихэвч"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Оролт"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Сонсголын төхөөрөмж"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Асааж байна…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Тодрол"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Автоматаар эргэх"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Та эдгээр мэдэгдлийг ихэвчлэн хаадаг. \nЭдгээрийг харуулсан хэвээр байх уу?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Эдгээр мэдэгдлийг харуулсан хэвээр байх уу?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Мэдэгдлийг зогсоох"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Блоклох"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Харуулсан хэвээр байх"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Багасгах"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Дуугүй харуулах"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Чимээгүй хэвээр харуулах"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Надад сануулах"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Үргэлжлүүлэн сануулах"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Энэ аппаас мэдэгдэл харуулсан хэвээр байх уу?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Эдгээр мэдэгдлийг унтраах боломжгүй"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g>-р"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Тохиргоо"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Ойлголоо"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> апп</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> апп</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> таны <xliff:g id="TYPES_LIST">%2$s</xliff:g>-г ашиглаж байна."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Аппууд таны <xliff:g id="TYPES_LIST">%s</xliff:g>-г ашиглаж байна."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Болих"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other">Таны <xliff:g id="TYPE_5">%2$s</xliff:g>-г <xliff:g id="NUM_APPS_4">%1$d</xliff:g> апп ашиглаж байна.</item>
+      <item quantity="one">Таны <xliff:g id="TYPE_1">%2$s</xliff:g>-г <xliff:g id="NUM_APPS_0">%1$d</xliff:g> апп ашиглаж байна.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Дэлгэрэнгүй үзэх"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Апп таны <xliff:g id="TYPES_LIST">%s</xliff:g>-г ашиглаж байна"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Аппууд таны <xliff:g id="TYPES_LIST">%s</xliff:g>-г ашиглаж байна"</string>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 6022a9c..71e0e3c 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"USB डीबग करण्यास अनुमती द्यायची?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"संगणकाची RSA की फिंगरप्रिंट ही आहे:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"या संगणकावरून नेहमी अनुमती द्या"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB डीबग करण्‍यास अनुमती नाही"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"सध्‍या या डीव्हाइसमध्‍ये साइन इन केलेला वापरकर्ता USB डीबग करणे चालू करू शकत नाही. हे वैशिष्‍ट्य वापरण्‍यासाठी, प्राथमिक वापरकर्त्‍यावर स्विच करा."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"स्क्रीन भरण्यासाठी झूम करा"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"स्क्रीन भरण्यासाठी ताणा"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"स्क्रीनशॉट"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"रद्द करा"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"मदत मेसेज परिसर"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"खात्री करा"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"पुन्हा प्रयत्न करा"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"फिंगरप्रिंट सेन्सरला स्पर्श करा"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"फिंगरप्रिंट आयकन"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"तुमच्यासाठी शोधत आहे…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ऑडिओ"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"हेडसेट"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"इनपुट"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"श्रवण यंत्रे"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"सुरू करत आहे…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"चमक"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"ऑटो-रोटेट"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"तुम्ही या सूचना सामान्यतः डिसमिस करता. \nते दाखवत राहायचे?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"या सूचना दाखवणे सुरू ठेवायचे?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"सूचना थांबवा"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"ब्लॉक करा"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"दाखवणे सुरू ठेवा"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"लहान करा"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"शांतपणे दर्शवा"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"सायलंट रहा"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"मला अ‍ॅलर्ट करा"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"सूचना देत रहा"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"या अ‍ॅपकडील सूचना दाखवणे सुरू ठेवायचे?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"या सूचना बंद करता येत नाहीत"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> मार्गे"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"सेटिंग्ज"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"समजले"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI हीप डंप करा"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> अ‍ॅप</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> अ‍ॅप्स</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> तुमचे <xliff:g id="TYPES_LIST">%2$s</xliff:g> वापरत आहे."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"अॅप्लिकेशन्स तुमचे <xliff:g id="TYPES_LIST">%s</xliff:g> वापरत आहे."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"रद्द करा"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> अॅप्लिकेशन तुमचे <xliff:g id="TYPE_5">%2$s</xliff:g> वापरत आहे.</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> अॅप्लिकेशन तुमचे <xliff:g id="TYPE_5">%2$s</xliff:g> वापरत आहेत.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"तपशील पाहा"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"अ‍ॅप तुमचे <xliff:g id="TYPES_LIST">%s</xliff:g> वापरत आहे"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"अॅप्स तुमचे <xliff:g id="TYPES_LIST">%s</xliff:g> वापरत आहेत"</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 1a9eb1c..1b7cc7c 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Benarkan penyahpepijatan USB?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Cap jari kekunci RSA komputer ialah:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Sentiasa benarkan komputer ini"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Penyahpepijatan USB tidak dibenarkan"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Pengguna yang log masuk ke peranti ini pada masa ini tidak boleh menghidupkan penyahpepijatan USB. Untuk menggunakan ciri ini, tukar kepada pengguna utama."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Zum untuk memenuhi skrin"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Regang utk memenuhi skrin"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Tangkapan skrin"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Batal"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Bahagian mesej bantuan"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Sahkan"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Cuba lagi"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Sentuh penderia cap jari"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon cap jari"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Mencari anda…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Set Kepala"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Input"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Alat Bantu Dengar"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Menghidupkan…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Kecerahan"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Autoputar"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Biasanya anda mengetepikan pemberitahuan ini. \nTerus tunjukkan pemberitahuan?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Terus tunjukkan pemberitahuan ini?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Hentikan pemberitahuan"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Sekat"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Terus tunjukkan"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimumkan"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Tunjukkan secara senyap"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Kekal senyap"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Maklumi saya"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Teruskan memberikan makluman"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Terus tunjukkan pemberitahuan daripada apl ini?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Pemberitahuan ini tidak boleh dimatikan"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"melalui <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Tetapan"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Longgok Tmbunn SysUI"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apl</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> apl</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> sedang menggunakan <xliff:g id="TYPES_LIST">%2$s</xliff:g> anda."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikasi sedang menggunakan <xliff:g id="TYPES_LIST">%s</xliff:g> anda."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Batal"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikasi sedang menggunakan <xliff:g id="TYPE_5">%2$s</xliff:g> anda.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplikasi sedang menggunakan <xliff:g id="TYPE_1">%2$s</xliff:g> anda.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Lihat butiran"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Apl yang menggunakan <xliff:g id="TYPES_LIST">%s</xliff:g> anda"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apl yang menggunakan <xliff:g id="TYPES_LIST">%s</xliff:g> anda"</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index dbfa01e..b5cd82e 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"USB အမှားရှာဖွေပြင်ဆင်ခြင်း ခွင့်ပြုပါမည်လား?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"ဒီကွန်ပျူတာရဲ့ RSA key fingerprint ကတော့:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g> ဖြစ်ပါသည်"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"ဒီကွန်ပျူတာမှ အမြဲခွင့်ပြုရန်"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB အမှားပြင်ဆင်ခြင်း ခွင့်မပြုပါ"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ဤစက်ပစ္စည်းသို့ လက်ရှိဝင်ရောက်ထားသည့် အသုံးပြုသူသည် USB အမှားပြင်ဆင်ခြင်းကို ဖွင့်၍မရပါ။ ဤဝန်ဆောင်မှုကို အသုံးပြုရန် အဓိကအသုံးပြုသူအဖြစ်သို့ ပြောင်းပါ။"</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"ဇူးမ်အပြည့်ဆွဲခြင်း"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"ဖန်သားပြင်အပြည့်ဆန့်ခြင်း"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"ဖန်သားပြင်ဓာတ်ပုံ"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"မလုပ်တော့"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"အကူအညီမက်ဆေ့ဂျ် နေရာ"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"အတည်ပြုပါ"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ထပ်စမ်းကြည့်ရန်"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"လက်ဗွေအာရုံခံကိရိယာကို တို့ပါ"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"လက်ဗွေ သင်္ကေတ"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"သင့်ကို ရှာဖွေနေသည်…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"အသံ"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"မိုက်ခွက်ပါနားကြပ်"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"အဝင်"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"နားကြားကိရိယာ"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ဖွင့်နေသည်…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"အလင်းတောက်ပမှု"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"အော်တို-လည်"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"သင်သည် အများအားဖြင့် ဤအကြောင်းကြားချက်များကို ပယ်လေ့ရှိပါသည်။ \n၎င်းတို့ကို ဆက်လက်ပြသလိုပါသလား။"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"ဤအကြောင်းကြားချက်များကို ဆက်ပြလိုပါသလား။"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"အကြောင်းကြားချက်များကို ရပ်ရန်"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"ပိတ်ထားရန်"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"ဆက်ပြရန်"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"ချုံ့ရန်"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"တိတ်တဆိတ် ပြရန်"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"ဆက်လက် အသံတိတ်ရန်"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"ကျွန်ုပ်ကို သတိပေးရန်"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"ဆက်လက် သတိပေးရန်"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"ဤအက်ပ်ထံမှ အကြောင်းကြားချက်များကို ဆက်ပြလိုပါသလား။"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"ဤအကြောင်းကြားချက်များကို ပိတ်၍မရပါ"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> မှတစ်ဆင့်"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"ဆက်တင်များ"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"ရပါပြီ"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other">အက်ပ် <xliff:g id="NUM_APPS_2">%d</xliff:g> ခု</item>
+      <item quantity="one">အက်ပ် <xliff:g id="NUM_APPS_0">%d</xliff:g> ခု</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> က သင်၏ <xliff:g id="TYPES_LIST">%2$s</xliff:g> ကို အသုံးပြုနေသည်။"</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"အပလီကေးရှင်းများက သင်၏ <xliff:g id="TYPES_LIST">%s</xliff:g> ကို အသုံးပြုနေသည်။"</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"မလုပ်တော့"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other">အပလီကေးရှင်း <xliff:g id="NUM_APPS_4">%1$d</xliff:g> ခုက သင်၏ <xliff:g id="TYPE_5">%2$s</xliff:g> ကို အသုံးပြုနေသည်။</item>
+      <item quantity="one">အပလီကေးရှင်း <xliff:g id="NUM_APPS_0">%1$d</xliff:g> ခုက သင်၏ <xliff:g id="TYPE_1">%2$s</xliff:g> ကို အသုံးပြုနေသည်။</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"အသေးစိတ်ကြည့်ပါ"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"သင့် <xliff:g id="TYPES_LIST">%s</xliff:g> ကို အသုံးပြုနေသော အက်ပ်"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"သင့် <xliff:g id="TYPES_LIST">%s</xliff:g> ကို အသုံးပြုနေသော အက်ပ်များ"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index e790684..83a1ad9 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Vil du tillate USB-feilsøking?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Datamaskinens nøkkelfingeravtrykk for RSA er:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Tillat alltid fra denne datamaskinen"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-feilsøking er ikke tillatt"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Brukeren som for øyeblikket er logget på denne enheten, kan ikke slå på USB-feilsøking. For å bruke denne funksjonen, bytt til hovedbrukeren."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Zoom for å fylle skjermen"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Strekk for å fylle skjerm"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Skjermdump"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Avbryt"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Område for hjelpemelding"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bekreft"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Prøv på nytt"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Trykk på fingeravtrykkssensoren"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon for fingeravtrykk"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Ser etter deg …"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Lyd"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Hodetelefoner"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Innenhet"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Høreapparater"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Slår på …"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Lysstyrke"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotér automatisk"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Du avviser vanligvis disse varslene. \nVil du fortsette å vise dem?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Vil du fortsette å vise disse varslene?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Stopp varsler"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Blokkér"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Fortsett å vise"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimer"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Vis uten lyd"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Forbli lydløs"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Varsle meg"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Fortsett å varsle"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Vil du fortsette å vise varsler fra denne appen?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Du kan ikke slå av disse varslene"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Innstillinger"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Greit"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI-heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apper</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> bruker <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Apper bruker <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Avbryt"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> apper bruker <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> app bruker <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Se detaljer"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App som bruker <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apper som bruker <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index 9b4441f..8ebb22e 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"USB डिबग गर्नको लागि अनुमति दिने हो?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"कम्प्युटरको RSA कुञ्जी औंलाछाप:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"यो कम्प्युटरबाट सधैँ अनुमति दिनुहोस्"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB डिबग गर्न अनुमति छैन"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"हाल यस यन्त्रमा साइन इन हुनुभएको प्रयोगकर्ताले USB डिबग सक्रिय गर्न सक्नुहुन्न। यो सुविधाको प्रयोग गर्न प्राथमिक प्रयोगकर्तामा बदल्नुहोस्‌।"</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"स्क्रिन भर्न जुम गर्नुहोस्"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"स्क्रिन भर्न तन्काउनुहोस्"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"स्क्रिनसट"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"रद्द गर्नुहोस्"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"मद्दतसम्बन्धी सन्देशको क्षेत्र"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"पुष्टि गर्नुहोस्"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"फेरि प्रयास गर्नुहोस्"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"फिंगरप्रिन्ट सेन्सरमा छुनुहोस्‌"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"फिंगरप्रिन्ट जनाउने आइकन"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"तपाईंलाई खोज्दै…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"अडियो"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"हेडसेट"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"इनपुट"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"श्रवण यन्त्रहरू"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"सक्रिय गर्दै…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"चमक"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"स्वतःघुम्ने"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"तपाईं सामान्यतया यी सूचनाहरूलाई खारेज गर्ने गर्नुहुन्छ। \nतिनलाई देखाइरहने हो?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"यी सूचनाहरू देखाउने क्रम जारी राख्ने हो?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"सूचनाहरू देखाउन छाड्नुहोस्"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"रोक लगाउनुहोस्"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"देखाउने क्रम जारी राख्नुहोस्"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"सानो बनाउनुहोस्"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"मौन रूपमा देखाउने"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"मौन रहनुहोस्"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"मलाई सतर्क गराउनुहोस्"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"सर्तक गराइरहनुहोस्"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"यो अनुप्रयोगका सूचनाहरू देखाउने क्रम जारी राख्ने हो?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"यी सूचनाहरूलाई निष्क्रिय पार्न सकिँदैन"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> मार्फत"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"सेटिङहरू"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"बुझेँ"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> अनुप्रयोगहरू</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> अनुप्रयोग</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> ले तपाईंको <xliff:g id="TYPES_LIST">%2$s</xliff:g> प्रयोग गर्दै छ।"</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"अनुप्रयोगहरूले तपाईंको <xliff:g id="TYPES_LIST">%s</xliff:g> प्रयोग गर्दै छन्‌।"</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"रद्द गर्नु…"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> अनुप्रयोगहरूले तपाईंको <xliff:g id="TYPE_5">%2$s</xliff:g> प्रयोग गरिरहेका छन्।</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> अनुप्रयोगले तपाईंको <xliff:g id="TYPE_1">%2$s</xliff:g> प्रयोग गरिरहेको छ।</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"विवरणहरू हेर्नुहोस्"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"तपाईंको <xliff:g id="TYPES_LIST">%s</xliff:g> प्रयोग गरिरहेका अनुप्रयोग"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"तपाईंको <xliff:g id="TYPES_LIST">%s</xliff:g> प्रयोग गरिरहेका अनुप्रयोगहरू"</string>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index e570789..f28e206 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"USB-foutopsporing toestaan?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"De vingerafdruk voor de RSA-sleutel van de computer is:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Altijd toestaan vanaf deze computer"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-foutopsporing niet toegestaan"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"De gebruiker die momenteel is ingelogd op dit apparaat, kan USB-foutopsporing niet inschakelen. Als je deze functie wilt gebruiken, schakel je naar de primaire gebruiker."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Zoom om scherm te vullen"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Rek uit v. schermvulling"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Annuleren"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Gebied voor Help-berichten"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bevestigen"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Opnieuw proberen"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Raak de vingerafdruksensor aan"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Vingerafdrukpictogram"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Jouw gezicht zoeken…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Invoer"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Gehoorapparaten"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Inschakelen..."</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Helderheid"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatisch draaien"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Meestal sluit je deze meldingen. \nWil je ze blijven weergeven?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Deze meldingen blijven weergeven?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Meldingen stoppen"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Blokkeren"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Blijven weergeven"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimaliseren"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Zonder geluid weergeven"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Stil blijven"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Mij waarschuwen"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Blijven waarschuwen"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Meldingen van deze app blijven weergeven?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Deze meldingen kunnen niet worden uitgeschakeld"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Instellingen"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> gebruikt je <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Apps gebruiken je <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Annuleren"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> apps gebruiken je <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> app gebruikt je <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Details weergeven"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App die je <xliff:g id="TYPES_LIST">%s</xliff:g> gebruikt"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps die je <xliff:g id="TYPES_LIST">%s</xliff:g> gebruiken"</string>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index dd260b1..07cd18f 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"USB ଡିବଗିଙ୍ଗ କରିବେ?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"କମ୍ପ୍ୟୁଟର୍‌ର RSA କୀ\' ଆଙ୍ଗୁଠି ଚିହ୍ନ ହେଉଛି:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"ସବୁବେଳେ ଏହି କମ୍ପ୍ୟୁଟର୍‌ରୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USBରେ ଡିବଗ୍‍ କରାଯାଇପାରିବ ନାହିଁ"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ସମ୍ପ୍ରତି ସାଇନ୍‍-ଇନ୍‍ କରିଥିବା ୟୁଜର୍‍ ଜଣକ ଏହି ଡିଭାଇସରେ USB ଡିବଗିଙ୍ଗ ଅନ୍‍ କରିପାରିବେ ନାହିଁ। ଏହି ବୈଶିଷ୍ଟ୍ୟ ବ୍ୟବହାର କରିବାକୁ, ପ୍ରାଥମିକ ୟୁଜର୍‍ରେ ସାଇନ୍‍-ଇନ୍‍ କରନ୍ତୁ।"</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"ସ୍କ୍ରୀନ ଭରିବା ପାଇଁ ଜୁମ୍ କରନ୍ତୁ"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"ସ୍କ୍ରୀନ୍‌କୁ ଭରିବା ପାଇଁ ଟାଣନ୍ତୁ"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"ସ୍କ୍ରୀନଶଟ୍‌"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"କ୍ୟାନ୍ସଲ୍‍ କରନ୍ତୁ"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"ସାହାଯ୍ୟ ମେସେଜ୍ କ୍ଷେତ୍ର"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"ନିଶ୍ଚିତ କରନ୍ତୁ"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ସେନସର୍‌କୁ ଛୁଅଁନ୍ତୁ"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ଆଇକନ୍"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ଆପଣଙ୍କୁ ଚିହ୍ନଟ କରୁଛି…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ଅଡିଓ"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ହେଡସେଟ୍‍"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ଇନପୁଟ୍"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"ଶ୍ରବଣ ଯନ୍ତ୍ର"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ଅନ୍ ହେଉଛି…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"ଉଜ୍ଜ୍ୱଳତା"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"ସ୍ୱତଃ-ଘୂର୍ଣ୍ଣନ"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"ସାଧାରଣତଃ ଆପଣ ଏହି ବିଜ୍ଞପ୍ତିକୁ ଖାରଜ କରିଦିଅନ୍ତି। \n ସେଗୁଡ଼ିକୁ ଦେଖାଇବା ଜାରି ରଖିବେ?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଦେଖାଇବା ଜାରି ରଖିବେ?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"ବିଜ୍ଞପ୍ତିକୁ ଦେଖାଇବା ବନ୍ଦ କରନ୍ତୁ"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"ବ୍ଲକ୍ କରନ୍ତୁ"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"ଦେଖାଇବା ଜାରି ରଖନ୍ତୁ"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"ଛୋଟ କରନ୍ତୁ"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"ନିରବରେ ଦେଖାନ୍ତୁ"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"ନୀରବ ରହନ୍ତୁ"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"ମୋତେ ଆଲର୍ଟ କରନ୍ତୁ"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"ଆଲର୍ଟ କରିବା ଜାରି ରଖନ୍ତୁ"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"ଏହି ଆପ୍‌ରୁ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଦେଖାଇବା ଜାରି ରଖିବେ?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ବନ୍ଦ କରିହେବ ନାହିଁ"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> ମାଧ୍ୟମରେ"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"ସେଟିଙ୍ଗ"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"ବୁଝିଲି"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI ହିପ୍ ଡମ୍ପ୍ କରନ୍ତୁ"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g>ଟି ଆପ୍ସ</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> ଆପ୍</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> ଆପଣଙ୍କ <xliff:g id="TYPES_LIST">%2$s</xliff:g> ବ୍ୟବହାର କରୁଛନ୍ତି।"</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"ଆପ୍ଲିକେସନ୍‍ଗୁଡିକ ଆପଣଙ୍କ <xliff:g id="TYPES_LIST">%s</xliff:g> ବ୍ୟବହାର କରୁଛନ୍ତି।"</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"ବାତିଲ୍‌"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g>ଟି ଆପ୍ଲିକେସନ୍ ଆପଣଙ୍କର <xliff:g id="TYPE_5">%2$s</xliff:g> ବ୍ୟବହାର କରୁଛନ୍ତି।</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g>ଟି ଆପ୍ଲିକେସନ୍ ଆପଣଙ୍କର <xliff:g id="TYPE_1">%2$s</xliff:g>ବ୍ୟବହାର କରୁଛନ୍ତି।</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"ବିବରଣୀ ଦେଖନ୍ତୁ"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"ଆପ୍‍ ଆପଣଙ୍କ <xliff:g id="TYPES_LIST">%s</xliff:g> ବ୍ୟବହାର କରୁଛି"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"ଆପ୍ସ ଆପଣଙ୍କ <xliff:g id="TYPES_LIST">%s</xliff:g> ବ୍ୟବହାର କରୁଛନ୍ତି"</string>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index e36fea2..2b2a124 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"ਕੀ USB ਡੀਬਗਿੰਗ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"ਕੰਪਿਊਟਰ ਦਾ RSA ਕੁੰਜੀ ਫਿੰਗਰਪ੍ਰਿੰਟ \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"ਹਮੇਸ਼ਾਂ ਇਸ ਕੰਪਿਊਟਰ ਤੋਂ ਆਗਿਆ ਦਿਓ"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB ਡਿਬੱਗਿੰਗ ਦੀ ਆਗਿਆ ਨਹੀਂ"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"ਸਕ੍ਰੀਨ ਭਰਨ ਲਈ ਜ਼ੂਮ ਕਰੋ"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"ਸਕ੍ਰੀਨ ਭਰਨ ਲਈ ਸਟ੍ਰੈਚ ਕਰੋ"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"ਸਕ੍ਰੀਨਸ਼ਾਟ"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"ਰੱਦ ਕਰੋ"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"ਮਦਦ ਸੁਨੇਹਾ ਖੇਤਰ"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"ਪੁਸ਼ਟੀ ਕਰੋ"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਨੂੰ ਸਪੱਰਸ਼ ਕਰੋ"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਦਾ ਪ੍ਰਤੀਕ"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ਤੁਹਾਡੀ ਪਛਾਣ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ਆਡੀਓ"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ਹੈੱਡਸੈੱਟ"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ਇਨਪੁੱਟ"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"ਸੁਣਨ ਦੇ ਸਾਧਨ"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ਚਾਲੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"ਚਮਕ"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"ਆਟੋ-ਰੋਟੇਟ"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"ਤੁਸੀਂ ਇਹਨਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਆਮ ਤੌਰ \'ਤੇ ਖਾਰਜ ਕਰਦੇ ਹੋ। \nਕੀ ਇਹਨਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਦਿਖਾਉਣਾ ਜਾਰੀ ਰੱਖਣਾ ਹੈ?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"ਕੀ ਇਨ੍ਹਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਦਿਖਾਉਣਾ ਜਾਰੀ ਰੱਖਣਾ ਹੈ?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"ਸੂਚਨਾਵਾਂ ਬੰਦ ਕਰੋ"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"ਬਲਾਕ ਕਰੋ"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"ਦਿਖਾਉਣਾ ਜਾਰੀ ਰੱਖੋ"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"ਛੋਟਾ ਕਰੋ"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"ਚੁੱਪ-ਚਪੀਤੇ ਦਿਖਾਓ"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"ਚੁੱਪ ਰਹੋ"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"ਮੈਨੂੰ ਸੁਚੇਤ ਕਰੋ"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"ਸੁਚੇਤ ਰਖੋ"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"ਕੀ ਇਸ ਐਪ ਤੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਦਿਖਾਉਣਾ ਜਾਰੀ ਰੱਖਣਾ ਹੈ?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"ਇਨ੍ਹਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਬੰਦ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਰਾਹੀਂ"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"ਸੈਟਿੰਗਾਂ"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"ਸਮਝ ਲਿਆ"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI ਹੀਪ ਡੰਪ ਕਰੋ"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> ਐਪ</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ਐਪਾਂ</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> ਤੁਹਾਡੇ <xliff:g id="TYPES_LIST">%2$s</xliff:g> ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀ ਹੈ।"</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"ਐਪਲੀਕੇਸ਼ਨਾਂ ਤੁਹਾਡੇ <xliff:g id="TYPES_LIST">%s</xliff:g> ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀਆਂ ਹਨ।"</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"ਰੱਦ ਕਰੋ"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ਐਪਲੀਕੇਸ਼ਨ ਤੁਹਾਡੇ <xliff:g id="TYPE_5">%2$s</xliff:g> ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀ ਹੈ।</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ਐਪਲੀਕੇਸ਼ਨਾਂ ਤੁਹਾਡੇ <xliff:g id="TYPE_5">%2$s</xliff:g> ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀਆਂ ਹਨ।</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"ਵੇਰਵੇ ਦੇਖੋ"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"ਤੁਹਾਡੇ <xliff:g id="TYPES_LIST">%s</xliff:g> ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀ ਐਪ"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"ਤੁਹਾਡੇ <xliff:g id="TYPES_LIST">%s</xliff:g> ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀਆਂ ਐਪਾਂ"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index ed2902f..b5b6da4 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Zezwalać na debugowanie USB?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Odcisk cyfrowy klucza RSA komputera to:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Zawsze zezwalaj z tego komputera"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Debugowanie USB jest niedozwolone"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Użytkownik obecnie zalogowany na tym urządzeniu nie może włączyć debugowania USB. Aby użyć tej funkcji, przełącz się na użytkownika głównego."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Powiększ, aby wypełnić ekran"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Rozciągnij, aby wypełnić ekran"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Zrzut ekranu"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Anuluj"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Obszar komunikatu pomocy"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potwierdź"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Spróbuj jeszcze raz"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dotknij czytnika linii papilarnych"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona odcisku palca"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Szukam Cię…"</string>
@@ -298,8 +303,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Dźwięk"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Zestaw słuchawkowy"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Wejście"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Aparaty słuchowe"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Włączam…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Jasność"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Autoobracanie"</string>
@@ -617,17 +621,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Zwykle odrzucasz te powiadomienia. \nNadal je pokazywać?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Nadal pokazywać te powiadomienia?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Zablokuj powiadomienia"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Zablokuj"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Pokazuj nadal"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimalizuj"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Pokazuj dyskretnie"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Zachowaj wyciszenie"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Powiadom mnie"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Powiadamiaj dalej"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Nadal pokazywać powiadomienia z tej aplikacji?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Tych powiadomień nie można wyłączyć"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"przez aplikację <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -881,11 +881,22 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Ustawienia"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Zrzut stosu SysUI"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> aplikacje</item>
+      <item quantity="many"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacji</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacji</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplikacja</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Aplikacja <xliff:g id="APP">%1$s</xliff:g> używa: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikacje używają: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Anuluj"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="few"><xliff:g id="NUM_APPS_2">%1$d</xliff:g> aplikacje używają: <xliff:g id="TYPE_3">%2$s</xliff:g>.</item>
+      <item quantity="many"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacji używa: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacji używa: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplikacja używa: <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Wyświetl szczegóły"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplikacje, które używają: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplikacje, które używają: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index ac69917..bc73403 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Permitir a depuração USB?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"A impressão digital da chave RSA deste computador é:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Sempre permitir a partir deste computador"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Depuração USB não permitida"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"O usuário conectado a este dispositivo não pode ativar a depuração USB. Para usar esse recurso, mude para o usuário principal \"NAME\"."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Zoom p/ preencher a tela"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Ampliar p/ preencher tela"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Captura de tela"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Cancelar"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área da mensagem de ajuda"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Tentar novamente"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toque no sensor de impressão digital"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícone de impressão digital"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Procurando você…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Áudio"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Fone de ouvido"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrada"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Aparelhos auditivos"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Ativando…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brilho"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Girar automaticamente"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Geralmente você dispensa essas notificações. \nQuer que elas continuem a ser exibidas?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Continuar mostrando essas notificações?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Bloquear notificações"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Bloquear"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Continuar mostrando"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimizar"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Mostrar silenciosamente"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Continuar sem som"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Receber alerta"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Continuar alertando"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Continuar mostrando notificações desse app?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Não é possível desativar essas notificações"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"pelo <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Configurações"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Ok"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Despejar pilha SysUI"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> app</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"O app <xliff:g id="APP">%1$s</xliff:g> está usando <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplicativos estão usando <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancelar"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplicativo está usando <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplicativos estão usando <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Ver detalhes"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App usando <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps usando <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index c1858fc..d7ae161 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Permitir depuração USB?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"A impressão digital da chave RSA do computador é:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Permitir sempre a partir deste computador"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Depuração USB não permitida"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"O utilizador com sessão iniciada atualmente neste dispositivo não pode ativar a depuração USB. Para utilizar esta funcionalidade, mude para o utilizador principal."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Zoom para preencher o ecrã"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Esticar p. caber em ec. int."</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Captura de ecrã"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Cancelar"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área da mensagem de ajuda"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Tentar novamente"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toque no sensor de impressões digitais."</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícone de impressão digital"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"À sua procura…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Áudio"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Ausc. c/ mic. integ."</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrada"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Aparelhos auditivos"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"A ativar..."</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brilho"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotação automática"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Normalmente, ignora estas notificações. \nPretende continuar a mostrá-las?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Pretende continuar a ver estas notificações?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Parar notificações"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Bloquear"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Continuar a mostrar"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimizar"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Mostrar silenciosamente"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Continuar sem som"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Alertar-me"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Continuar a alertar"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Pretende continuar a ver notificações desta aplicação?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Não é possível desativar estas notificações."</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"através da aplicação <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Definições"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Compreendi"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Cp ár. di. da. SysUI"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplic.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplicação</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"A aplicação <xliff:g id="APP">%1$s</xliff:g> está a utilizar o(a) <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"As aplicações estão a utilizar o(a) <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancelar"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplicações estão a utilizar o(a) <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplicação está a utilizar o(a) <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Ver detalhes"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplicações que utilizam o(a) <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplicações que utilizam o(a) <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index ac69917..bc73403 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Permitir a depuração USB?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"A impressão digital da chave RSA deste computador é:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Sempre permitir a partir deste computador"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Depuração USB não permitida"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"O usuário conectado a este dispositivo não pode ativar a depuração USB. Para usar esse recurso, mude para o usuário principal \"NAME\"."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Zoom p/ preencher a tela"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Ampliar p/ preencher tela"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Captura de tela"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Cancelar"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área da mensagem de ajuda"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Tentar novamente"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toque no sensor de impressão digital"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícone de impressão digital"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Procurando você…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Áudio"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Fone de ouvido"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrada"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Aparelhos auditivos"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Ativando…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brilho"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Girar automaticamente"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Geralmente você dispensa essas notificações. \nQuer que elas continuem a ser exibidas?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Continuar mostrando essas notificações?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Bloquear notificações"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Bloquear"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Continuar mostrando"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimizar"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Mostrar silenciosamente"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Continuar sem som"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Receber alerta"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Continuar alertando"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Continuar mostrando notificações desse app?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Não é possível desativar essas notificações"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"pelo <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Configurações"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Ok"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Despejar pilha SysUI"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> app</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"O app <xliff:g id="APP">%1$s</xliff:g> está usando <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplicativos estão usando <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancelar"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplicativo está usando <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplicativos estão usando <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Ver detalhes"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App usando <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps usando <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index c393bde..268a406 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Permiteți remedierea erorilor prin USB?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Amprenta digitală din cheia RSA a computerului este:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Permiteți întotdeauna de pe acest computer"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Remedierea erorilor prin USB nu este permisă"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Utilizatorul conectat momentan pe acest dispozitiv nu poate activa remedierea erorilor prin USB. Pentru a folosi această funcție, comutați la utilizatorul principal."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Zoom pt. a umple ecranul"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Înt. pt. a umple ecranul"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Captură de ecran"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Anulați"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Zona mesajelor de ajutor"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmați"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Încercați din nou"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Atingeți senzorul de amprente"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Pictograma amprentă"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Vă căutăm…"</string>
@@ -297,8 +302,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Căști"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Intrare"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Aparate auditive"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Se activează..."</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Luminozitate"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotire automată"</string>
@@ -614,17 +618,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"De regulă respingeți aceste notificări. \nDoriți să fie afișate în continuare?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Doriți să continuați afișarea acestor notificări?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Opriți notificările"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Blocați"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Continuați afișarea"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimizați"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Afișați fără sunet"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Păstrați modul silențios"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Alertează-mă"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Păstrați alerta"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Doriți să continuați afișarea notificărilor de la această aplicație?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Aceste notificări nu pot fi dezactivate"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"prin <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -876,11 +876,20 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Setări"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Date SysUI memorie"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> aplicații</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> de aplicații</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplicație</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> folosește <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplicațiile folosesc <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Anulați"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="few"><xliff:g id="NUM_APPS_2">%1$d</xliff:g> aplicații folosesc <xliff:g id="TYPE_3">%2$s</xliff:g>.</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> de aplicații folosesc <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplicație folosește <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Afișați detaliile"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplicație care folosește <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplicații care folosesc <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index e643c8f..bbea694 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Отладка по USB"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Цифровой отпечаток ключа RSA:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Всегда разрешать отладку с этого компьютера"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Отладка по USB запрещена"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"В этом аккаунте нельзя включить отладку по USB. Перейдите в аккаунт основного пользователя."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Подогнать по размерам экрана"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Растянуть на весь экран"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Скриншот"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Отмена"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Справочное сообщение"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Подтвердить"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Повторить попытку"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Прикоснитесь к сканеру отпечатков пальцев."</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Значок отпечатка пальца"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Поиск лица…"</string>
@@ -298,8 +303,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Аудиоустройство"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Гарнитура"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Устройство ввода"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Слуховые аппараты"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Включение…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Яркость"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Автоповорот"</string>
@@ -617,17 +621,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Обычно вы скрываете эти уведомления.\nПоказывать их?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Показывать эти уведомления?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Отключить уведомления"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Заблокировать"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Показывать"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Свернуть"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Без звука"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Не включать звук"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Оповещать меня"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Присылать уведомления"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Показывать уведомления от этого приложения?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Эти уведомления нельзя отключить."</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"через приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
@@ -881,11 +881,22 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Открыть настройки"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"ОК"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Передача SysUI"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> прил.</item>
+      <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> прил.</item>
+      <item quantity="many"><xliff:g id="NUM_APPS_2">%d</xliff:g> прил.</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> прил.</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"В приложении \"<xliff:g id="APP">%1$s</xliff:g>\" используется <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"В приложениях используется <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Отмена"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one">Функцию \"<xliff:g id="TYPE_5">%2$s</xliff:g>\" использует <xliff:g id="NUM_APPS_4">%1$d</xliff:g> приложение.</item>
+      <item quantity="few">Функцию \"<xliff:g id="TYPE_3">%2$s</xliff:g>\" используют <xliff:g id="NUM_APPS_2">%1$d</xliff:g> приложения.</item>
+      <item quantity="many">Функцию \"<xliff:g id="TYPE_5">%2$s</xliff:g>\" используют <xliff:g id="NUM_APPS_4">%1$d</xliff:g> приложений.</item>
+      <item quantity="other">Функцию \"<xliff:g id="TYPE_5">%2$s</xliff:g>\" используют <xliff:g id="NUM_APPS_4">%1$d</xliff:g> приложения.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Подробнее"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Приложение, в котором используются операции <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Приложения, в которых используются операции <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index cb22f3d..aaaa703 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"USB නිදොස්කරණයට අවසර දෙනවද?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"මෙම පරිගණකයේ RSA යතුරු ඇඟිලි සටහන වන්නේ:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"සැම විටම මෙම පරිගණකයෙන් ඉඩ ලබා දෙන්න"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB නිදොස්කරණය වෙත අවසර නැහැ"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"දැනට මෙම උපාංගයට පුරා ඇති පරිශීලකයාට USB නිදොස්කරණය ක්‍රියාත්මක කළ නොහැක. මෙම විශේෂාංගය භාවිතා කිරීම සඳහා, මූලික පරිශීලකයා වෙත මාරු වෙන්න."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"තිරය පිරවීමට විශාලනය කරන්න"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"තිරය පිරවීමට අදින්න"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"තිර රුව"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"අවලංගු කරන්න"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"උදවු පණිවිඩ ප්‍රදේශය"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"තහවුරු කරන්න"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"නැවත උත්සාහ කරන්න"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ඇඟිලි සලකුණු සංවේදකය ස්පර්ශ කරන්න"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ඇඟිලි සලකුණු නිරූපකය"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ඔබව සොයමින්…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ශ්‍රව්‍ය"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"හෙඩ්සෙටය"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ආදානය"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"ශ්‍රවණාධාරක"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ක්‍රියාත්මක කරමින්…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"දීප්තිය"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"ස්වයංක්‍රීය කරකැවීම"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"ඔබ සාමාන්‍යයෙන් මෙවැනි දැනුම්දීම් ඉවත දමයි. \nඒවා දිගටම පෙන්වන්නද?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"මෙම දැනුම්දීම් පෙන්වමින් තබන්නද?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"දැනුම්දීම් නවත්වන්න"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"අවහිර කරන්න"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"පෙන්වමින් තබන්න"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"කුඩා කරන්න"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"නිහඬව පෙන්වන්න"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"නිහඬව සිටින්න"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"මට අඟවන්න"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"අඟවමින් සිටින්න"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"මෙම යෙදුම වෙතින් දැනුම්දීම් පෙන්වමින් තබන්නද?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"මෙම දැනුම්දීම් ක්‍රියාවිරහිත කළ නොහැකිය"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> හරහා"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"සැකසීම්"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"තේරුණා"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one">යෙදුම් <xliff:g id="NUM_APPS_2">%d</xliff:g>ක්</item>
+      <item quantity="other">යෙදුම් <xliff:g id="NUM_APPS_2">%d</xliff:g>ක්</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> ඔබේ <xliff:g id="TYPES_LIST">%2$s</xliff:g> භාවිත කරමින් සිටී."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"යෙදුම් ඔබේ <xliff:g id="TYPES_LIST">%s</xliff:g> භාවිත කරමින් සිටී."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"අවලංගු කරන්න"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one">යෙදුම් <xliff:g id="NUM_APPS_4">%1$d</xliff:g>ක් ඔබේ <xliff:g id="TYPE_5">%2$s</xliff:g> භාවිත කරමින් සිටිති.</item>
+      <item quantity="other">යෙදුම් <xliff:g id="NUM_APPS_4">%1$d</xliff:g>ක් ඔබේ <xliff:g id="TYPE_5">%2$s</xliff:g> භාවිත කරමින් සිටිති.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"විස්තර බලන්න"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"ඔබගේ <xliff:g id="TYPES_LIST">%s</xliff:g> භාවිත කරන යෙදුම්"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"ඔබගේ <xliff:g id="TYPES_LIST">%s</xliff:g> භාවිත කරන යෙදුම්"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index bcc444f..28b3d24 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Povoliť ladenie USB?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Digitálny odtlačok RSA počítača je:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Vždy povoliť z tohto počítača"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Ladenie cez USB nie je povolené"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Používateľ, ktorý je práve prihlásený v tomto zariadení, nemôže zapnúť ladenie USB. Ak chcete použiť túto funkciu, prepnite na hlavného používateľa."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Priblížiť na celú obrazovku"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Na celú obrazovku"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Snímka obrazovky"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Zrušiť"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Oblasť správy pomocníka"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potvrdiť"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Skúsiť znova"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Klepnite na senzor odtlačkov prstov"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona odtlačku prsta"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Hľadáme vás…"</string>
@@ -236,11 +241,11 @@
     <string name="accessibility_quick_settings_close" msgid="3115847794692516306">"Zavrieť panel"</string>
     <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Dlhší čas"</string>
     <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Kratší čas"</string>
-    <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Svietidlo je vypnuté."</string>
-    <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Svietidlo nie je k dispozícii."</string>
-    <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Svietidlo je zapnuté."</string>
-    <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Svietidlo je vypnuté."</string>
-    <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Svietidlo je zapnuté."</string>
+    <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Baterka je vypnutá."</string>
+    <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Baterka nie je k dispozícii."</string>
+    <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Baterka je zapnutá."</string>
+    <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Baterka je vypnutá."</string>
+    <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Baterka je zapnutá."</string>
     <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="4406577213290173911">"Prevrátenie farieb je vypnuté."</string>
     <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="6897462320184911126">"Prevrátenie farieb je zapnuté."</string>
     <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Mobilný hotspot je vypnutý."</string>
@@ -298,8 +303,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Zvuk"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Náhlavná súprava"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Vstup"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Načúvacie pomôcky"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Zapína sa…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Jas"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatické otáčanie"</string>
@@ -617,17 +621,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Tieto upozornenia zvyčajne odmietate. \nChcete ich naďalej zobrazovať?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Majú sa tieto upozornenia naďalej zobrazovať?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Prestať zobrazovať upozornenia"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Blokovať"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Naďalej zobrazovať"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimalizovať"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Zobraziť potichu"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Naďalej upozorňovať potichu"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Upozorniť ma"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Naďalej upozorňovať"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Majú sa upozornenia z tejto aplikácie naďalej zobrazovať?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Tieto upozornenia sa nedajú vypnúť"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"prostredníctvom aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -881,11 +881,22 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Nastavenia"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Dobre"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Výpis haldy SysUI"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> aplikácie</item>
+      <item quantity="many"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikácií</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplikácia</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> používa zoznam <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikácie používajú zoznam <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Zrušiť"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="few"><xliff:g id="TYPE_3">%2$s</xliff:g> používajú <xliff:g id="NUM_APPS_2">%1$d</xliff:g> aplikácie</item>
+      <item quantity="many"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> applications are using your <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="other"><xliff:g id="TYPE_5">%2$s</xliff:g> používa <xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikácií</item>
+      <item quantity="one"><xliff:g id="TYPE_1">%2$s</xliff:g> používa <xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplikácia.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Podrobnosti"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplikácia používajúca <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplikácie používajúce <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 706e700..b25a49d 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Ali dovolite odpravljanje težav prek USB?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Računalnikov prstni odtis ključa RSA je:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Vedno dovoli iz tega računalnika"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Odpravljanje napak s povezavo USB ni dovoljeno"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Uporabnik, trenutno prijavljen v napravo, ne more vklopiti odpravljanja napak s povezavo USB. Če želite uporabljati to funkcijo, preklopite na primarnega uporabnika."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Povečava čez cel zaslon"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Raztegnitev čez zaslon"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Posnetek zaslona"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Prekliči"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Območje sporočila pomoči"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potrdite"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Poskusi znova"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dotaknite se tipala prstnih odtisov"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona prstnih odtisov"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Preverjanje vašega obraza …"</string>
@@ -298,8 +303,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Zvok"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Slušalke z mikrofonom"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Vhodna naprava"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Slušni pripomočki"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Vklapljanje …"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Svetlost"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Samodejno sukanje"</string>
@@ -617,17 +621,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Ta obvestila običajno opustite. \nAli želite, da se še naprej prikazujejo?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Želite, da so ta obvestila še naprej prikazana?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Ustavi prikazovanje obvestil"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Blokiraj"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Prikazuj še naprej"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimiraj"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Prikaži brez zvoka"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Še naprej prikazuj brez zvoka"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Opozori me"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Še naprej opozarjaj"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Želite, da so obvestila te aplikacije še naprej prikazana?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Teh obvestil ni mogoče izklopiti"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"prek aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -881,11 +881,22 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Nastavitve"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"V redu"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Izvoz kopice SysUI"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacija</item>
+      <item quantity="two"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikaciji</item>
+      <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> aplikacije</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacij</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> uporablja <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikacije uporabljajo <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Prekliči"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacija uporablja <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="two"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikaciji uporabljata <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="few"><xliff:g id="NUM_APPS_2">%1$d</xliff:g> aplikacije uporabljajo <xliff:g id="TYPE_3">%2$s</xliff:g>.</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacij uporablja <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Podrobnosti"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplikacija, ki uporablja te funkcije: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplikacije, ki uporabljajo te funkcije: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 66a5778..1642e99 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Të lejohet korrigjimi i USB-së?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Shenja e gishtit të tastit \"RSA\" së kompjuterit është:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Lejo gjithmonë nga ky kompjuter"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Korrigjimi i USB-së nuk lejohet"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Përdoruesi i identifikuar aktualisht në këtë pajisje nuk mund ta aktivizojë korrigjimin e USB-së. Për ta përdorur këtë funksion, kalo te përdoruesi parësor."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Zmadho për të mbushur ekranin"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Shtrije për të mbushur ekranin"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Pamja e ekranit"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Anulo"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Zona e mesazhit të ndihmës"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Konfirmo"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Provo përsëri"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Prek sensorin e gjurmës së gishtit"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona e gjurmës së gishtit"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Po të kërkojmë…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Kufje me mikrofon"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Hyrja"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Aparatet e dëgjimit"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Po aktivizohet…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Ndriçimi"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rrotullim automatik"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Këto njoftime ti zakonisht i largon. \nDëshiron të vazhdosh t\'i shfaqësh ato?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Do të vazhdosh t\'i shfaqësh këto njoftime?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Ndalo njoftimet"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Blloko"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Vazhdo të shfaqësh"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimizo"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Shfaq në heshtje"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Qëndro në heshtje"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Më sinjalizo"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Vazhdo të sinjalizosh"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Do të vazhdosh t\'i shfaqësh njoftimet nga ky aplikacion?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Këto njoftime nuk mund të çaktivizohen"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"nëpërmjet <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Cilësimet"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"E kuptova"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Hidh grumbullin SysUI"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacione</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplikacion</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> po përdor <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikacionet po përdorin <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Anulo"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacione po përdorin <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplikacion po përdor <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Shiko detajet"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplikacionet që po përdorin <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplikacionet që po përdorin <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 1ff65d7..dac91a870 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Желите ли да дозволите отклањање USB грешака?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Дигитални отисак RSA кључа овог рачунара је:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Увек дозволи са овог рачунара"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Отклањање грешака на USB-у није дозвољено"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Корисник који је тренутно пријављен на овај уређај не може да укључи отклањање грешака на USB-у. Да бисте користили ову функцију, пребаците на примарног корисника."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Зумирај на целом екрану"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Развуци на цео екран"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Снимак екрана"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Откажи"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Област поруке за помоћ"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Потврди"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Пробај поново"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Додирните сензор за отисак прста"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Икона отиска прста"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Тражимо вас…"</string>
@@ -297,8 +302,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Аудио"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Слушалице"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Унос"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Слушни апарати"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Укључује се..."</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Осветљеност"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Аутоматска ротација"</string>
@@ -614,17 +618,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Обично одбацујете ова обавештења. \nЖелите ли да се и даље приказују?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Желите ли да се ова обавештења и даље приказују?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Престани да приказујеш обавештења"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Блокирај"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Настави да приказујеш"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Умањи"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Прикажи без звука"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Не укључуј звук"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Обавести ме"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Настави са обавештењима"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Желите ли да се обавештења из ове апликације и даље приказују?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Не можете да искључите ова обавештења"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"преко апликације <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -876,11 +876,20 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Подешавања"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Важи"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Издвоји SysUI мем."</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> апликација</item>
+      <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> апликације</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> апликација</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> користи <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Апликације користе <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Откажи"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> апликација користи дозволу <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="few"><xliff:g id="NUM_APPS_2">%1$d</xliff:g> апликације користе дозволу <xliff:g id="TYPE_3">%2$s</xliff:g>.</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> апликација користи дозволу <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Прикажи детаље"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Апликација која користи дозволе <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Апликације које користе дозволе <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 3c8c3ab..ff0d0c0 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Ska USB-felsökning tillåtas?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Fingeravtrycket för datorns RSA-nyckel är:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Tillåt alltid på den här datorn"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-felsökning är inte tillåtet"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Användaren som är inloggad på enheten för närvarande kan inte aktivera USB-felsökning. Byt till den primära användaren om du vill använda den här funktionen."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Zooma för att fylla skärm"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Dra för att fylla skärmen"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Skärmdump"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Avbryt"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Område för hjälpmeddelande"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bekräfta"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Försök igen"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Tryck på fingeravtryckssensorn"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon för fingeravtryck"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Håller utkik efter dig …"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Ljud"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Ingång"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Hörapparater"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Aktiverar …"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Ljusstyrka"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotera automatiskt"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Du brukar avvisa de här aviseringarna. \nVill du fortsätta att visa dem?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Vill du fortsätta visa de här aviseringarna?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Stoppa aviseringar"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Blockera"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Fortsätt visa"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Minimera"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Visa utan ljud"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Fortsätt visa utan ljud"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Meddela mig"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Fortsätt meddela"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Vill du fortsätta visa aviseringar för den här appen?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"De här aviseringarna kan inte inaktiveras"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Inställningar"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dumpa SysUI-heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> appar</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="TYPES_LIST">%2$s</xliff:g> används av <xliff:g id="APP">%1$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"<xliff:g id="TYPES_LIST">%s</xliff:g> används av appar."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Avbryt"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="TYPE_5">%2$s</xliff:g> används av <xliff:g id="NUM_APPS_4">%1$d</xliff:g> appar.</item>
+      <item quantity="one"><xliff:g id="TYPE_1">%2$s</xliff:g> används av <xliff:g id="NUM_APPS_0">%1$d</xliff:g> app.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Läs mer"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"En app använder din <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Appar använder dina <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 69b3be7..dbb3a8d 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Ruhusu utatuaji wa USB?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Alama ya kidole ya kitufe cha RSA ya kompyuta ni:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Ruhusu kutoka kwenye kompyuta hii kila wakati"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Utatuzi wa USB hauruhusiwi"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Mtumiaji aliyeingia katika akaunti kwa kutumia kifaa hiki kwa sasa hawezi kuwasha utatuzi wa USB. Ili utumie kipengele hiki, tumia akaunti ya mtumiaji wa msingi."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Kuza ili kujaza skrini"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Tanua ili kujaza skrini"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Picha ya skrini"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Ghairi"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Sehemu ya ujumbe wa usaidizi"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Thibitisha"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Jaribu tena"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Gusa kitambua alama ya kidole"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Aikoni ya alama ya kidole"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Inakutafuta…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Sauti"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Vifaa vya sauti"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Vifaa vya kuingiza sauti"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Visaidizi vya Kusikia"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Inawasha..."</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Ung\'avu"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Zungusha kiotomatiki"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Wewe huondoa arifa hizi. \nUngependa kuzionyesha?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Ungependa kuendelea kuonyesha arifa hizi?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Acha kuonyesha arifa"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Zuia"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Endelea kuonyesha"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Punguza"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Ionyeshe bila kutoa sauti"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Isitoe sauti"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Niarifu"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Endelea kutoa arifa"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Ungependa kuendelea kuonyesha arifa kutoka programu hii?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Huwezi kuzima arifa hizi"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"kupitia <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Mipangilio"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Nimeelewa"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other">Programu <xliff:g id="NUM_APPS_2">%d</xliff:g></item>
+      <item quantity="one">Programu <xliff:g id="NUM_APPS_0">%d</xliff:g></item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> inatumia <xliff:g id="TYPES_LIST">%2$s</xliff:g> yako."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Programu zinatumia <xliff:g id="TYPES_LIST">%s</xliff:g> yako."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Ghairi"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other">Programu <xliff:g id="NUM_APPS_4">%1$d</xliff:g> zinatumia <xliff:g id="TYPE_5">%2$s</xliff:g> yako.</item>
+      <item quantity="one">Programu <xliff:g id="NUM_APPS_0">%1$d</xliff:g> inatumia  <xliff:g id="TYPE_1">%2$s</xliff:g> yako.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Angalia maelezo"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Programu inayotumia <xliff:g id="TYPES_LIST">%s</xliff:g> yako"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Programu zinazotumia <xliff:g id="TYPES_LIST">%s</xliff:g> yako"</string>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index f75cc4d..0ef8bbf 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"USB பிழைத்திருத்தத்தை அனுமதிக்கவா?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"பின்வருவது கணினியின் RSA விசை கைரேகையாகும்:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"இந்தக் கணினியிலிருந்து எப்போதும் அனுமதி"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB பிழைத்திருத்தம் அனுமதிக்கப்படவில்லை"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"தற்போது இந்தச் சாதனத்தில் உள்நுழைந்துள்ள பயனரால் USB பிழைத்திருத்தத்தை இயக்க முடியாது. இந்த அம்சத்தை இயக்க, முதன்மைப் பயனருக்கு மாறவும்."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"திரையை நிரப்ப அளவை மாற்று"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"திரையை நிரப்ப இழு"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"ஸ்கிரீன் ஷாட்"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"ரத்துசெய்"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"உதவிச் செய்திக்கான பகுதி"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"உறுதிப்படுத்துக"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"மீண்டும் முயல்க"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"கைரேகை உணர்வியைத் தொடவும்"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"கைரேகை ஐகான்"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"உங்கள் முகத்தைத் தேடுகிறது…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ஆடியோ"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ஹெட்செட்"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"உள்ளீடு"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"செவித்துணை கருவிகள்"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ஆன் செய்கிறது…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"ஒளிர்வு"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"தானாகச் சுழற்று"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"வழக்கமாக, இந்த அறிவிப்புகளை நிராகரிக்கிறீர்கள். \nதொடர்ந்து இவற்றைக் காட்டலாமா?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"இந்த அறிவிப்புகளைத் தொடர்ந்து காட்டவா?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"அறிவிப்புகளை நிறுத்து"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"தடு"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"அறிவிப்புகளைத் தொடர்ந்து காட்டு"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"சிறிதாக்கு"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"ஒலிக்காமல் காட்டு"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"அறிவிப்புகளை ஒலியின்றிக் காட்டு"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"எனக்கு விழிப்பூட்டலை அனுப்பு"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"தொடர்ந்து விழிப்பூட்டு"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"இந்தப் பயன்பாட்டின் அறிவிப்புகளைத் தொடர்ந்து காட்டவா?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"இந்த அறிவிப்புகளை ஆஃப் செய்ய முடியாது"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> மூலமாக"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"அமைப்புகள்"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"சரி"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ஆப்ஸ்</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> ஆப்ஸ்</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"உங்கள் <xliff:g id="TYPES_LIST">%2$s</xliff:g>ஐ <xliff:g id="APP">%1$s</xliff:g> ஆப்ஸ் பயன்படுத்துகிறது."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"உங்கள் <xliff:g id="TYPES_LIST">%s</xliff:g> ஆகியவற்றை ஆப்ஸ் பயன்படுத்துகின்றன."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"ரத்துசெய்"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ஆப்ஸால் உங்கள் <xliff:g id="TYPE_5">%2$s</xliff:g> பயன்படுத்தப் படுகிறது.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> ஆப்ஸால் உங்கள் <xliff:g id="TYPE_1">%2$s</xliff:g> பயன்படுத்தப் படுகிறது.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"விவரங்களைக் காட்டு"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"உங்கள் <xliff:g id="TYPES_LIST">%s</xliff:g> ஆகியவற்றைப் பயன்படுத்தும் ஆப்ஸ்"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"உங்கள் <xliff:g id="TYPES_LIST">%s</xliff:g> ஆகியவற்றைப் பயன்படுத்தும் ஆப்ஸ்"</string>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index 894263e..4b05f0f 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"USB డీబగ్గింగ్‌ను అనుమతించాలా?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"ఇది కంప్యూటర్ యొక్క RSA కీ వేలిముద్ర:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"ఈ కంప్యూటర్ నుండి ఎల్లప్పుడూ అనుమతించు"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB డీబగ్గింగ్‌కి అనుమతి లేదు"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ఈ పరికరానికి ప్రస్తుతం సైన్ ఇన్ చేసిన వినియోగదారు USB డీబగ్గింగ్ ఆన్ చేయలేరు. ఈ ఫీచర్ ఉపయోగించడానికి, ప్రాథమిక వినియోగదారుకి మారాలి."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"స్క్రీన్‌కు నింపేలా జూమ్ చేయండి"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"స్క్రీన్‌కు నింపేలా విస్తరించండి"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"స్క్రీన్‌షాట్"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"రద్దు చేయి"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"సహాయ సందేశ ప్రాంతం"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"నిర్ధారించు"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"మళ్లీ ప్రయత్నించు"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"వేలిముద్ర సెన్సార్‌ను తాకండి"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"వేలిముద్ర చిహ్నం"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"మీ కోసం చూస్తోంది…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ఆడియో"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"హెడ్‌సెట్"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ఇన్‌పుట్"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"వినికిడి పరికరాలు"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ఆన్ చేస్తోంది…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"ప్రకాశం"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"స్వయంచాలకంగా తిప్పడం"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"మీరు సాధారణంగా ఈ నోటిఫికేషన్‌లను విస్మరిస్తారు. \nవాటి ప్రదర్శనను కొనసాగించాలా?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"ఈ నోటిఫికేషన్‌లను చూపిస్తూ ఉండాలా?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"నోటిఫికేషన్‌లను ఆపివేయి"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"బ్లాక్ చేయి"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"చూపిస్తూనే ఉండు"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"కుదించు"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"నిశ్శబ్దంగా చూపండి"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"నిశబ్దంగా తెలియజేయి"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"నన్ను హెచ్చరించు"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"ఎప్పటికప్పుడు హెచ్చరించు"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"ఈ యాప్ నుండి నోటిఫికేషన్‌లను చూపిస్తూ ఉండాలా?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"ఈ నోటిఫికేషన్‌లను ఆఫ్ చేయలేరు"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> ద్వారా"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"సెట్టింగ్‌లు"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"అర్థమైంది"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"డంప్ SysUI హీప్"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> యాప్‌లు</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> యాప్</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> మీ <xliff:g id="TYPES_LIST">%2$s</xliff:g>ని ఉపయోగిస్తోంది."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"అప్లికేషన్‌లు మీ <xliff:g id="TYPES_LIST">%s</xliff:g>ని ఉపయోగిస్తున్నాయి."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"రద్దు చేయండి"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> అప్లికేషన్‌లు మీ <xliff:g id="TYPE_5">%2$s</xliff:g>ని ఉపయోగిస్తున్నాయి.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> అప్లికేషన్‌ మీ <xliff:g id="TYPE_1">%2$s</xliff:g>ని ఉపయోగిస్తుంది.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"వివరాలను చూడండి"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"మీ <xliff:g id="TYPES_LIST">%s</xliff:g> ఉపయోగించే యాప్‌"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"మీ<xliff:g id="TYPES_LIST">%s</xliff:g> ఉపయోగిస్తున్న యాప్‌లు"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index ae581ac..707bcf9 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"อนุญาตให้แก้ไขข้อบกพร่อง USB หรือไม่"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"ลายนิ้วมือหลัก RSA ของคอมพิวเตอร์คือ:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"อนุญาตจากคอมพิวเตอร์เครื่องนี้เสมอ"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"ไม่อนุญาตให้แก้ไขข้อบกพร่องผ่าน USB"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ผู้ใช้ที่ลงชื่อเข้าใช้อุปกรณ์อยู่ในขณะนี้ไม่สามารถเปิดการแก้ไขข้อบกพร่องผ่าน USB ได้ หากต้องการใช้ฟีเจอร์นี้ ให้เปลี่ยนไปเป็นผู้ใช้หลัก"</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"ขยายจนเต็มหน้าจอ"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"ยืดจนเต็มหน้าจอ"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"ภาพหน้าจอ"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"ยกเลิก"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"พื้นที่ข้อความช่วยเหลือ"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"ยืนยัน"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ลองอีกครั้ง"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"แตะเซ็นเซอร์ลายนิ้วมือ"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ไอคอนลายนิ้วมือ"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"กำลังหาใบหน้าคุณ…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"เสียง"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ชุดหูฟัง"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"อินพุต"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"เครื่องช่วยการได้ยิน"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"กำลังเปิด..."</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"ความสว่าง"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"หมุนอัตโนมัติ"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"โดยปกติแล้ว คุณจะปิดการแจ้งเตือนเหล่านี้ \nต้องการให้แสดงต่อไหม"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"แสดงการแจ้งเตือนเหล่านี้ต่อไปไหม"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"ปิดการแจ้งเตือน"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"บล็อก"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"แสดงต่อไป"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"ย่อเล็กสุด"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"แสดงโดยไม่ส่งเสียง"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"ปิดเสียงไว้"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"แจ้งเตือนฉัน"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"แจ้งเตือนต่อไป"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"แสดงการแจ้งเตือนจากแอปนี้ต่อไปไหม"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"ปิดการแจ้งเตือนเหล่านี้ไม่ได้"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"ผ่าน <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"การตั้งค่า"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"รับทราบ"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> แอป</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> แอป</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> ใช้<xliff:g id="TYPES_LIST">%2$s</xliff:g>ของคุณอยู่"</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"หลายแอปพลิเคชันใช้<xliff:g id="TYPES_LIST">%s</xliff:g>ของคุณอยู่"</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"ยกเลิก"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other">มี <xliff:g id="NUM_APPS_4">%1$d</xliff:g> แอปพลิเคชันกำลังใช้<xliff:g id="TYPE_5">%2$s</xliff:g></item>
+      <item quantity="one">มี <xliff:g id="NUM_APPS_0">%1$d</xliff:g> แอปพลิเคชันกำลังใช้<xliff:g id="TYPE_1">%2$s</xliff:g></item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"ดูรายละเอียด"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"มีแอปกำลังใช้<xliff:g id="TYPES_LIST">%s</xliff:g>ของคุณ"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"มีหลายแอปกำลังใช้<xliff:g id="TYPES_LIST">%s</xliff:g>ของคุณ"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index ab20ff0..1d9460c 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Payagan ang pag-debug ng USB?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Ang RSA key fingerprint ng computer ay:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Palaging payagan mula sa computer na ito"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Hindi pinapayagan ang pagde-debug sa pamamagitan ng USB"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Hindi mao-on ng user na kasalukuyang naka-sign in sa device na ito ang pag-debug ng USB. Upang magamit ang feature na ito, lumipat sa pangunahing user."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"I-zoom upang punan screen"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"I-stretch upang mapuno screen"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Kanselahin"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Lugar ng mensahe ng tulong"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Kumpirmahin"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Subukang muli"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Pindutin ang fingerprint sensor"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icon ng fingerprint"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Hinahanap ka…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Input"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Mga Hearing Aid"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Ino-on…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brightness"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Awtomatikong i-rotate"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Karaniwan mong dini-dismiss ang mga ganitong notification. \nPatuloy na ipakita ang mga ito?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Patuloy na ipakita ang mga notification na ito?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Ihinto ang mga notification"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"I-block"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Patuloy na ipakita"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"I-minimize"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Ipakita nang tahimik"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Manatiling naka-silent"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Alertuhan ako"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Patuloy na mag-alerto"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Patuloy na ipakita ang mga notification mula sa app na ito?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Hindi maaaring i-off ang mga notification na ito"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"sa pamamagitan ng <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Mga Setting"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Itapon SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> app</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> na app</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Ginagamit ng <xliff:g id="APP">%1$s</xliff:g> ang iyong <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Ginagamit ng mga application ang iyong <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Kanselahin"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one">Ginagamit ng <xliff:g id="NUM_APPS_4">%1$d</xliff:g> application ang iyong <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+      <item quantity="other">Ginagamit ng <xliff:g id="NUM_APPS_4">%1$d</xliff:g> na application ang iyong <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Tingnan ang mga detalye"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App na gumagamit ng iyong <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Mga app na gumagamit ng iyong <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 32201fb..0217720 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"USB hata ayıklamasına izin verilsin mi?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Bilgisayarın RSA anahtarı parmak izi:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Bu bilgisayardan her zaman izin ver"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB hata ayıklama işlevine izin verilmiyor"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Bu cihazda geçerli olarak oturum açmış olan kullanıcı, USB hata ayıklama özelliğini açamaz. Bu özelliği kullanmak için birincil kullanıcıya geçin."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Yakınlaştır (ekranı kaplasın)"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Genişlet (ekran kapansın)"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Ekran görüntüsü"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"İptal"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Yardım mesajı alanı"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Onaylayın"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Tekrar dene"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Parmak izi sensörüne dokunun"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Parmak izi simgesi"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Yüzünüz tanınmaya çalışılıyor…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Ses"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Mikrofonlu kulaklık"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Giriş"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"İşitme Cihazları"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Açılıyor…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Parlaklık"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Otomatik döndür"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Bu bildirimleri genellikle kapatıyorsunuz. \nBildirimler gösterilmeye devam edilsin mi?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Bu bildirimler gösterilmeye devam edilsin mi?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Bildirimleri durdur"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Engelle"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Göstermeye devam et"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Küçült"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Sessiz bir şekilde göster"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Sessiz uyarı göster"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Beni uyar"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Uyarıda bulunmaya devam et"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Bu uygulamadan gelen bildirimler gösterilmeye devam edilsin mi?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Bu bildirimler kapatılamaz"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> ile"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Ayarlar"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Anladım"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI Yığın Dökümü"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> uygulama</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> uygulama</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> şunları kullanıyor: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Uygulamalar şunları kullanıyor: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"İptal"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> uygulama, cihazınızın <xliff:g id="TYPE_5">%2$s</xliff:g> özelliğini kullanıyor.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> uygulama, cihazınızın <xliff:g id="TYPE_1">%2$s</xliff:g> özelliğini kullanıyor.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Ayrıntıları göster"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Uygulama cihazınızın <xliff:g id="TYPES_LIST">%s</xliff:g> özelliklerini kullanıyor"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Uygulamalar cihazınızın <xliff:g id="TYPES_LIST">%s</xliff:g> özelliklerini kullanıyor"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index a298c6a..69ed197 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Дозволити налагодження USB?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Цифровий відбиток ключа RSA комп’ютера:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Завжди дозволяти з цього комп’ютера"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Ви не можете вмикати налагодження USB"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Користувач поточного облікового запису не може вмикати налагодження USB. Щоб увімкнути цю функцію, увійдіть в обліковий запис основного користувача."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Масштабув. на весь екран"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Розтягнути на весь екран"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Знімок екрана"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Скасувати"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Область довідкового повідомлення"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Підтвердити"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Повторити спробу"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Торкніться сканера відбитків пальців"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Значок відбитка пальця"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Пошук обличчя…"</string>
@@ -298,8 +303,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Аудіопристрій"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Гарнітура"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Джерело сигналу"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Слухові апарати"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Увімкнення…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Яскравість"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Автоматичне обертання"</string>
@@ -617,17 +621,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Ви зазвичай закриваєте ці сповіщення. \nПоказувати їх?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Чи показувати ці сповіщення надалі?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Не показувати сповіщення"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Блокувати"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Показувати надалі"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Згорнути"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Показувати без звуку"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Без звуку"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Сповіщати мене"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Отримувати сповіщення"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Чи показувати сповіщення з цього додатка надалі?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Ці сповіщення не можна вимкнути"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"через додаток <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -881,11 +881,22 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Налаштування"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> додаток</item>
+      <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> додатки</item>
+      <item quantity="many"><xliff:g id="NUM_APPS_2">%d</xliff:g> додатків</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> додатка</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Додаток <xliff:g id="APP">%1$s</xliff:g> використовує <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Додатки використовують <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Скасувати"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one"><xliff:g id="TYPE_5">%2$s</xliff:g> працює в <xliff:g id="NUM_APPS_4">%1$d</xliff:g> додатку.</item>
+      <item quantity="few"><xliff:g id="TYPE_3">%2$s</xliff:g> працює в <xliff:g id="NUM_APPS_2">%1$d</xliff:g> додатках.</item>
+      <item quantity="many"><xliff:g id="TYPE_5">%2$s</xliff:g> працює в <xliff:g id="NUM_APPS_4">%1$d</xliff:g> додатках.</item>
+      <item quantity="other"><xliff:g id="TYPE_5">%2$s</xliff:g> працює в <xliff:g id="NUM_APPS_4">%1$d</xliff:g> додатка.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Докладніше"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Додаток, яким використовується <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Додатки, якими використовується <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index ee9da5e..59e8946 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"‏USB ڈیبگ کرنے کی اجازت دیں؟"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"‏کمپیوٹر کے RSA کا کلیدی فنگر پرنٹ ہے:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"اس کمپیوٹر سے ہمیشہ اجازت دیں"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"‏USB ڈیبگ کرنے کی اجازت نہیں ہے"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"‏اس آلہ پر فی الحال سائن ان کردہ صارف USB ڈیبگنگ آن نہیں کر سکتا۔ اس خصوصیت کا استعمال کرنے کیلئے، ابتدائی صارف پر سوئچ کریں۔"</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"پوری سکرین پر زوم کریں"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"پوری سکرین پر پھیلائیں"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"اسکرین شاٹ"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"منسوخ کریں"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"امدادی پیغام کا علاقہ"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"تصدیق کریں"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"دوبارہ کوشش کریں"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"فنگر پرنٹ سینسر پر ٹچ کریں"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"فنگر پرنٹ آئیکن"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"آپ کے لیے تلاش کیا جا رہا ہے…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"آڈیو"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ہیڈ سیٹ"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ان پٹ"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"سماعتی آلات"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"آن ہو رہا ہے…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"چمکیلا پن"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"خود کار طور پر گھمائیں"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"آپ عام طور پر ان اطلاعات کو مسترد کرتے ہیں۔ \nان کو دکھاتے رہیں؟"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"یہ اطلاعات دکھانا جاری رکھیں؟"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"اطلاعات روک دیں"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"مسدود کریں"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"دکھانا جاری رکھیں"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"چھوٹا کریں"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"خاموشی سے دکھائیں"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"خاموش رہیں"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"مجھے متنبہ کریں"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"متنبہ کرنا جاری رکھیں"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"اس ایپ کی طرف سے اطلاعات دکھانا جاری رکھیں؟"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"ان اطلاعات کو آف نہیں کیا جا سکتا"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"بذریعہ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"ترتیبات"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"سمجھ آ گئی"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ایپس</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> ایپ</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> آپ کی <xliff:g id="TYPES_LIST">%2$s</xliff:g> کا استعمال کر رہی ہے۔"</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"ایپلیکیشنز آپ کی <xliff:g id="TYPES_LIST">%s</xliff:g> کا استعمال کر رہی ہیں۔"</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"منسوخ کریں"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ایپلیکیشنز آپ کی <xliff:g id="TYPE_5">%2$s</xliff:g> کا استعمال کر رہی ہیں۔</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> ایپلیکیشن آپ کی <xliff:g id="TYPE_1">%2$s</xliff:g> کا استعمال کر رہی ہے۔</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"تفصیلات دیکھیں"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"ایپ آپ کی <xliff:g id="TYPES_LIST">%s</xliff:g> کا استعمال کر رہی ہیں"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"ایپس آپ کی <xliff:g id="TYPES_LIST">%s</xliff:g> کا استعمال کر رہی ہیں"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 488bfae..85204af 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"USB orqali nosozliklarni tuzatishga ruxsat berilsinmi?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Kompyuterning RSA tugmasi barmoq izlari:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Doimo ushbu kompyuterdan ruxsat berilsin"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB orqali nosozliklarni tuzatishga ruxsat berilmagan"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Ayni paytda ushbu qurilmaga o‘z hisobi bilan kirgan foydalanuvchi USB orqali nosozliklarni tuzatish funksiyasini yoqa olmaydi. Bu funksiyadan foydalanish uchun asosiy foydalanuvchi profiliga o‘ting."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Ekranga moslashtirish"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Ekran hajmida cho‘zish"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Skrinshot"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Bekor qilish"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Yordam xabari"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"OK"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Qayta urinish"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Barmoq izi skaneriga tegining"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Barmoq izi belgisi"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Yuzingiz tekshirilmoqda…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Garnitura"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Kirish"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Eshitish apparatlari"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Yoqilmoqda…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Yorqinlik"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Avtomatik burilish"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Odatda bunday bildirishnomalarni yopasiz. \nUlar ochiq tursinmi?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Mazkur bildirishnomalar chiqaversinmi?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Chiqmasin"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Bloklash"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Ha"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Kichraytirish"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Ovozsiz"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Ovozsiz qolsin"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Ogohlantirish"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Signal berishda davom etilsin"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Bu ilovadan keladigan bildirishnomalar chiqaversinmi?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Bu bildirishnomalarni chiqmaydigan qilish imkonsiz"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> orqali"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Sozlamalar"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ta ilova</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> ta ilova</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> ishlatmoqda: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Ilovalarda ishlatilmoqda: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Bekor qilish"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ta ilova <xliff:g id="TYPE_5">%2$s</xliff:g> ishlatmoqda.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> ta ilova <xliff:g id="TYPE_1">%2$s</xliff:g> ishlatmoqda.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Tafsilotlar"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"<xliff:g id="TYPES_LIST">%s</xliff:g> ishlatayotgan ilova"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Ilovalar <xliff:g id="TYPES_LIST">%s</xliff:g> ishlatmoqda"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 125eb72..d2b1384 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Cho phép gỡ lỗi USB?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Tệp tham chiếu khóa RSA của máy tính là:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Luôn cho phép từ máy tính này"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Tính năng gỡ lỗi USB không được phép"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Người dùng hiện đã đăng nhập vào thiết bị này không thể bật tính năng gỡ lỗi USB. Để sử dụng tính năng này, hãy chuyển sang người dùng chính."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"T.phóng để lấp đầy m.hình"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Giãn ra để lấp đầy m.hình"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Chụp ảnh màn hình"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Hủy"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Vùng thông báo trợ giúp"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Xác nhận"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Thử lại"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Chạm vào cảm biến vân tay"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Biểu tượng vân tay"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Đang tìm kiếm bạn…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Âm thanh"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Tai nghe"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Thiết bị đầu vào"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Thiết bị trợ thính"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Đang bật…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Độ sáng"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Tự động xoay"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Bạn thường bỏ qua những thông báo này. \nTiếp tục hiển thị thông báo?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Tiếp tục hiển thị các thông báo này?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Dừng thông báo"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Chặn"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Tiếp tục hiển thị"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Thu nhỏ"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Hiển thị không phát âm báo"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Tiếp tục chế độ im lặng"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Cảnh báo cho tôi"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Tiếp tục cảnh báo"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Tiếp tục hiển thị các thông báo từ ứng dụng này?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Không thể tắt các thông báo này"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"thông qua <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Cài đặt"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"Trích xuất bộ nhớ SysUI"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ứng dụng</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> ứng dụng</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> đang dùng <xliff:g id="TYPES_LIST">%2$s</xliff:g> của bạn."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Các ứng dụng đang dùng <xliff:g id="TYPES_LIST">%s</xliff:g> của bạn."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Hủy"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ứng dụng đang dùng <xliff:g id="TYPE_5">%2$s</xliff:g> của bạn.</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> ứng dụng đang dùng <xliff:g id="TYPE_1">%2$s</xliff:g> của bạn.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Xem chi tiết"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Ứng dụng đang sử dụng <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Các ứng dụng đang sử dụng <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index d6fd3d89..b1eff03 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"允许 USB 调试吗?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"这台计算机的 RSA 密钥指纹如下:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"一律允许使用这台计算机进行调试"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"不允许使用 USB 调试功能"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"目前已登录此设备的用户无法开启 USB 调试功能。要使用此功能,请切换为主要用户的帐号。"</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"缩放以填满屏幕"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"拉伸以填满屏幕"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"屏幕截图"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"取消"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"帮助消息区域"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"确认"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"重试"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"请触摸指纹传感器"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指纹图标"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"正在查找中…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"音频"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"耳机"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"输入"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"助听器"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"正在开启…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"亮度"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"自动旋转屏幕"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"您通常会关闭这些通知。\n是否继续显示通知?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"要继续显示这些通知吗?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"停止通知"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"屏蔽"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"继续显示"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"最小化"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"显示通知但不发出提示音"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"显示通知但不发出提示音"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"提醒我"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"继续提醒"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"要继续显示来自此应用的通知吗?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"无法关闭这些通知"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"通过<xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"设置"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"知道了"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"转储 SysUI 堆"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> 个应用</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> 个应用</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g>正在使用您的<xliff:g id="TYPES_LIST">%2$s</xliff:g>。"</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"有多个应用正在使用您的<xliff:g id="TYPES_LIST">%s</xliff:g>。"</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"取消"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> 个应用正在使用您的<xliff:g id="TYPE_5">%2$s</xliff:g>。</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> 个应用正在使用您的<xliff:g id="TYPE_1">%2$s</xliff:g>。</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"查看详情"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"正在使用您的<xliff:g id="TYPES_LIST">%s</xliff:g>的应用"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"正在使用您的<xliff:g id="TYPES_LIST">%s</xliff:g>的应用"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 5c2a5d2..64f4e21 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"允許 USB 除錯嗎?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"這部電腦的 RSA 密鑰指紋如下:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"一律允許透過這部電腦進行"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"不允許 USB 偵錯"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"目前登入此裝置的使用者無法啟用 USB 偵錯功能。如要使用此功能,請切換至主要使用者。"</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"放大為全螢幕"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"放大為全螢幕"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"擷取螢幕畫面"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"取消"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"說明訊息區域"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"確認"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"請再試一次"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"請輕觸指紋感應器"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指紋圖示"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"正在搜尋您的臉孔…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"音訊"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"耳機"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"輸入"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"助聽器"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"正在開啟…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"亮度"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"自動旋轉"</string>
@@ -307,7 +311,7 @@
     <string name="quick_settings_rotation_locked_portrait_label" msgid="5102691921442135053">"直向"</string>
     <string name="quick_settings_rotation_locked_landscape_label" msgid="8553157770061178719">"橫向"</string>
     <string name="quick_settings_ime_label" msgid="7073463064369468429">"輸入法"</string>
-    <string name="quick_settings_location_label" msgid="5011327048748762257">"位置資訊"</string>
+    <string name="quick_settings_location_label" msgid="5011327048748762257">"定位"</string>
     <string name="quick_settings_location_off_label" msgid="7464544086507331459">"位置資訊已關閉"</string>
     <string name="quick_settings_media_device_label" msgid="1302906836372603762">"媒體裝置"</string>
     <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"您通常會關閉這些通知。\n要繼續顯示通知嗎?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"要繼續顯示這些通知嗎?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"停止通知"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"封鎖"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"繼續顯示"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"最小化"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"顯示通知但不發出音效"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"保持靜音"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"提示我"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"繼續提示"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"要繼續顯示此應用程式的通知嗎?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"無法關閉這些通知"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"透過「<xliff:g id="APP_NAME">%1$s</xliff:g>」"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"設定"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"知道了"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"傾印 SysUI 記憶體快照"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> 個應用程式</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> 個應用程式</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"「<xliff:g id="APP">%1$s</xliff:g>」正在使用<xliff:g id="TYPES_LIST">%2$s</xliff:g>。"</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"有多個應用程式正在使用<xliff:g id="TYPES_LIST">%s</xliff:g>。"</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"取消"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other">有 <xliff:g id="NUM_APPS_4">%1$d</xliff:g> 個應用程式正在使用您的<xliff:g id="TYPE_5">%2$s</xliff:g>。</item>
+      <item quantity="one">有 <xliff:g id="NUM_APPS_0">%1$d</xliff:g> 個應用程式正在使用您的<xliff:g id="TYPE_1">%2$s</xliff:g>。</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"查看詳情"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"使用<xliff:g id="TYPES_LIST">%s</xliff:g>的應用程式"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"使用<xliff:g id="TYPES_LIST">%s</xliff:g>的應用程式"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index dbe24bb..bd1896a 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"允許 USB 偵錯嗎?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"這台電腦的 RSA 金鑰指紋如下:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"一律允許透過這台電腦進行"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"無權使用 USB 偵錯功能"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"目前登入這個裝置的使用者無法啟用 USB 偵錯功能。如要使用這項功能,請切換到主要使用者。"</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"放大為全螢幕"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"放大為全螢幕"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"擷取螢幕畫面"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"取消"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"說明訊息區域"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"確認"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"再試一次"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"請輕觸指紋感應器"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指紋圖示"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"正在尋找你的臉孔…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"音訊"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"耳機"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"輸入"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"助聽器"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"開啟中…"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"亮度"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"自動旋轉"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"你通常會關閉這些通知。\n要繼續顯示通知嗎?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"要繼續顯示這些通知嗎?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"停止顯示通知"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"封鎖"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"繼續顯示"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"最小化"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"顯示通知但不發出音效"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"繼續顯示通知但不發出音效"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"顯示通知"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"繼續顯示通知"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"要繼續顯示這個應用程式的通知嗎?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"無法關閉這些通知"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"透過「<xliff:g id="APP_NAME">%1$s</xliff:g>」"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"設定"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"我知道了"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"傾印 SysUI 記憶體快照"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> 個應用程式</item>
+      <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> 個應用程式</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"「<xliff:g id="APP">%1$s</xliff:g>」正在使用<xliff:g id="TYPES_LIST">%2$s</xliff:g>。"</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"有多個應用程式正在使用<xliff:g id="TYPES_LIST">%s</xliff:g>。"</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"取消"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="other">有 <xliff:g id="NUM_APPS_4">%1$d</xliff:g> 個應用程式正在使用你的<xliff:g id="TYPE_5">%2$s</xliff:g>。</item>
+      <item quantity="one">有 <xliff:g id="NUM_APPS_0">%1$d</xliff:g> 個應用程式正在使用你的<xliff:g id="TYPE_1">%2$s</xliff:g>。</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"查看詳細資料"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"使用<xliff:g id="TYPES_LIST">%s</xliff:g>的應用程式"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"使用<xliff:g id="TYPES_LIST">%s</xliff:g>的應用程式"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 098ed01..9f70420 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -57,8 +57,14 @@
     <string name="usb_debugging_title" msgid="4513918393387141949">"Vumela ukulungisa iphutha le-USB?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Izigxivizo zeminwe zokhiye we-RSA wekhompyutha ngu:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
     <string name="usb_debugging_always" msgid="303335496705863070">"Hlala uvumela njalo kusuka kule khompyutha"</string>
+    <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+    <skip />
     <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Ukususa iphutha kwe-USB akuvunyelwe"</string>
     <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Umsebenzisi manje ongene ngemvume kule divayisi entsha akakwazi ukuvula ukulungisa amaphutha ku-USB. Ukuze usebenzise lesi sici, shintshela kumsebenzisi oyinhloko."</string>
+    <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+    <skip />
+    <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+    <skip />
     <string name="compat_mode_on" msgid="6623839244840638213">"Sondeza ukugcwalisa isikrini"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Nweba ukugcwalisa isikrini"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Isithombe-skrini"</string>
@@ -112,8 +118,7 @@
     <string name="cancel" msgid="6442560571259935130">"Khansela"</string>
     <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Indawo yosizo lomlayezo"</string>
     <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Qinisekisa"</string>
-    <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
-    <skip />
+    <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Zama futhi"</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Thinta inzwa yesigxivizo somunwe"</string>
     <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Isithonjana sezigxivizo zeminwe"</string>
     <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Kufunwa wena…"</string>
@@ -296,8 +301,7 @@
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Umsindo"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Ihedisethi"</string>
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Okokufaka"</string>
-    <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
-    <skip />
+    <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Izinsiza zokuzwa"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Iyavula..."</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Ukugqama"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Ukuphenduka okuzenzakalelayo"</string>
@@ -611,17 +615,13 @@
     <string name="inline_blocking_helper" msgid="3055064577771478591">"Uvamise ukucashisa lezi zaziso. \nQhubeka ulokhu uzibonisa?"</string>
     <string name="inline_keep_showing" msgid="8945102997083836858">"Qhubeka nokubonisa lezi zaziso?"</string>
     <string name="inline_stop_button" msgid="4172980096860941033">"Misa izaziso"</string>
-    <!-- no translation found for inline_block_button (8735843688021655065) -->
-    <skip />
+    <string name="inline_block_button" msgid="8735843688021655065">"Vimba"</string>
     <string name="inline_keep_button" msgid="6665940297019018232">"Qhubeka nokubonisa"</string>
     <string name="inline_minimize_button" msgid="966233327974702195">"Nciphisa"</string>
     <string name="inline_silent_button_silent" msgid="4411510650503783646">"Bonisa ngokuthulile"</string>
-    <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
-    <skip />
-    <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
-    <skip />
+    <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Hlala uthulile"</string>
+    <string name="inline_silent_button_alert" msgid="7961887853830826523">"Ngazise"</string>
+    <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Qhubeka wazise"</string>
     <string name="inline_keep_showing_app" msgid="1723113469580031041">"Qhubeka nokubonisa izaziso kusuka kulolu hlelo lokusebenza?"</string>
     <string name="notification_unblockable_desc" msgid="1037434112919403708">"Lezi zaziso azikwazi ukuvalwa"</string>
     <string name="notification_delegate_header" msgid="9167022191405284627">"nge-<xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Izilungiselelo"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Ngiyezwa"</string>
     <string name="heap_dump_tile_name" msgid="9141031328971226374">"I-Dump SysUI Heap"</string>
-    <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+    <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+      <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> izinhlelo zokusebenza</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> izinhlelo zokusebenza</item>
+    </plurals>
     <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"I-<xliff:g id="APP">%1$s</xliff:g> isebenzisa i-<xliff:g id="TYPES_LIST">%2$s</xliff:g> yakho."</string>
     <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Izinhlelo zokusebenza zisebenzisa i-<xliff:g id="TYPES_LIST">%s</xliff:g> yakho."</string>
-    <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
-    <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Khansela"</string>
+    <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+      <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> izinhlelo zokusebenza zisebenzisa i-<xliff:g id="TYPE_5">%2$s</xliff:g> yakho.</item>
+      <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> izinhlelo zokusebenza zisebenzisa i-<xliff:g id="TYPE_5">%2$s</xliff:g> yakho.</item>
+    </plurals>
+    <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+    <skip />
     <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Buka imininingwane"</string>
     <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Uhlelo lokusebenza olusebenzisa i-<xliff:g id="TYPES_LIST">%s</xliff:g> yakho"</string>
     <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Izinhlelo zokusebenza ezisebenzisa i-<xliff:g id="TYPES_LIST">%s</xliff:g> yakho"</string>
diff --git a/packages/SystemUI/res/values/attrs.xml b/packages/SystemUI/res/values/attrs.xml
index baaf9d6..0fed96e 100644
--- a/packages/SystemUI/res/values/attrs.xml
+++ b/packages/SystemUI/res/values/attrs.xml
@@ -124,6 +124,7 @@
     <attr name="darkIconTheme" format="reference" />
     <attr name="wallpaperTextColor" format="reference|color" />
     <attr name="wallpaperTextColorSecondary" format="reference|color" />
+    <attr name="backgroundProtectedStyle" format="reference" />
 
     <declare-styleable name="SmartReplyView">
         <attr name="spacing" format="dimension" />
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index f2be2e7..76eb85e 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -463,6 +463,10 @@
          show none. -->
     <integer name="config_smart_replies_in_notifications_min_num_system_generated_replies">0</integer>
 
+    <!-- Smart replies in notifications: Maximum number of smart actions to show in notifications.
+         -->
+    <integer name="config_smart_replies_in_notifications_max_num_actions">-1</integer>
+
     <!-- Screenshot editing default activity.  Must handle ACTION_EDIT image/png intents.
          Blank sends the user to the Chooser first.
          This name is in the ComponentName flattened format (package/class)  -->
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index d435c67..1060211 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -646,10 +646,15 @@
          + 8dp. -->
     <dimen name="assist_orb_navbar_scrim_height">56dp</dimen>
 
-    <!-- The width/height of the phone/camera/unlock icon view on keyguard. -->
+    <!-- The width/height of the phone/camera icon view on keyguard. -->
     <dimen name="keyguard_affordance_height">56dp</dimen>
     <dimen name="keyguard_affordance_width">56dp</dimen>
 
+    <!-- The width/height of the unlock icon view on keyguard. -->
+    <dimen name="keyguard_lock_height">32dp</dimen>
+    <dimen name="keyguard_lock_width">32dp</dimen>
+    <dimen name="keyguard_lock_padding">24dp</dimen>
+
     <dimen name="keyguard_indication_margin_bottom">65dp</dimen>
 
     <!-- The text size for battery level -->
@@ -1030,4 +1035,6 @@
     <dimen name="bubble_stack_offscreen">5dp</dimen>
     <!-- How far down the screen the stack starts. -->
     <dimen name="bubble_stack_starting_offset_y">100dp</dimen>
+    <!-- Size of image buttons in the bubble header -->
+    <dimen name="bubble_header_icon_size">48dp</dimen>
 </resources>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index ffa5de8..56d9bf4c 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -2309,7 +2309,7 @@
     <string name="ongoing_privacy_dialog_ok">Got it</string>
 
     <!-- Action on Ongoing Privacy Dialog to open privacy hub [CHAR LIMIT=20]-->
-    <string name="ongoing_privacy_dialog_open_settings">View details</string>
+    <string name="ongoing_privacy_dialog_open_settings">Privacy settings</string>
 
     <!-- Text for item in Ongoing Privacy Dialog title when only one app is using app ops [CHAR LIMIT=NONE] -->
     <string name="ongoing_privacy_dialog_single_app_title">App using your <xliff:g id="types_list" example="camera( and location)">%s</xliff:g></string>
@@ -2346,4 +2346,12 @@
 
     <!-- What to show on the ambient display player when song doesn't have a title. [CHAR LIMIT=20] -->
     <string name="music_controls_no_title">No title</string>
+
+    <!-- Text used for content description of deep link button in the header of expanded bubble
+         view. [CHAR_LIMIT=NONE] -->
+    <string name="bubbles_deep_link_button_description">Open <xliff:g id="app_name" example="YouTube">%1$s</xliff:g></string>
+    <!-- Text used for content description of settings button in the header of expanded bubble
+         view. [CHAR_LIMIT=NONE] -->
+    <string name="bubbles_settings_button_description">Open notification settings for <xliff:g id="app_name" example="YouTube">%1$s</xliff:g></string>
+
 </resources>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index fa675b7..3f5b22e 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -269,6 +269,7 @@
         <item name="android:colorControlHighlight">@*android:color/primary_text_material_dark</item>
         <item name="*android:lockPatternStyle">@style/LockPatternStyle</item>
         <item name="passwordStyle">@style/PasswordTheme</item>
+        <item name="backgroundProtectedStyle">@style/BackgroundProtectedStyle</item>
 
         <!-- Needed for MediaRoute chooser dialog -->
         <item name="*android:isLightTheme">false</item>
@@ -285,6 +286,10 @@
         <item name="*android:isLightTheme">true</item>
     </style>
 
+    <style name="BackgroundProtectedStyle">
+        <item name="android:textColor">?attr/wallpaperTextColor</item>
+    </style>
+
     <style name="LockPatternStyle">
         <item name="*android:regularColor">?attr/wallpaperTextColor</item>
         <item name="*android:successColor">?attr/wallpaperTextColor</item>
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/ThumbnailData.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/ThumbnailData.java
index f84c72e..1413ac1 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/ThumbnailData.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/ThumbnailData.java
@@ -17,11 +17,13 @@
 package com.android.systemui.shared.recents.model;
 
 import static android.content.res.Configuration.ORIENTATION_UNDEFINED;
+
 import static com.android.systemui.shared.system.WindowManagerWrapper.WINDOWING_MODE_UNDEFINED;
 
 import android.app.ActivityManager.TaskSnapshot;
 import android.graphics.Bitmap;
 import android.graphics.Rect;
+import android.hardware.HardwareBuffer;
 
 /**
  * Data for a single thumbnail.
@@ -51,7 +53,9 @@
     }
 
     public ThumbnailData(TaskSnapshot snapshot) {
-        thumbnail = Bitmap.createHardwareBitmap(snapshot.getSnapshot());
+        thumbnail = Bitmap.wrapHardwareBuffer(
+                HardwareBuffer.createFromGraphicBuffer(snapshot.getSnapshot()),
+                snapshot.getColorSpace());
         insets = new Rect(snapshot.getContentInsets());
         orientation = snapshot.getOrientation();
         reducedResolution = snapshot.isReducedResolution();
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index bcd41a0..0970c21 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -99,6 +99,7 @@
 import java.util.List;
 import java.util.Map.Entry;
 import java.util.TimeZone;
+import java.util.function.Consumer;
 
 /**
  * Watches for updates that may be interesting to the keyguard, and provides
@@ -218,7 +219,8 @@
     // Battery status
     private BatteryStatus mBatteryStatus;
 
-    private final StrongAuthTracker mStrongAuthTracker;
+    @VisibleForTesting
+    protected StrongAuthTracker mStrongAuthTracker;
 
     private final ArrayList<WeakReference<KeyguardUpdateMonitorCallback>>
             mCallbacks = Lists.newArrayList();
@@ -344,8 +346,7 @@
                     handleUserUnlocked();
                     break;
                 case MSG_ASSISTANT_STACK_CHANGED:
-                    mAssistantVisible = (boolean)msg.obj;
-                    updateBiometricListeningState();
+                    setAssistantVisible((boolean) msg.obj);
                     break;
                 case MSG_BIOMETRIC_AUTHENTICATION_CONTINUE:
                     updateBiometricListeningState();
@@ -354,7 +355,7 @@
                     updateLogoutEnabled();
                     break;
                 case MSG_TELEPHONY_CAPABLE:
-                    updateTelephonyCapable((boolean)msg.obj);
+                    updateTelephonyCapable((boolean) msg.obj);
                     break;
                 default:
                     super.handleMessage(msg);
@@ -538,7 +539,8 @@
         }
     }
 
-    private void onFingerprintAuthenticated(int userId) {
+    @VisibleForTesting
+    protected void onFingerprintAuthenticated(int userId) {
         Trace.beginSection("KeyGuardUpdateMonitor#onFingerPrintAuthenticated");
         mUserFingerprintAuthenticated.put(userId, true);
         // Update/refresh trust state only if user can skip bouncer
@@ -693,7 +695,8 @@
         }
     }
 
-    private void onFaceAuthenticated(int userId) {
+    @VisibleForTesting
+    protected void onFaceAuthenticated(int userId) {
         Trace.beginSection("KeyGuardUpdateMonitor#onFaceAuthenticated");
         mUserFaceAuthenticated.put(userId, true);
         // Update/refresh trust state only if user can skip bouncer
@@ -898,8 +901,9 @@
 
 
     public boolean getUserCanSkipBouncer(int userId) {
-        return getUserHasTrust(userId) || (mUserFingerprintAuthenticated.get(userId)
-                && isUnlockingWithBiometricAllowed());
+        boolean fingerprintOrFace = mUserFingerprintAuthenticated.get(userId)
+                || mUserFaceAuthenticated.get(userId);
+        return getUserHasTrust(userId) || (fingerprintOrFace && isUnlockingWithBiometricAllowed());
     }
 
     public boolean getUserHasTrust(int userId) {
@@ -950,6 +954,12 @@
         }
     }
 
+    @VisibleForTesting
+    void setAssistantVisible(boolean assistantVisible) {
+        mAssistantVisible = assistantVisible;
+        updateBiometricListeningState();
+    }
+
     static class DisplayClientState {
         public int clientGeneration;
         public boolean clearing;
@@ -1047,7 +1057,8 @@
         }
     };
 
-    private final BroadcastReceiver mBroadcastAllReceiver = new BroadcastReceiver() {
+    @VisibleForTesting
+    protected final BroadcastReceiver mBroadcastAllReceiver = new BroadcastReceiver() {
 
         @Override
         public void onReceive(Context context, Intent intent) {
@@ -1121,7 +1132,8 @@
         }
     };
 
-    private FaceManager.AuthenticationCallback mFaceAuthenticationCallback
+    @VisibleForTesting
+    FaceManager.AuthenticationCallback mFaceAuthenticationCallback
             = new FaceManager.AuthenticationCallback() {
 
         @Override
@@ -1298,9 +1310,13 @@
         }
     }
 
-    public class StrongAuthTracker extends LockPatternUtils.StrongAuthTracker {
-        public StrongAuthTracker(Context context) {
+    public static class StrongAuthTracker extends LockPatternUtils.StrongAuthTracker {
+        private final Consumer<Integer> mStrongAuthRequiredChangedCallback;
+
+        public StrongAuthTracker(Context context,
+                Consumer<Integer> strongAuthRequiredChangedCallback) {
             super(context);
+            mStrongAuthRequiredChangedCallback = strongAuthRequiredChangedCallback;
         }
 
         public boolean isUnlockingWithBiometricAllowed() {
@@ -1316,7 +1332,7 @@
 
         @Override
         public void onStrongAuthRequiredChanged(int userId) {
-            notifyStrongAuthStateChanged(userId);
+            mStrongAuthRequiredChangedCallback.accept(userId);
         }
     }
 
@@ -1423,7 +1439,7 @@
         mContext = context;
         mSubscriptionManager = SubscriptionManager.from(context);
         mDeviceProvisioned = isDeviceProvisionedInSettingsDb();
-        mStrongAuthTracker = new StrongAuthTracker(context);
+        mStrongAuthTracker = new StrongAuthTracker(context, this::notifyStrongAuthStateChanged);
 
         // Since device can't be un-provisioned, we only need to register a content observer
         // to update mDeviceProvisioned when we are...
@@ -1548,6 +1564,14 @@
         }
     }
 
+    /**
+     * Request passive authentication, when sensors detect that a user might be present.
+     */
+    public void onAuthInterruptDetected() {
+        if (DEBUG) Log.d(TAG, "onAuthInterruptDetected()");
+        updateFaceListeningState();
+    }
+
     private void updateFaceListeningState() {
         // If this message exists, we should not authenticate again until this message is
         // consumed by the handler
@@ -1585,11 +1609,13 @@
     }
 
     private boolean shouldListenForFace() {
-        return (mKeyguardIsVisible || !mDeviceInteractive ||
-                (mBouncer && !mKeyguardGoingAway) || mGoingToSleep ||
-                shouldListenForFaceAssistant() || (mKeyguardOccluded && mIsDreaming))
-                && !mSwitchingUser && !isFaceDisabled(getCurrentUser())
-                && !mKeyguardGoingAway && !mFaceLockedOut && mFaceSettingEnabledForUser;
+        final boolean awakeKeyguard = mKeyguardIsVisible && mDeviceInteractive && !mGoingToSleep;
+        final int user = getCurrentUser();
+
+        return (mBouncer || awakeKeyguard || shouldListenForFaceAssistant())
+                && !mSwitchingUser && !getUserCanSkipBouncer(user) && !isFaceDisabled(user)
+                && !mKeyguardGoingAway && !mFaceLockedOut && mFaceSettingEnabledForUser
+                && mUserManager.isUserUnlocked(user);
     }
 
 
diff --git a/packages/SystemUI/src/com/android/systemui/ActivityStarterDelegate.java b/packages/SystemUI/src/com/android/systemui/ActivityStarterDelegate.java
index b461f69..04f887b 100644
--- a/packages/SystemUI/src/com/android/systemui/ActivityStarterDelegate.java
+++ b/packages/SystemUI/src/com/android/systemui/ActivityStarterDelegate.java
@@ -53,6 +53,15 @@
     }
 
     @Override
+    public void startActivity(Intent intent, boolean onlyProvisioned, boolean dismissShade,
+            int flags) {
+        if (mActualStarter == null) {
+            return;
+        }
+        mActualStarter.startActivity(intent, onlyProvisioned, dismissShade, flags);
+    }
+
+    @Override
     public void startActivity(Intent intent, boolean dismissShade) {
         if (mActualStarter == null) {
             return;
diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
index 2aecc24..5040942 100644
--- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
+++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
@@ -19,8 +19,11 @@
 import static android.view.Display.DEFAULT_DISPLAY;
 
 import android.app.WallpaperManager;
+import android.content.BroadcastReceiver;
 import android.content.ComponentCallbacks2;
 import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.RecordingCanvas;
@@ -28,7 +31,9 @@
 import android.graphics.RectF;
 import android.graphics.Region.Op;
 import android.hardware.display.DisplayManager;
+import android.opengl.GLSurfaceView;
 import android.os.AsyncTask;
+import android.os.Build;
 import android.os.Handler;
 import android.os.Trace;
 import android.service.wallpaper.WallpaperService;
@@ -39,6 +44,7 @@
 import android.view.SurfaceHolder;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.systemui.glwallpaper.ImageWallpaperRenderer;
 
 import java.io.FileDescriptor;
 import java.io.IOException;
@@ -51,12 +57,17 @@
 public class ImageWallpaper extends WallpaperService {
     private static final String TAG = "ImageWallpaper";
     private static final String GL_LOG_TAG = "ImageWallpaperGL";
+    // TODO: Testing purpose, need to remove later, b/123616712.
+    private static final String SENSOR_EVENT_AWAKE = "systemui.test.event.awake";
+    // TODO: Testing purpose, need to remove later, b/123616712.
+    private static final String SENSOR_EVENT_SLEEP = "systemui.test.event.sleep";
     private static final boolean DEBUG = false;
     private static final String PROPERTY_KERNEL_QEMU = "ro.kernel.qemu";
     private static final long DELAY_FORGET_WALLPAPER = 5000;
 
     private WallpaperManager mWallpaperManager;
     private DrawableEngine mEngine;
+    private GLEngine mGlEngine;
 
     @Override
     public void onCreate() {
@@ -73,10 +84,112 @@
 
     @Override
     public Engine onCreateEngine() {
-        mEngine = new DrawableEngine();
-        return mEngine;
+        mGlEngine = new GLEngine(this);
+        return mGlEngine;
     }
 
+    class GLEngine extends Engine {
+        private GLWallpaperSurfaceView mWallpaperSurfaceView;
+
+        GLEngine(Context context) {
+            mWallpaperSurfaceView = new GLWallpaperSurfaceView(context);
+            mWallpaperSurfaceView.setRenderer(
+                    new ImageWallpaperRenderer(context, mWallpaperSurfaceView));
+            mWallpaperSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
+            setOffsetNotificationsEnabled(true);
+        }
+
+        @Override
+        public void onAmbientModeChanged(boolean inAmbientMode, long animationDuration) {
+            if (mWallpaperSurfaceView != null) {
+                mWallpaperSurfaceView.notifyAmbientModeChanged(inAmbientMode);
+            }
+        }
+
+        @Override
+        public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep,
+                float yOffsetStep, int xPixelOffset, int yPixelOffset) {
+            if (mWallpaperSurfaceView != null) {
+                mWallpaperSurfaceView.notifyOffsetsChanged(xOffset, yOffset);
+            }
+        }
+
+        private class GLWallpaperSurfaceView extends GLSurfaceView implements ImageGLView {
+            private SensorEventListener mEventListener;
+            private WallpaperStatusListener mWallpaperChangedListener;
+
+            // TODO: Testing purpose, need to remove later, b/123616712.
+            /**
+             * For testing only: adb shell am broadcast -a <INTENT>
+             */
+            private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+                @Override
+                public void onReceive(Context context, Intent intent) {
+                    if (intent == null) {
+                        return;
+                    }
+                    switch (intent.getAction()) {
+                        case SENSOR_EVENT_AWAKE:
+                            notifySensorEvents(true);
+                            break;
+                        case SENSOR_EVENT_SLEEP:
+                            notifySensorEvents(false);
+                            break;
+                    }
+                }
+            };
+
+            GLWallpaperSurfaceView(Context context) {
+                super(context);
+                setEGLContextClientVersion(2);
+                // TODO: Testing purpose, need to remove later, b/123616712.
+                if (Build.IS_DEBUGGABLE) {
+                    IntentFilter filter = new IntentFilter();
+                    filter.addAction(SENSOR_EVENT_AWAKE);
+                    filter.addAction(SENSOR_EVENT_SLEEP);
+                    registerReceiver(mReceiver, filter);
+                }
+            }
+
+            @Override
+            public SurfaceHolder getHolder() {
+                return getSurfaceHolder();
+            }
+
+            @Override
+            public void setRenderer(Renderer renderer) {
+                super.setRenderer(renderer);
+                mEventListener = (SensorEventListener) renderer;
+                mWallpaperChangedListener = (WallpaperStatusListener) renderer;
+            }
+
+            private void notifySensorEvents(boolean reach) {
+                if (mEventListener != null) {
+                    mEventListener.onSensorEvent(reach);
+                }
+            }
+
+            private void notifyAmbientModeChanged(boolean inAmbient) {
+                if (mWallpaperChangedListener != null) {
+                    mWallpaperChangedListener.onAmbientModeChanged(inAmbient);
+                }
+            }
+
+            private void notifyOffsetsChanged(float xOffset, float yOffset) {
+                if (mWallpaperChangedListener != null) {
+                    mWallpaperChangedListener.onOffsetsChanged(
+                            xOffset, yOffset, getHolder().getSurfaceFrame());
+                }
+            }
+
+            @Override
+            public void render() {
+                requestRender();
+            }
+        }
+    }
+
+    // TODO: Remove this engine, tracking on b/123617158.
     class DrawableEngine extends Engine {
         private final Runnable mUnloadWallpaperCallback = () -> {
             unloadWallpaper(false /* forgetSize */);
@@ -564,4 +677,46 @@
             }
         }
     }
+
+    /**
+     * A listener to trace sensor event.
+     */
+    public interface SensorEventListener {
+
+        /**
+         * Called back while sensor event comes.
+         * @param reach The status of sensor.
+         */
+        void onSensorEvent(boolean reach);
+    }
+
+    /**
+     * A listener to trace status of image wallpaper.
+     */
+    public interface WallpaperStatusListener {
+
+        /**
+         * Called back while ambient mode changes.
+         * @param inAmbientMode true if is in ambient mode, false otherwise.
+         */
+        void onAmbientModeChanged(boolean inAmbientMode);
+
+        /**
+         * Called back while wallpaper offsets.
+         * @param xOffset The offset portion along x.
+         * @param yOffset The offset portion along y.
+         */
+        void onOffsetsChanged(float xOffset, float yOffset, Rect frame);
+    }
+
+    /**
+     * An abstraction for view of GLRenderer.
+     */
+    public interface ImageGLView {
+
+        /**
+         * Ask the view to render.
+         */
+        void render();
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
index f66a57b..9b3d7ed 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
@@ -137,8 +137,10 @@
     }
 
     public NotificationIconAreaController createNotificationIconAreaController(Context context,
-            StatusBar statusBar, StatusBarStateController statusBarStateController) {
-        return new NotificationIconAreaController(context, statusBar, statusBarStateController);
+            StatusBar statusBar, StatusBarStateController statusBarStateController,
+            NotificationListener listener) {
+        return new NotificationIconAreaController(context, statusBar, statusBarStateController,
+                listener);
     }
 
     public KeyguardIndicationController createKeyguardIndicationController(Context context,
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BadgedImageView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BadgedImageView.java
index 36a813b..1154515 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BadgedImageView.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BadgedImageView.java
@@ -16,7 +16,9 @@
 package com.android.systemui.bubbles;
 
 import android.content.Context;
+import android.content.res.TypedArray;
 import android.graphics.Canvas;
+import android.graphics.Color;
 import android.graphics.Path;
 import android.graphics.Point;
 import android.graphics.Rect;
@@ -38,6 +40,7 @@
 
     private float mDotScale = 0f;
     private int mUpdateDotColor;
+    private int mBubbleDefaultBgColor;
     private boolean mShowUpdateDot;
     private boolean mOnLeft;
 
@@ -59,6 +62,11 @@
         setScaleType(ScaleType.CENTER_CROP);
         mIconSize = getResources().getDimensionPixelSize(R.dimen.individual_bubble_size);
         mDotRenderer = new BadgeRenderer(mIconSize);
+
+        TypedArray ta = context.obtainStyledAttributes(
+                new int[] {android.R.attr.colorBackgroundFloating});
+        mBubbleDefaultBgColor = ta.getColor(0, Color.WHITE);
+        ta.recycle();
     }
 
     // TODO: Clipping oval path isn't great: rerender image into a separate, rounded bitmap and
@@ -70,6 +78,7 @@
         mClipPath.addOval(getPaddingStart(), getPaddingTop(),
                 getWidth() - getPaddingEnd(), getHeight() - getPaddingBottom(), Path.Direction.CW);
         canvas.clipPath(mClipPath);
+        canvas.drawColor(mBubbleDefaultBgColor);
         super.onDraw(canvas);
 
         // After we've circle cropped what we're showing, restore so we don't clip the badge
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java
index b7bee30..404f2e5 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java
@@ -26,6 +26,7 @@
 import android.annotation.Nullable;
 import android.app.INotificationManager;
 import android.app.Notification;
+import android.app.NotificationChannel;
 import android.app.PendingIntent;
 import android.content.Context;
 import android.content.pm.ActivityInfo;
@@ -41,6 +42,8 @@
 import android.view.WindowManager;
 import android.widget.FrameLayout;
 
+import androidx.annotation.MainThread;
+
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.statusbar.NotificationVisibility;
 import com.android.systemui.Dependency;
@@ -75,11 +78,14 @@
     // Enables some subset of notifs to automatically become bubbles
     private static final boolean DEBUG_ENABLE_AUTO_BUBBLE = false;
 
-    // Secure settings
+    // Secure settings flags
+    // Feature level flag
+    private static final String ENABLE_BUBBLES = "experiment_enable_bubbles";
+    // Auto bubble flags set whether different notification types should be presented as a bubble
     private static final String ENABLE_AUTO_BUBBLE_MESSAGES = "experiment_autobubble_messaging";
     private static final String ENABLE_AUTO_BUBBLE_ONGOING = "experiment_autobubble_ongoing";
     private static final String ENABLE_AUTO_BUBBLE_ALL = "experiment_autobubble_all";
-    private static final String ENABLE_BUBBLE_ACTIVITY_VIEW = "experiment_bubble_activity_view";
+    // Use an activity view for an auto-bubbled notification if it has an appropriate content intent
     private static final String ENABLE_BUBBLE_CONTENT_INTENT = "experiment_bubble_content_intent";
 
     private final Context mContext;
@@ -261,8 +267,8 @@
                     R.layout.bubble_view, mStackView, false /* attachToRoot */);
             bubble.setNotif(notif);
             PendingIntent bubbleIntent = getValidBubbleIntent(notif);
-            if (shouldUseActivityView(mContext) || bubbleIntent != null) {
-                bubble.setBubbleIntent(getValidBubbleIntent(notif));
+            if (bubbleIntent != null) {
+                bubble.setBubbleIntent(bubbleIntent);
             }
             mBubbles.put(bubble.getKey(), bubble);
             mStackView.addBubble(bubble);
@@ -270,25 +276,12 @@
         updateVisibility();
     }
 
-    @Nullable
-    private PendingIntent getValidBubbleIntent(NotificationEntry notif) {
-        Notification notification = notif.notification.getNotification();
-        if (canLaunchInActivityView(notification.getBubbleMetadata() != null
-                ? notification.getBubbleMetadata().getIntent() : null)) {
-            return notification.getBubbleMetadata().getIntent();
-        } else if (shouldUseContentIntent(mContext)
-                && canLaunchInActivityView(notification.contentIntent)) {
-            Log.d(TAG, "[addBubble " + notif.key
-                    + "]: No appOverlayIntent, using contentIntent.");
-            return notification.contentIntent;
-        }
-        Log.d(TAG, "[addBubble " + notif.key + "]: No supported intent for ActivityView.");
-        return null;
-    }
-
     /**
      * Removes the bubble associated with the {@param uri}.
+     * <p>
+     * Must be called from the main thread.
      */
+    @MainThread
     void removeBubble(String key) {
         BubbleView bv = mBubbles.remove(key);
         if (mStackView != null && bv != null) {
@@ -308,7 +301,10 @@
     private final NotificationEntryListener mEntryListener = new NotificationEntryListener() {
         @Override
         public void onPendingEntryAdded(NotificationEntry entry) {
-            if (shouldAutoBubble(mContext, entry) || shouldBubble(entry)) {
+            if (!areBubblesEnabled(mContext)) {
+                return;
+            }
+            if (shouldAutoBubbleForFlags(mContext, entry) || shouldBubble(entry)) {
                 // TODO: handle group summaries
                 // It's a new notif, it shows in the shade and as a bubble
                 entry.setIsBubble(true);
@@ -319,6 +315,9 @@
         @Override
         public void onEntryInflated(NotificationEntry entry,
                 @NotificationInflater.InflationFlag int inflatedFlags) {
+            if (!areBubblesEnabled(mContext)) {
+                return;
+            }
             if (entry.isBubble() && mNotificationInterruptionStateProvider.shouldBubbleUp(entry)) {
                 updateBubble(entry, true /* updatePosition */);
             }
@@ -326,6 +325,9 @@
 
         @Override
         public void onPreEntryUpdated(NotificationEntry entry) {
+            if (!areBubblesEnabled(mContext)) {
+                return;
+            }
             if (mNotificationInterruptionStateProvider.shouldBubbleUp(entry)
                     && alertAgain(entry, entry.notification.getNotification())) {
                 entry.setShowInShadeWhenBubble(true);
@@ -341,6 +343,9 @@
         public void onEntryRemoved(NotificationEntry entry,
                 @Nullable NotificationVisibility visibility,
                 boolean removedByUser) {
+            if (!areBubblesEnabled(mContext)) {
+                return;
+            }
             entry.setShowInShadeWhenBubble(false);
             if (mBubbles.containsKey(entry.key)) {
                 mBubbles.get(entry.key).updateDotVisibility();
@@ -395,6 +400,30 @@
         return mTempRect;
     }
 
+    @VisibleForTesting
+    BubbleStackView getStackView() {
+        return mStackView;
+    }
+
+    @Nullable
+    private PendingIntent getValidBubbleIntent(NotificationEntry notif) {
+        Notification notification = notif.notification.getNotification();
+        Notification.BubbleMetadata data = notif.getBubbleMetadata();
+        if (data != null && canLaunchInActivityView(data.getIntent())) {
+            return data.getIntent();
+        } else if (shouldUseContentIntent(mContext)
+                && canLaunchInActivityView(notification.contentIntent)) {
+            Log.d(TAG, "[addBubble " + notif.key
+                    + "]: No appOverlayIntent, using contentIntent.");
+            return notification.contentIntent;
+        }
+        Log.d(TAG, "[addBubble " + notif.key + "]: No supported intent for ActivityView.");
+        return null;
+    }
+
+    /**
+     * Whether an intent is properly configured to display in an {@link android.app.ActivityView}.
+     */
     private boolean canLaunchInActivityView(PendingIntent intent) {
         if (intent == null) {
             return false;
@@ -406,15 +435,11 @@
                 && (info.flags & ActivityInfo.FLAG_ALLOW_EMBEDDED) != 0;
     }
 
-    @VisibleForTesting
-    BubbleStackView getStackView() {
-        return mStackView;
-    }
-
     /**
      * Whether the notification has been developer configured to bubble and is allowed by the user.
      */
-    private boolean shouldBubble(NotificationEntry entry) {
+    @VisibleForTesting
+    protected boolean shouldBubble(NotificationEntry entry) {
         StatusBarNotification n = entry.notification;
         boolean canAppOverlay = false;
         try {
@@ -424,21 +449,19 @@
             Log.w(TAG, "Error calling NoMan to determine if app can overlay", e);
         }
 
-        boolean canChannelOverlay = mNotificationEntryManager.getNotificationData().getChannel(
-                entry.key).canBubble();
+        NotificationChannel channel = mNotificationEntryManager.getNotificationData().getChannel(
+                entry.key);
+        boolean canChannelOverlay = channel != null && channel.canBubble();
         boolean hasOverlayIntent = n.getNotification().getBubbleMetadata() != null
                 && n.getNotification().getBubbleMetadata().getIntent() != null;
         return hasOverlayIntent && canChannelOverlay && canAppOverlay;
     }
 
     /**
-     * Whether the notification should bubble or not. Gated by debug flag.
-     * <p>
-     * If a notification has been set to bubble via proper bubble APIs or if it is an important
-     * message-like notification.
-     * </p>
+     * Whether the notification should automatically bubble or not. Gated by secure settings flags.
      */
-    private boolean shouldAutoBubble(Context context, NotificationEntry entry) {
+    @VisibleForTesting
+    protected boolean shouldAutoBubbleForFlags(Context context, NotificationEntry entry) {
         if (entry.isBubbleDismissed()) {
             return false;
         }
@@ -485,13 +508,13 @@
                 ENABLE_AUTO_BUBBLE_ALL, 0) != 0;
     }
 
-    private static boolean shouldUseActivityView(Context context) {
-        return Settings.Secure.getInt(context.getContentResolver(),
-                ENABLE_BUBBLE_ACTIVITY_VIEW, 0) != 0;
-    }
-
     private static boolean shouldUseContentIntent(Context context) {
         return Settings.Secure.getInt(context.getContentResolver(),
                 ENABLE_BUBBLE_CONTENT_INTENT, 0) != 0;
     }
+
+    private static boolean areBubblesEnabled(Context context) {
+        return Settings.Secure.getInt(context.getContentResolver(),
+                ENABLE_BUBBLES, 1) != 0;
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedViewContainer.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedViewContainer.java
index 71ae1f8..67b18fd 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedViewContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedViewContainer.java
@@ -17,31 +17,53 @@
 package com.android.systemui.bubbles;
 
 import android.annotation.Nullable;
+import android.app.Notification;
+import android.app.PendingIntent;
 import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
 import android.content.res.Resources;
+import android.content.res.TypedArray;
 import android.graphics.Color;
 import android.graphics.drawable.ShapeDrawable;
+import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.AttributeSet;
+import android.util.Log;
 import android.view.View;
+import android.widget.ImageButton;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
 import com.android.systemui.R;
 import com.android.systemui.recents.TriangleShape;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
 
 /**
  * Container for the expanded bubble view, handles rendering the caret and header of the view.
  */
-public class BubbleExpandedViewContainer extends LinearLayout {
+public class BubbleExpandedViewContainer extends LinearLayout implements View.OnClickListener {
+    private static final String TAG = "BubbleExpandedView";
 
     // The triangle pointing to the expanded view
     private View mPointerView;
     // The view displayed between the pointer and the expanded view
     private TextView mHeaderView;
+    // Tappable header icon deeplinking into the app
+    private ImageButton mDeepLinkIcon;
+    // Tappable header icon deeplinking into notification settings
+    private ImageButton mSettingsIcon;
     // The view that is being displayed for the expanded state
     private View mExpandedView;
 
+    private NotificationEntry mEntry;
+    private PackageManager mPm;
+    private String mAppName;
+
+    // Need reference to let it know to collapse when new task is launched
+    private BubbleStackView mStackView;
+
     public BubbleExpandedViewContainer(Context context) {
         this(context, null);
     }
@@ -57,7 +79,7 @@
     public BubbleExpandedViewContainer(Context context, AttributeSet attrs, int defStyleAttr,
             int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
-        setOrientation(VERTICAL);
+        mPm = context.getPackageManager();
     }
 
     @Override
@@ -68,11 +90,85 @@
         mPointerView = findViewById(R.id.pointer_view);
         int width = res.getDimensionPixelSize(R.dimen.bubble_pointer_width);
         int height = res.getDimensionPixelSize(R.dimen.bubble_pointer_height);
+
+        TypedArray ta = getContext().obtainStyledAttributes(
+                new int[] {android.R.attr.colorBackgroundFloating});
+        int bgColor = ta.getColor(0, Color.WHITE);
+        ta.recycle();
+
         ShapeDrawable triangleDrawable = new ShapeDrawable(
                 TriangleShape.create(width, height, true /* pointUp */));
-        triangleDrawable.setTint(Color.WHITE); // TODO: dark mode
+        triangleDrawable.setTint(bgColor);
         mPointerView.setBackground(triangleDrawable);
-        mHeaderView = findViewById(R.id.bubble_content_header);
+
+        mHeaderView = findViewById(R.id.header_text);
+        mDeepLinkIcon = findViewById(R.id.deep_link_button);
+        mSettingsIcon = findViewById(R.id.settings_button);
+        mDeepLinkIcon.setOnClickListener(this);
+        mSettingsIcon.setOnClickListener(this);
+    }
+
+    /**
+     * Sets the notification entry used to populate this view.
+     */
+    public void setEntry(NotificationEntry entry, BubbleStackView stackView) {
+        mStackView = stackView;
+        mEntry = entry;
+
+        ApplicationInfo info;
+        try {
+            info = mPm.getApplicationInfo(
+                    entry.notification.getPackageName(),
+                    PackageManager.MATCH_UNINSTALLED_PACKAGES
+                            | PackageManager.MATCH_DISABLED_COMPONENTS
+                            | PackageManager.MATCH_DIRECT_BOOT_UNAWARE
+                            | PackageManager.MATCH_DIRECT_BOOT_AWARE);
+            if (info != null) {
+                mAppName = String.valueOf(mPm.getApplicationLabel(info));
+            }
+        } catch (PackageManager.NameNotFoundException e) {
+            // Ahh... just use package name
+            mAppName = entry.notification.getPackageName();
+        }
+
+        updateHeaderView();
+    }
+
+    private void updateHeaderView() {
+        mSettingsIcon.setContentDescription(getResources().getString(
+                R.string.bubbles_settings_button_description, mAppName));
+        mDeepLinkIcon.setContentDescription(getResources().getString(
+                R.string.bubbles_deep_link_button_description, mAppName));
+        if (mEntry != null && mEntry.getBubbleMetadata() != null) {
+            setHeaderText(mEntry.getBubbleMetadata().getTitle());
+        } else {
+            // This should only happen if we're auto-bubbling notification content that isn't
+            // explicitly a bubble
+            setHeaderText(mAppName);
+        }
+    }
+
+    @Override
+    public void onClick(View view) {
+        if (mEntry == null) {
+            return;
+        }
+        Notification n = mEntry.notification.getNotification();
+        int id = view.getId();
+        if (id == R.id.deep_link_button) {
+            mStackView.collapseStack(() -> {
+                try {
+                    n.contentIntent.send();
+                } catch (PendingIntent.CanceledException e) {
+                    Log.w(TAG, "Failed to send intent for bubble with key: "
+                            + (mEntry != null ? mEntry.key : " null entry"));
+                }
+            });
+        } else if (id == R.id.settings_button) {
+            Intent intent = getSettingsIntent(mEntry.notification.getPackageName(),
+                    mEntry.notification.getUid());
+            mStackView.collapseStack(() -> mContext.startActivity(intent));
+        }
     }
 
     /**
@@ -87,7 +183,7 @@
     /**
      * Set the text displayed within the header.
      */
-    public void setHeaderText(CharSequence text) {
+    private void setHeaderText(CharSequence text) {
         mHeaderView.setText(text);
         mHeaderView.setVisibility(TextUtils.isEmpty(text) ? GONE : VISIBLE);
     }
@@ -115,4 +211,13 @@
     public View getExpandedView() {
         return mExpandedView;
     }
+
+    private Intent getSettingsIntent(String packageName, final int appUid) {
+        final Intent intent = new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS);
+        intent.putExtra(Settings.EXTRA_APP_PACKAGE, packageName);
+        intent.putExtra(Settings.EXTRA_APP_UID, appUid);
+        intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        return intent;
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java
index b584f67..b6acd63 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java
@@ -20,18 +20,21 @@
 import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
 
 import android.app.ActivityView;
-import android.app.PendingIntent;
 import android.content.Context;
 import android.content.res.Resources;
+import android.graphics.Outline;
 import android.graphics.Point;
 import android.graphics.PointF;
 import android.graphics.Rect;
 import android.graphics.RectF;
+import android.service.notification.StatusBarNotification;
 import android.util.Log;
+import android.util.StatsLog;
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.ViewOutlineProvider;
 import android.view.ViewTreeObserver;
 import android.view.WindowInsets;
 import android.view.WindowManager;
@@ -53,6 +56,9 @@
 import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
 import com.android.systemui.statusbar.notification.stack.ExpandableViewState;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
 /**
  * Renders bubbles in a stack and handles animating expanded and collapsed states.
  */
@@ -235,16 +241,24 @@
      * Sets the bubble that should be expanded and expands if needed.
      */
     public void setExpandedBubble(BubbleView bubbleToExpand) {
+        if (mIsExpanded && !bubbleToExpand.equals(mExpandedBubble)) {
+            // Previously expanded, notify that this bubble is no longer expanded
+            notifyExpansionChanged(mExpandedBubble, false /* expanded */);
+        }
+        BubbleView prevBubble = mExpandedBubble;
         mExpandedBubble = bubbleToExpand;
-        boolean prevExpanded = mIsExpanded;
-        mIsExpanded = true;
-        if (!prevExpanded) {
+        if (!mIsExpanded) {
             // If we weren't previously expanded we should animate open.
             animateExpansion(true /* expand */);
+            logBubbleEvent(mExpandedBubble, StatsLog.BUBBLE_UICHANGED__ACTION__EXPANDED);
         } else {
-            // If we were expanded just update the views
+            // Otherwise just update the views
+            // TODO: probably animate / page to expanded one
             updateExpandedBubble();
+            updatePointerPosition();
             requestUpdate();
+            logBubbleEvent(prevBubble, StatsLog.BUBBLE_UICHANGED__ACTION__COLLAPSED);
+            logBubbleEvent(mExpandedBubble, StatsLog.BUBBLE_UICHANGED__ACTION__EXPANDED);
         }
         mExpandedBubble.getEntry().setShowInShadeWhenBubble(false);
         notifyExpansionChanged(mExpandedBubble, true /* expanded */);
@@ -273,6 +287,7 @@
                 new FrameLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT));
         ViewClippingUtil.setClippingDeactivated(bubbleView, true, mClippingParameters);
         requestUpdate();
+        logBubbleEvent(bubbleView, StatsLog.BUBBLE_UICHANGED__ACTION__POSTED);
     }
 
     /**
@@ -281,20 +296,24 @@
     public void removeBubble(BubbleView bubbleView) {
         int removedIndex = mBubbleContainer.indexOfChild(bubbleView);
         mBubbleContainer.removeView(bubbleView);
-        boolean wasExpanded = mIsExpanded;
         int bubbleCount = mBubbleContainer.getChildCount();
-        if (mIsExpanded && bubbleView.equals(mExpandedBubble) && bubbleCount > 0) {
+        if (bubbleCount == 0) {
+            // If no bubbles remain, collapse the entire stack.
+            collapseStack();
+            return;
+        } else if (bubbleView.equals(mExpandedBubble)) {
+            // Was the current bubble just removed?
             // If we have other bubbles and are expanded go to the next one or previous
             // if the bubble removed was last
             int nextIndex = bubbleCount > removedIndex ? removedIndex : bubbleCount - 1;
             BubbleView expandedBubble = (BubbleView) mBubbleContainer.getChildAt(nextIndex);
-            setExpandedBubble(expandedBubble);
+            if (mIsExpanded) {
+                setExpandedBubble(expandedBubble);
+            } else {
+                mExpandedBubble = null;
+            }
         }
-        mIsExpanded = wasExpanded && mBubbleContainer.getChildCount() > 0;
-        if (wasExpanded != mIsExpanded) {
-            notifyExpansionChanged(mExpandedBubble, mIsExpanded);
-        }
-        requestUpdate();
+        logBubbleEvent(bubbleView, StatsLog.BUBBLE_UICHANGED__ACTION__DISMISSED);
     }
 
     /**
@@ -303,6 +322,8 @@
     public void stackDismissed() {
         collapseStack();
         mBubbleContainer.removeAllViews();
+        logBubbleEvent(null /* no bubble associated with bubble stack dismiss */,
+                StatsLog.BUBBLE_UICHANGED__ACTION__STACK_DISMISSED);
     }
 
     /**
@@ -318,8 +339,7 @@
         if (updatePosition && !mIsExpanded) {
             // If alerting it gets promoted to top of the stack.
             if (mBubbleContainer.indexOfChild(bubbleView) != 0) {
-                mBubbleContainer.removeViewAndThen(bubbleView,
-                        () -> mBubbleContainer.addView(bubbleView, 0));
+                mBubbleContainer.moveViewTo(bubbleView, 0);
             }
             requestUpdate();
         }
@@ -327,6 +347,7 @@
             entry.setShowInShadeWhenBubble(false);
             requestUpdate();
         }
+        logBubbleEvent(bubbleView, StatsLog.BUBBLE_UICHANGED__ACTION__UPDATED);
     }
 
     /**
@@ -362,18 +383,24 @@
             // TODO: Save opened bubble & move it to top of stack
             animateExpansion(false /* shouldExpand */);
             notifyExpansionChanged(mExpandedBubble, mIsExpanded);
+            logBubbleEvent(mExpandedBubble, StatsLog.BUBBLE_UICHANGED__ACTION__COLLAPSED);
         }
     }
 
+    void collapseStack(Runnable endRunnable) {
+        collapseStack();
+        // TODO - use the runnable at end of animation
+        endRunnable.run();
+    }
+
     /**
      * Expands the stack fo bubbles.
      */
     public void expandStack() {
         if (!mIsExpanded) {
             mExpandedBubble = getTopBubble();
-            mExpandedBubble.getEntry().setShowInShadeWhenBubble(false);
-            animateExpansion(true /* shouldExpand */);
-            notifyExpansionChanged(mExpandedBubble, true /* expanded */);
+            setExpandedBubble(mExpandedBubble);
+            logBubbleEvent(mExpandedBubble, StatsLog.BUBBLE_UICHANGED__ACTION__STACK_EXPANDED);
         }
     }
 
@@ -385,7 +412,6 @@
             mIsExpanded = shouldExpand;
             updateExpandedBubble();
             applyCurrentState();
-            //requestUpdate();
 
             mIsAnimating = true;
 
@@ -398,7 +424,10 @@
             if (shouldExpand) {
                 mBubbleContainer.setController(mExpandedAnimationController);
                 mExpandedAnimationController.expandFromStack(
-                                mStackAnimationController.getStackPosition(), updateAfter);
+                                mStackAnimationController.getStackPosition(), () -> {
+                                updatePointerPosition();
+                                updateAfter.run();
+                        });
             } else {
                 mBubbleContainer.cancelAllAnimations();
                 mExpandedAnimationController.collapseBackToStack(
@@ -564,6 +593,9 @@
                         .setStiffness(SpringForce.STIFFNESS_LOW)
                         .setDampingRatio(SPRING_DAMPING_RATIO),
                 /* destination */ null);
+
+        logBubbleEvent(null /* no bubble associated with bubble stack move */,
+                StatsLog.BUBBLE_UICHANGED__ACTION__STACK_MOVED);
     }
 
     /**
@@ -623,6 +655,7 @@
             return;
         }
 
+        mExpandedViewContainer.setEntry(mExpandedBubble.getEntry(), this);
         if (mExpandedBubble.hasAppOverlayIntent()) {
             // Bubble with activity view expanded state
             ActivityView expandedView = mExpandedBubble.getActivityView();
@@ -630,8 +663,6 @@
             expandedView.setLayoutParams(new LinearLayout.LayoutParams(
                     ViewGroup.LayoutParams.MATCH_PARENT, mExpandedBubbleHeight));
 
-            final PendingIntent intent = mExpandedBubble.getAppOverlayIntent();
-            mExpandedViewContainer.setHeaderText(intent.getIntent().getComponent().toShortString());
             mExpandedViewContainer.setExpandedView(expandedView);
         } else {
             // Bubble with notification view expanded state
@@ -645,12 +676,7 @@
             } else {
                 mExpandedViewContainer.setExpandedView(null);
             }
-            // Bubble with notification as expanded state doesn't need a header / title
-            mExpandedViewContainer.setHeaderText(null);
-
         }
-        float pointerPosition = mExpandedBubble.getPosition().x + (mExpandedBubble.getWidth() / 2);
-        mExpandedViewContainer.setPointerPosition((int) pointerPosition);
     }
 
     private void applyCurrentState() {
@@ -674,6 +700,25 @@
             BubbleView bv = (BubbleView) mBubbleContainer.getChildAt(i);
             bv.updateDotVisibility();
             bv.setZ(bubbsCount - i);
+
+            // Draw the shadow around the circle inscribed within the bubble's bounds. This
+            // (intentionally) does not draw a shadow behind the update dot, which should be drawing
+            // its own shadow since it's on a different (higher) plane.
+            bv.setOutlineProvider(new ViewOutlineProvider() {
+                @Override
+                public void getOutline(View view, Outline outline) {
+                    outline.setOval(0, 0, mBubbleSize, mBubbleSize);
+                }
+            });
+            bv.setClipToOutline(false);
+        }
+    }
+
+    private void updatePointerPosition() {
+        if (mExpandedBubble != null) {
+            float pointerPosition = mExpandedBubble.getPosition().x
+                    + (mExpandedBubble.getWidth() / 2f);
+            mExpandedViewContainer.setPointerPosition((int) pointerPosition);
         }
     }
 
@@ -710,4 +755,72 @@
         viewState.headsUpIsVisible = false;
         viewState.applyToView(view);
     }
+
+    /**
+     * @return the number of bubbles in the stack view.
+     */
+    private int getBubbleCount() {
+        return mBubbleContainer.getChildCount();
+    }
+
+    /**
+     * Finds the bubble index within the stack.
+     *
+     * @param bubbleView the view of the bubble.
+     * @return the index of the bubble view within the bubble stack. The range of the position
+     * is between 0 and the bubble count minus 1.
+     */
+    private int getBubbleIndex(BubbleView bubbleView) {
+        return mBubbleContainer.indexOfChild(bubbleView);
+    }
+
+    /**
+     * @return the normalized x-axis position of the bubble stack rounded to 4 decimal places.
+     */
+    private float getNormalizedXPosition() {
+        return new BigDecimal(getPosition().x / mDisplaySize.x)
+                .setScale(4, RoundingMode.CEILING.HALF_UP)
+                .floatValue();
+    }
+
+    /**
+     * @return the normalized y-axis position of the bubble stack rounded to 4 decimal places.
+     */
+    private float getNormalizedYPosition() {
+        return new BigDecimal(getPosition().y / mDisplaySize.y)
+                .setScale(4, RoundingMode.CEILING.HALF_UP)
+                .floatValue();
+    }
+
+    /**
+     * Logs the bubble UI event.
+     *
+     * @param bubble the bubble that is being interacted on. Null value indicates that
+     *               the user interaction is not specific to one bubble.
+     * @param action the user interaction enum.
+     */
+    private void logBubbleEvent(@Nullable BubbleView bubble, int action) {
+        if (bubble == null) {
+            StatsLog.write(StatsLog.BUBBLE_UI_CHANGED,
+                    null /* package name */,
+                    null /* notification channel */,
+                    0 /* notification ID */,
+                    0 /* bubble position */,
+                    getBubbleCount(),
+                    action,
+                    getNormalizedXPosition(),
+                    getNormalizedYPosition());
+        } else {
+            StatusBarNotification notification = bubble.getEntry().notification;
+            StatsLog.write(StatsLog.BUBBLE_UI_CHANGED,
+                    notification.getPackageName(),
+                    notification.getNotification().getChannelId(),
+                    notification.getId(),
+                    getBubbleIndex(bubble),
+                    getBubbleCount(),
+                    action,
+                    getNormalizedXPosition(),
+                    getNormalizedYPosition());
+        }
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleView.java
index dc94832..2c23c0c 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleView.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleView.java
@@ -37,6 +37,7 @@
 import android.widget.TextView;
 
 import com.android.internal.graphics.ColorUtils;
+import com.android.systemui.Dependency;
 import com.android.systemui.Interpolators;
 import com.android.systemui.R;
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
@@ -59,6 +60,7 @@
 
     private NotificationEntry mEntry;
     private PendingIntent mAppOverlayIntent;
+    private BubbleController mBubbleController;
     private ActivityView mActivityView;
     private boolean mActivityViewReady;
     private boolean mActivityViewStarted;
@@ -81,6 +83,7 @@
         // XXX: can this padding just be on the view and we look it up?
         mPadding = getResources().getDimensionPixelSize(R.dimen.bubble_view_padding);
         mIconInset = getResources().getDimensionPixelSize(R.dimen.bubble_icon_inset);
+        mBubbleController = Dependency.get(BubbleController.class);
     }
 
     @Override
@@ -248,6 +251,20 @@
                 public void onActivityViewDestroyed(ActivityView view) {
                     mActivityViewReady = false;
                 }
+
+                /**
+                 * This is only called for tasks on this ActivityView, which is also set to
+                 * single-task mode -- meaning never more than one task on this display. If a task
+                 * is being removed, it's the top Activity finishing and this bubble should
+                 * be removed or collapsed.
+                 */
+                @Override
+                public void onTaskRemovalStarted(int taskId) {
+                    if (mEntry != null) {
+                        // Must post because this is called from a binder thread.
+                        post(() -> mBubbleController.removeBubble(mEntry.key));
+                    }
+                }
             });
         }
         return mActivityView;
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/animation/PhysicsAnimationLayout.java b/packages/SystemUI/src/com/android/systemui/bubbles/animation/PhysicsAnimationLayout.java
index 1ced3a4..e4e6bc9 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/animation/PhysicsAnimationLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/animation/PhysicsAnimationLayout.java
@@ -27,9 +27,8 @@
 
 import com.android.systemui.R;
 
-import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.List;
+import java.util.HashSet;
 import java.util.Set;
 
 /**
@@ -122,12 +121,8 @@
     protected final HashMap<DynamicAnimation.ViewProperty, DynamicAnimation.OnAnimationEndListener>
             mEndListenerForProperty = new HashMap<>();
 
-    /**
-     * List of views that were passed to removeView, but are currently being animated out. These
-     * views will be actually removed by the controller (via super.removeView) once they're done
-     * animating out.
-     */
-    private final List<View> mViewsToBeActuallyRemoved = new ArrayList<>();
+    /** Set of currently rendered transient views. */
+    private final Set<View> mTransientViews = new HashSet<>();
 
     /** The currently active animation controller. */
     private PhysicsAnimationController mController;
@@ -186,23 +181,6 @@
         mEndListenerForProperty.remove(property);
     }
 
-    /**
-     * Returns the index of the view that precedes the given index, ignoring views that were passed
-     * to removeView, but are currently being animated out before actually being removed.
-     *
-     * @return index of the preceding view, or -1 if there are none.
-     */
-    public int getPrecedingNonRemovedViewIndex(int index) {
-        for (int i = index + 1; i < getChildCount(); i++) {
-            View precedingView = getChildAt(i);
-            if (!mViewsToBeActuallyRemoved.contains(precedingView)) {
-                return i;
-            }
-        }
-
-        return -1;
-    }
-
     @Override
     public void addView(View child, int index, ViewGroup.LayoutParams params) {
         super.addView(child, index, params);
@@ -224,6 +202,24 @@
         removeViewAndThen(view, /* callback */ null);
     }
 
+    @Override
+    public void addTransientView(View view, int index) {
+        super.addTransientView(view, index);
+        mTransientViews.add(view);
+    }
+
+    @Override
+    public void removeTransientView(View view) {
+        super.removeTransientView(view);
+        mTransientViews.remove(view);
+    }
+
+    /** Immediately moves the view from wherever it currently is, to the given index. */
+    public void moveViewTo(View view, int index) {
+        super.removeView(view);
+        addView(view, index);
+    }
+
     /**
      * Let the controller know that this view should be removed, and then call the callback once the
      * controller has finished any removal animations and the view has actually been removed.
@@ -231,23 +227,31 @@
     public void removeViewAndThen(View view, Runnable callback) {
         if (mController != null) {
             final int index = indexOfChild(view);
-            // Remove the view only if it exists in this layout, and we're not already working on
-            // animating its removal.
-            if (index > -1 && !mViewsToBeActuallyRemoved.contains(view)) {
-                mViewsToBeActuallyRemoved.add(view);
-                setChildrenVisibility();
 
-                // Tell the controller to animate this view out, and call the callback when it wants
-                // to actually remove the view.
-                mController.onChildToBeRemoved(view, index, () -> {
-                    removeViewImmediateAndThen(view, callback);
-                    mViewsToBeActuallyRemoved.remove(view);
-                });
-            }
+            // Remove the view and add it back as a transient view so we can animate it out.
+            super.removeView(view);
+            addTransientView(view, index);
+
+            setChildrenVisibility();
+
+            // Tell the controller to animate this view out, and call the callback when it's
+            // finished.
+            mController.onChildToBeRemoved(view, index, () -> {
+                // Done animating, remove the transient view.
+                removeTransientView(view);
+
+                if (callback != null) {
+                    callback.run();
+                }
+            });
         } else {
             // Without a controller, nobody will animate this view out, so it gets an unceremonious
             // departure.
-            removeViewImmediateAndThen(view, callback);
+            super.removeView(view);
+
+            if (callback != null) {
+                callback.run();
+            }
         }
     }
 
@@ -278,17 +282,18 @@
     }
 
     /**
-     * Animates the property of the child at the given index to the given value, then runs the
-     * callback provided when the animation ends.
+     * Animates the property of the given child view, then runs the callback provided when the
+     * animation ends.
      */
-    protected void animateValueForChildAtIndex(
+    protected void animateValueForChild(
             DynamicAnimation.ViewProperty property,
-            int index,
+            View view,
             float value,
             float startVel,
             Runnable after) {
-        if (index < getChildCount()) {
-            final SpringAnimation animation = getAnimationAtIndex(property, index);
+        if (view != null) {
+            final SpringAnimation animation =
+                    (SpringAnimation) view.getTag(getTagIdForProperty(property));
             if (after != null) {
                 animation.addEndListener(new OneTimeEndListener() {
                     @Override
@@ -300,14 +305,38 @@
                 });
             }
 
-            if (startVel != Float.MAX_VALUE) {
-                animation.setStartVelocity(startVel);
-            }
-
             animation.animateToFinalPosition(value);
         }
     }
 
+    protected void animateValueForChild(
+            DynamicAnimation.ViewProperty property,
+            View view,
+            float value,
+            Runnable after) {
+        animateValueForChild(property, view, value, Float.MAX_VALUE, after);
+    }
+
+    protected void animateValueForChild(
+            DynamicAnimation.ViewProperty property,
+            View view,
+            float value) {
+        animateValueForChild(property, view, value, Float.MAX_VALUE, /* after */ null);
+    }
+
+    /**
+     * Animates the property of the child at the given index to the given value, then runs the
+     * callback provided when the animation ends.
+     */
+    protected void animateValueForChildAtIndex(
+            DynamicAnimation.ViewProperty property,
+            int index,
+            float value,
+            float startVel,
+            Runnable after) {
+        animateValueForChild(property, getChildAt(index), value, startVel, after);
+    }
+
     /** Shortcut to animate a value with a callback, but no start velocity. */
     protected void animateValueForChildAtIndex(
             DynamicAnimation.ViewProperty property,
@@ -366,18 +395,6 @@
         }
     }
 
-
-    /** Immediately removes the view, without notifying the controller, then runs the callback. */
-    private void removeViewImmediateAndThen(View view, Runnable callback) {
-        super.removeView(view);
-
-        if (callback != null) {
-            callback.run();
-        }
-
-        setChildrenVisibility();
-    }
-
     /**
      * Retrieves the animation of the given property from the view at the given index via the view
      * tag system.
@@ -401,7 +418,11 @@
         newAnim.addUpdateListener((animation, value, velocity) -> {
             final int nextAnimInChain =
                     mController.getNextAnimationInChain(property, indexOfChild(child));
-            if (nextAnimInChain == PhysicsAnimationController.NONE) {
+
+            // If the controller doesn't want us to chain, or if we're a transient view in the
+            // process of being removed, don't chain.
+            if (nextAnimInChain == PhysicsAnimationController.NONE
+                    || mTransientViews.contains(child)) {
                 return;
             }
 
@@ -412,9 +433,7 @@
             // If this property's animations should be chained, then check to see if there is a
             // subsequent animation within the rendering limit, and if so, tell it to animate to
             // this animation's new value (plus the offset).
-            if (nextAnimInChain < Math.min(
-                    getChildCount(),
-                    mMaxRenderedChildren + mViewsToBeActuallyRemoved.size())) {
+            if (nextAnimInChain < Math.min(getChildCount(), mMaxRenderedChildren)) {
                 getAnimationAtIndex(property, animIndex + 1)
                         .animateToFinalPosition(value + offset);
             } else if (nextAnimInChain < getChildCount()) {
@@ -442,9 +461,7 @@
                     // Ignore views that are animating out when calculating whether to hide the
                     // view. That is, if we're supposed to render 5 views, but 4 are animating out
                     // and will soon be removed, render up to 9 views temporarily.
-                    i < (mMaxRenderedChildren + mViewsToBeActuallyRemoved.size())
-                        ? View.VISIBLE
-                        : View.GONE);
+                    i < mMaxRenderedChildren ? View.VISIBLE : View.GONE);
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/animation/StackAnimationController.java b/packages/SystemUI/src/com/android/systemui/bubbles/animation/StackAnimationController.java
index 0f51376..23c6fd3 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/animation/StackAnimationController.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/animation/StackAnimationController.java
@@ -53,8 +53,8 @@
     /** Scale factor to use initially for new bubbles being animated in. */
     private static final float ANIMATE_IN_STARTING_SCALE = 1.15f;
 
-    /** Translation factor (multiplied by stack offset) to use for new bubbles being animated in. */
-    private static final int ANIMATE_IN_TRANSLATION_FACTOR = 4;
+    /** Translation factor (multiplied by stack offset) to use for bubbles being animated in/out. */
+    private static final int ANIMATE_TRANSLATION_FACTOR = 4;
 
     /**
      * Values to use for the default {@link SpringForce} provided to the physics animation layout.
@@ -309,7 +309,7 @@
             // animate in from this position. Since the animations are chained, when the new bubble
             // flies in from the side, it will push the other ones out of the way.
             float xOffset = getOffsetForChainedPropertyAnimation(DynamicAnimation.TRANSLATION_X);
-            child.setTranslationX(mStackPosition.x - (ANIMATE_IN_TRANSLATION_FACTOR * xOffset));
+            child.setTranslationX(mStackPosition.x - ANIMATE_TRANSLATION_FACTOR * xOffset);
             mLayout.animateValueForChildAtIndex(
                     DynamicAnimation.TRANSLATION_X, 0, mStackPosition.x);
         }
@@ -318,27 +318,19 @@
     @Override
     void onChildToBeRemoved(View child, int index, Runnable actuallyRemove) {
         // Animate the child out, actually removing it once its alpha is zero.
-        mLayout.animateValueForChildAtIndex(
-                DynamicAnimation.ALPHA, index, 0f, () -> {
-                    actuallyRemove.run();
-                });
-        mLayout.animateValueForChildAtIndex(
-                DynamicAnimation.SCALE_X, index, ANIMATE_IN_STARTING_SCALE);
-        mLayout.animateValueForChildAtIndex(
-                DynamicAnimation.SCALE_Y, index, ANIMATE_IN_STARTING_SCALE);
+        mLayout.animateValueForChild(
+                DynamicAnimation.ALPHA, child, 0f, actuallyRemove);
+        mLayout.animateValueForChild(DynamicAnimation.SCALE_X, child, ANIMATE_IN_STARTING_SCALE);
+        mLayout.animateValueForChild(DynamicAnimation.SCALE_Y, child, ANIMATE_IN_STARTING_SCALE);
 
-        final boolean hasPrecedingChild = index + 1 < mLayout.getChildCount();
-        if (hasPrecedingChild) {
-            final int precedingViewIndex = mLayout.getPrecedingNonRemovedViewIndex(index);
-            if (precedingViewIndex >= 0) {
-                final float offsetX =
-                        getOffsetForChainedPropertyAnimation(DynamicAnimation.TRANSLATION_X);
-                mLayout.animatePositionForChildAtIndex(
-                        precedingViewIndex,
-                        mStackPosition.x + (index * offsetX),
-                        mStackPosition.y);
-            }
-        }
+        // Animate the removing view in the opposite direction of the stack.
+        final float xOffset = getOffsetForChainedPropertyAnimation(DynamicAnimation.TRANSLATION_X);
+        mLayout.animateValueForChild(DynamicAnimation.TRANSLATION_X, child,
+                mStackPosition.x - (-xOffset * ANIMATE_TRANSLATION_FACTOR));
+
+        // Pull the top of the stack to the correct position, the chained animations will instruct
+        // any children that are out of place to animate to the correct position.
+        mLayout.animateValueForChildAtIndex(DynamicAnimation.TRANSLATION_X, 0, mStackPosition.x);
     }
 
     /** Moves the stack, without any animation, to the starting position. */
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
index a784773..9bca3c7 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
@@ -35,19 +35,19 @@
     private static final int SIZE = Build.IS_DEBUGGABLE ? 400 : 50;
     static final SimpleDateFormat FORMAT = new SimpleDateFormat("MM-dd HH:mm:ss.SSS");
 
-    private static final int REASONS = 10;
+    public static final int REASONS = 10;
 
     public static final int PULSE_REASON_NONE = -1;
     public static final int PULSE_REASON_INTENT = 0;
     public static final int PULSE_REASON_NOTIFICATION = 1;
     public static final int PULSE_REASON_SENSOR_SIGMOTION = 2;
-    public static final int PULSE_REASON_SENSOR_PICKUP = 3;
-    public static final int PULSE_REASON_SENSOR_DOUBLE_TAP = 4;
+    public static final int REASON_SENSOR_PICKUP = 3;
+    public static final int REASON_SENSOR_DOUBLE_TAP = 4;
     public static final int PULSE_REASON_SENSOR_LONG_PRESS = 5;
     public static final int PULSE_REASON_DOCKING = 6;
     public static final int REASON_SENSOR_WAKE_UP = 7;
     public static final int PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN = 8;
-    public static final int PULSE_REASON_SENSOR_TAP = 9;
+    public static final int REASON_SENSOR_TAP = 9;
 
     private static boolean sRegisterKeyguardCallback = true;
 
@@ -202,13 +202,13 @@
             case PULSE_REASON_INTENT: return "intent";
             case PULSE_REASON_NOTIFICATION: return "notification";
             case PULSE_REASON_SENSOR_SIGMOTION: return "sigmotion";
-            case PULSE_REASON_SENSOR_PICKUP: return "pickup";
-            case PULSE_REASON_SENSOR_DOUBLE_TAP: return "doubletap";
+            case REASON_SENSOR_PICKUP: return "pickup";
+            case REASON_SENSOR_DOUBLE_TAP: return "doubletap";
             case PULSE_REASON_SENSOR_LONG_PRESS: return "longpress";
             case PULSE_REASON_DOCKING: return "docking";
             case PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN: return "wakelockscreen";
             case REASON_SENSOR_WAKE_UP: return "wakeup";
-            case PULSE_REASON_SENSOR_TAP: return "tap";
+            case REASON_SENSOR_TAP: return "tap";
             default: throw new IllegalArgumentException("bad reason: " + pulseReason);
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
index 562edd6..5efdc2f 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
@@ -97,20 +97,20 @@
                         mSensorManager.getDefaultSensor(Sensor.TYPE_PICK_UP_GESTURE),
                         Settings.Secure.DOZE_PICK_UP_GESTURE,
                         config.dozePickupSensorAvailable(),
-                        DozeLog.PULSE_REASON_SENSOR_PICKUP, false /* touchCoords */,
+                        DozeLog.REASON_SENSOR_PICKUP, false /* touchCoords */,
                         false /* touchscreen */),
                 new TriggerSensor(
                         findSensorWithType(config.doubleTapSensorType()),
                         Settings.Secure.DOZE_DOUBLE_TAP_GESTURE,
                         true /* configured */,
-                        DozeLog.PULSE_REASON_SENSOR_DOUBLE_TAP,
+                        DozeLog.REASON_SENSOR_DOUBLE_TAP,
                         dozeParameters.doubleTapReportsTouchCoordinates(),
                         true /* touchscreen */),
                 new TriggerSensor(
                         findSensorWithType(config.tapSensorType()),
                         Settings.Secure.DOZE_TAP_SCREEN_GESTURE,
                         true /* configured */,
-                        DozeLog.PULSE_REASON_SENSOR_TAP,
+                        DozeLog.REASON_SENSOR_TAP,
                         false /* reports touch coordinates */,
                         true /* touchscreen */),
                 new TriggerSensor(
@@ -130,7 +130,7 @@
                         false /* touchscreen */),
                 new PluginSensor(
                         new SensorManagerPlugin.Sensor(TYPE_WAKE_LOCK_SCREEN),
-                        Settings.Secure.DOZE_WAKE_LOCK_SCREEN_GESTURE,
+                        Settings.Secure.DOZE_WAKE_SCREEN_GESTURE,
                         mConfig.wakeScreenGestureAvailable(),
                         DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN,
                         false /* reports touch coordinates */,
@@ -530,7 +530,7 @@
 
         /**
          * Called when a sensor requests a pulse
-         * @param pulseReason Requesting sensor, e.g. {@link DozeLog#PULSE_REASON_SENSOR_PICKUP}
+         * @param pulseReason Requesting sensor, e.g. {@link DozeLog#REASON_SENSOR_PICKUP}
          * @param sensorPerformedProxCheck true if the sensor already checked for FAR proximity.
          * @param screenX the location on the screen where the sensor fired or -1
  *                if the sensor doesn't support reporting screen locations.
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
index dc505b5..8a35e70 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
@@ -108,10 +108,6 @@
         DozeLog.traceNotificationPulse(mContext);
     }
 
-    private void onWhisper() {
-        requestPulse(DozeLog.PULSE_REASON_NOTIFICATION, false /* performedProxCheck */);
-    }
-
     private void proximityCheckThenCall(IntConsumer callback,
             boolean alreadyPerformedProxCheck,
             int reason) {
@@ -137,9 +133,9 @@
     @VisibleForTesting
     void onSensor(int pulseReason, boolean sensorPerformedProxCheck,
             float screenX, float screenY, float[] rawValues) {
-        boolean isDoubleTap = pulseReason == DozeLog.PULSE_REASON_SENSOR_DOUBLE_TAP;
-        boolean isTap = pulseReason == DozeLog.PULSE_REASON_SENSOR_TAP;
-        boolean isPickup = pulseReason == DozeLog.PULSE_REASON_SENSOR_PICKUP;
+        boolean isDoubleTap = pulseReason == DozeLog.REASON_SENSOR_DOUBLE_TAP;
+        boolean isTap = pulseReason == DozeLog.REASON_SENSOR_TAP;
+        boolean isPickup = pulseReason == DozeLog.REASON_SENSOR_PICKUP;
         boolean isLongPress = pulseReason == DozeLog.PULSE_REASON_SENSOR_LONG_PRESS;
         boolean isWakeDisplay = pulseReason == DozeLog.REASON_SENSOR_WAKE_UP;
         boolean isWakeLockScreen = pulseReason == DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN;
diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLProgram.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLProgram.java
new file mode 100644
index 0000000..d03b00b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLProgram.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.glwallpaper;
+
+import static android.opengl.GLES20.GL_FRAGMENT_SHADER;
+import static android.opengl.GLES20.GL_VERTEX_SHADER;
+import static android.opengl.GLES20.glAttachShader;
+import static android.opengl.GLES20.glCompileShader;
+import static android.opengl.GLES20.glCreateProgram;
+import static android.opengl.GLES20.glCreateShader;
+import static android.opengl.GLES20.glGetAttribLocation;
+import static android.opengl.GLES20.glGetUniformLocation;
+import static android.opengl.GLES20.glLinkProgram;
+import static android.opengl.GLES20.glShaderSource;
+import static android.opengl.GLES20.glUseProgram;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.util.Log;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+/**
+ * This class takes charge of linking shader codes and then return a handle for OpenGL ES program.
+ */
+class ImageGLProgram {
+    private static final String TAG = ImageGLProgram.class.getSimpleName();
+
+    private Context mContext;
+    private int mProgramHandle;
+
+    ImageGLProgram(Context context) {
+        mContext = context.getApplicationContext();
+    }
+
+    private int loadShaderProgram(int vertexId, int fragmentId) {
+        final String vertexSrc = getShaderResource(vertexId);
+        final String fragmentSrc = getShaderResource(fragmentId);
+        final int vertexHandle = getShaderHandle(GL_VERTEX_SHADER, vertexSrc);
+        final int fragmentHandle = getShaderHandle(GL_FRAGMENT_SHADER, fragmentSrc);
+        return getProgramHandle(vertexHandle, fragmentHandle);
+    }
+
+    private String getShaderResource(int shaderId) {
+        Resources res = mContext.getResources();
+        StringBuilder code = new StringBuilder();
+
+        try (BufferedReader reader = new BufferedReader(
+                new InputStreamReader(res.openRawResource(shaderId)))) {
+            String nextLine;
+            while ((nextLine = reader.readLine()) != null) {
+                code.append(nextLine).append("\n");
+            }
+        } catch (IOException | Resources.NotFoundException ex) {
+            Log.d(TAG, "Can not read the shader source", ex);
+            code = null;
+        }
+
+        return code == null ? "" : code.toString();
+    }
+
+    private int getShaderHandle(int type, String src) {
+        final int shader = glCreateShader(type);
+        if (shader == 0) {
+            Log.d(TAG, "Create shader failed, type=" + type);
+            return 0;
+        }
+        glShaderSource(shader, src);
+        glCompileShader(shader);
+        return shader;
+    }
+
+    private int getProgramHandle(int vertexHandle, int fragmentHandle) {
+        final int program = glCreateProgram();
+        if (program == 0) {
+            Log.d(TAG, "Can not create OpenGL ES program");
+            return 0;
+        }
+
+        glAttachShader(program, vertexHandle);
+        glAttachShader(program, fragmentHandle);
+        glLinkProgram(program);
+        return program;
+    }
+
+    boolean useGLProgram(int vertexResId, int fragmentResId) {
+        mProgramHandle = loadShaderProgram(vertexResId, fragmentResId);
+        glUseProgram(mProgramHandle);
+        return true;
+    }
+
+    int getAttributeHandle(String name) {
+        return glGetAttribLocation(mProgramHandle, name);
+    }
+
+    int getUniformHandle(String name) {
+        return glGetUniformLocation(mProgramHandle, name);
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java
new file mode 100644
index 0000000..4e07872
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java
@@ -0,0 +1,245 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.glwallpaper;
+
+import static android.opengl.GLES20.GL_FLOAT;
+import static android.opengl.GLES20.GL_LINEAR;
+import static android.opengl.GLES20.GL_TEXTURE0;
+import static android.opengl.GLES20.GL_TEXTURE_2D;
+import static android.opengl.GLES20.GL_TEXTURE_MAG_FILTER;
+import static android.opengl.GLES20.GL_TEXTURE_MIN_FILTER;
+import static android.opengl.GLES20.GL_TRIANGLES;
+import static android.opengl.GLES20.glActiveTexture;
+import static android.opengl.GLES20.glBindTexture;
+import static android.opengl.GLES20.glDrawArrays;
+import static android.opengl.GLES20.glEnableVertexAttribArray;
+import static android.opengl.GLES20.glGenTextures;
+import static android.opengl.GLES20.glTexParameteri;
+import static android.opengl.GLES20.glUniform1i;
+import static android.opengl.GLES20.glVertexAttribPointer;
+
+import android.graphics.Bitmap;
+import android.opengl.GLUtils;
+import android.util.Log;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+
+/**
+ * This class takes charge of the geometry data like vertices and texture coordinates.
+ * It delivers these data to opengl runtime and triggers draw calls if necessary.
+ */
+class ImageGLWallpaper {
+    private static final String TAG = ImageGLWallpaper.class.getSimpleName();
+
+    static final String A_POSITION = "aPosition";
+    static final String A_TEXTURE_COORDINATES = "aTextureCoordinates";
+    static final String U_CENTER_REVEAL = "uCenterReveal";
+    static final String U_REVEAL = "uReveal";
+    static final String U_AOD2OPACITY = "uAod2Opacity";
+    static final String U_TEXTURE = "uTexture";
+    static final String U_AOD_MODE = "uAodMode";
+
+    private static final int HANDLE_UNDEFINED = -1;
+    private static final int POSITION_COMPONENT_COUNT = 2;
+    private static final int TEXTURE_COMPONENT_COUNT = 2;
+    private static final int BYTES_PER_FLOAT = 4;
+
+    // Vertices to define the square with 2 triangles.
+    private static final float[] VERTICES = {
+            -1.0f,  -1.0f,
+            +1.0f,  -1.0f,
+            +1.0f,  +1.0f,
+            +1.0f,  +1.0f,
+            -1.0f,  +1.0f,
+            -1.0f,  -1.0f
+    };
+
+    // Texture coordinates that maps to vertices.
+    private static final float[] TEXTURES = {
+            0f, 1f,
+            1f, 1f,
+            1f, 0f,
+            1f, 0f,
+            0f, 0f,
+            0f, 1f
+    };
+
+    private final FloatBuffer mVertexBuffer;
+    private final FloatBuffer mTextureBuffer;
+    private final ImageGLProgram mProgram;
+
+    private int mAttrPosition;
+    private int mAttrTextureCoordinates;
+    private int mUniAod2Opacity;
+    private int mUniAodMode;
+    private int mUniCenterReveal;
+    private int mUniReveal;
+    private int mUniTexture;
+    private int mTextureId;
+
+    ImageGLWallpaper(ImageGLProgram program) {
+        mProgram = program;
+
+        // Create an float array in opengles runtime (native) and put vertex data.
+        mVertexBuffer = ByteBuffer.allocateDirect(VERTICES.length * BYTES_PER_FLOAT)
+            .order(ByteOrder.nativeOrder())
+            .asFloatBuffer();
+        mVertexBuffer.put(VERTICES);
+        mVertexBuffer.position(0);
+
+        // Create an float array in opengles runtime (native) and put texture data.
+        mTextureBuffer = ByteBuffer.allocateDirect(TEXTURES.length * BYTES_PER_FLOAT)
+            .order(ByteOrder.nativeOrder())
+            .asFloatBuffer();
+        mTextureBuffer.put(TEXTURES);
+        mTextureBuffer.position(0);
+    }
+
+    void setup() {
+        setupAttributes();
+        setupUniforms();
+    }
+
+    private void setupAttributes() {
+        mAttrPosition = mProgram.getAttributeHandle(A_POSITION);
+        mVertexBuffer.position(0);
+        glVertexAttribPointer(mAttrPosition, POSITION_COMPONENT_COUNT, GL_FLOAT,
+                false, 0, mVertexBuffer);
+        glEnableVertexAttribArray(mAttrPosition);
+
+        mAttrTextureCoordinates = mProgram.getAttributeHandle(A_TEXTURE_COORDINATES);
+        mTextureBuffer.position(0);
+        glVertexAttribPointer(mAttrTextureCoordinates, TEXTURE_COMPONENT_COUNT, GL_FLOAT,
+                false, 0, mTextureBuffer);
+        glEnableVertexAttribArray(mAttrTextureCoordinates);
+    }
+
+    private void setupUniforms() {
+        mUniAod2Opacity = mProgram.getUniformHandle(U_AOD2OPACITY);
+        mUniAodMode = mProgram.getUniformHandle(U_AOD_MODE);
+        mUniCenterReveal = mProgram.getUniformHandle(U_CENTER_REVEAL);
+        mUniReveal = mProgram.getUniformHandle(U_REVEAL);
+        mUniTexture = mProgram.getUniformHandle(U_TEXTURE);
+    }
+
+    int getHandle(String name) {
+        switch (name) {
+            case A_POSITION:
+                return mAttrPosition;
+            case A_TEXTURE_COORDINATES:
+                return mAttrTextureCoordinates;
+            case U_AOD2OPACITY:
+                return mUniAod2Opacity;
+            case U_AOD_MODE:
+                return mUniAodMode;
+            case U_CENTER_REVEAL:
+                return mUniCenterReveal;
+            case U_REVEAL:
+                return mUniReveal;
+            case U_TEXTURE:
+                return mUniTexture;
+            default:
+                return HANDLE_UNDEFINED;
+        }
+    }
+
+    void draw() {
+        glDrawArrays(GL_TRIANGLES, 0, VERTICES.length / 2);
+    }
+
+    void setupTexture(Bitmap bitmap) {
+        final int[] tids = new int[1];
+
+        if (bitmap == null) {
+            Log.w(TAG, "setupTexture: invalid bitmap");
+            return;
+        }
+
+        // Generate one texture object and store the id in tids[0].
+        glGenTextures(1, tids, 0);
+        if (tids[0] == 0) {
+            Log.w(TAG, "setupTexture: glGenTextures() failed");
+            return;
+        }
+
+        // Bind a named texture to a texturing target.
+        glBindTexture(GL_TEXTURE_2D, tids[0]);
+        // Load the bitmap data and copy it over into the texture object that is currently bound.
+        GLUtils.texImage2D(GL_TEXTURE_2D, 0, bitmap, 0);
+        // Use bilinear texture filtering when minification.
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+        // Use bilinear texture filtering when magnification.
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+        mTextureId = tids[0];
+    }
+
+    void useTexture() {
+        // Set the active texture unit to texture unit 0.
+        glActiveTexture(GL_TEXTURE0);
+        // Bind the texture to this unit.
+        glBindTexture(GL_TEXTURE_2D, mTextureId);
+        // Let the texture sampler in fragment shader to read form this texture unit.
+        glUniform1i(mUniTexture, 0);
+    }
+
+    void adjustTextureCoordinates(Bitmap bitmap, int surfaceWidth, int surfaceHeight,
+            float xOffset, float yOffset) {
+        if (bitmap == null) {
+            Log.d(TAG, "adjustTextureCoordinates: invalid bitmap");
+            return;
+        }
+
+        float ratioW = 1f;
+        float ratioH = 1f;
+        int bitmapWidth = bitmap.getWidth();
+        int bitmapHeight = bitmap.getHeight();
+
+        boolean adjustWidth = bitmapWidth > surfaceWidth;
+        if (adjustWidth) {
+            ratioW = (float) surfaceWidth / bitmapWidth;
+            float referenceX = xOffset + ratioW > 1f ? 1f - ratioW : xOffset;
+            for (int i = 0; i < TEXTURES.length; i += 2) {
+                if (i == 2 || i == 4 || i == 6) {
+                    TEXTURES[i] = Math.min(1f, referenceX + ratioW);
+                } else {
+                    TEXTURES[i] = referenceX;
+                }
+            }
+        }
+
+        boolean adjustHeight = bitmapHeight > surfaceHeight;
+        if (adjustHeight) {
+            ratioH = (float) surfaceHeight / bitmapHeight;
+            float referenceY = yOffset + ratioH > 1f ? 1f - ratioH : yOffset;
+            for (int i = 1; i < TEXTURES.length; i += 2) {
+                if (i == 1 || i == 3 || i == 11) {
+                    TEXTURES[i] = Math.min(1f, referenceY + ratioH);
+                } else {
+                    TEXTURES[i] = referenceY;
+                }
+            }
+        }
+
+        if (adjustWidth || adjustHeight) {
+            mTextureBuffer.put(TEXTURES);
+            mTextureBuffer.position(0);
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageProcessHelper.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageProcessHelper.java
new file mode 100644
index 0000000..477e7d7e
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageProcessHelper.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.glwallpaper;
+
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.ColorMatrix;
+import android.graphics.ColorMatrixColorFilter;
+import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.os.AsyncTask;
+import android.os.Handler;
+import android.os.Handler.Callback;
+import android.os.Message;
+import android.util.Log;
+
+/**
+ * A helper class that computes histogram and percentile 85 from a bitmap.
+ * Percentile 85 will be computed each time the user picks a new image wallpaper.
+ */
+class ImageProcessHelper {
+    private static final String TAG = ImageProcessHelper.class.getSimpleName();
+    private static final float DEFAULT_PER85 = 0.8f;
+    private static final int MSG_UPDATE_PER85 = 1;
+
+    /**
+     * This color matrix will be applied to each pixel to get luminance from rgb by below formula:
+     * Luminance = .2126f * r + .7152f * g + .0722f * b.
+     */
+    private static final float[] LUMINOSITY_MATRIX = new float[] {
+            .2126f,     .0000f,     .0000f,     .0000f,     .0000f,
+            .0000f,     .7152f,     .0000f,     .0000f,     .0000f,
+            .0000f,     .0000f,     .0722f,     .0000f,     .0000f,
+            .0000f,     .0000f,     .0000f,     1.000f,     .0000f
+    };
+
+    private final Handler mHandler = new Handler(new Callback() {
+        @Override
+        public boolean handleMessage(Message msg) {
+            switch (msg.what) {
+                case MSG_UPDATE_PER85:
+                    mPer85 = (float) msg.obj;
+                    return true;
+                default:
+                    return false;
+            }
+        }
+    });
+
+    private float mPer85 = DEFAULT_PER85;
+
+    void startComputingPercentile85(Bitmap bitmap) {
+        new Per85ComputeTask(mHandler).execute(bitmap);
+    }
+
+    float getPercentile85() {
+        return mPer85;
+    }
+
+    private static class Per85ComputeTask extends AsyncTask<Bitmap, Void, Float> {
+        private Handler mUpdateHandler;
+
+        Per85ComputeTask(Handler handler) {
+            super(handler);
+            mUpdateHandler = handler;
+        }
+
+        @Override
+        protected Float doInBackground(Bitmap... bitmaps) {
+            Bitmap bitmap = bitmaps[0];
+            if (bitmap != null) {
+                int[] histogram = processHistogram(bitmap);
+                return computePercentile85(bitmap, histogram);
+            }
+            Log.e(TAG, "Per85ComputeTask: Can't get bitmap");
+            return DEFAULT_PER85;
+        }
+
+        @Override
+        protected void onPostExecute(Float result) {
+            Message msg = mUpdateHandler.obtainMessage(MSG_UPDATE_PER85, result);
+            mUpdateHandler.sendMessage(msg);
+        }
+
+        private int[] processHistogram(Bitmap bitmap) {
+            int width = bitmap.getWidth();
+            int height = bitmap.getHeight();
+
+            Bitmap target = Bitmap.createBitmap(width, height, bitmap.getConfig());
+            Canvas canvas = new Canvas(target);
+            ColorMatrix cm = new ColorMatrix(LUMINOSITY_MATRIX);
+            Paint paint = new Paint();
+            paint.setColorFilter(new ColorMatrixColorFilter(cm));
+            canvas.drawBitmap(bitmap, new Matrix(), paint);
+
+            // TODO: Fine tune the performance here, tracking on b/123615079.
+            int[] histogram = new int[256];
+            for (int row = 0; row < height; row++) {
+                for (int col = 0; col < width; col++) {
+                    int pixel = target.getPixel(col, row);
+                    int y = Color.red(pixel) + Color.green(pixel) + Color.blue(pixel);
+                    histogram[y]++;
+                }
+            }
+
+            return histogram;
+        }
+
+        private float computePercentile85(Bitmap bitmap, int[] histogram) {
+            float per85 = DEFAULT_PER85;
+            int pixelCount = bitmap.getWidth() * bitmap.getHeight();
+            float[] acc = new float[256];
+            for (int i = 0; i < acc.length; i++) {
+                acc[i] = (float) histogram[i] / pixelCount;
+                float prev = i == 0 ? 0f : acc[i - 1];
+                float next = acc[i];
+                float idx = (float) (i + 1) / 255;
+                float sum = prev + next;
+                if (prev < 0.85f && sum >= 0.85f) {
+                    per85 = idx;
+                }
+                if (i > 0) {
+                    acc[i] += acc[i - 1];
+                }
+            }
+            return per85;
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageRevealHelper.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageRevealHelper.java
new file mode 100644
index 0000000..787972c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageRevealHelper.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.glwallpaper;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ValueAnimator;
+
+import com.android.systemui.Interpolators;
+
+/**
+ * Use ValueAnimator and appropriate interpolator to control the progress of reveal transition.
+ * The transition will happen while getting awake and quit events.
+ */
+class ImageRevealHelper {
+    private static final String TAG = ImageRevealHelper.class.getSimpleName();
+    private static final float MAX_REVEAL = 0f;
+    private static final float MIN_REVEAL = 1f;
+    private static final int REVEAL_DURATION = 1000;
+
+    private final ValueAnimator mAnimator;
+    private final RevealStateListener mRevealListener;
+    private float mReveal = MIN_REVEAL;
+    private boolean mAwake = false;
+
+    ImageRevealHelper(RevealStateListener listener) {
+        mRevealListener = listener;
+        mAnimator = ValueAnimator.ofFloat();
+        mAnimator.setDuration(REVEAL_DURATION);
+        mAnimator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
+        mAnimator.addUpdateListener(animator -> {
+            mReveal = (float) animator.getAnimatedValue();
+            if (mRevealListener != null) {
+                mRevealListener.onRevealStateChanged();
+            }
+        });
+        mAnimator.addListener(new AnimatorListenerAdapter() {
+            private boolean mIsCanceled;
+
+            @Override
+            public void onAnimationCancel(Animator animation) {
+                mIsCanceled = true;
+            }
+
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                if (!mIsCanceled) {
+                    mAwake = !mAwake;
+                }
+                mIsCanceled = false;
+            }
+        });
+    }
+
+    private void animate() {
+        mAnimator.cancel();
+        mAnimator.setFloatValues(mReveal, !mAwake ? MIN_REVEAL : MAX_REVEAL);
+        mAnimator.start();
+    }
+
+    public float getReveal() {
+        return mReveal;
+    }
+
+    public boolean isAwake() {
+        return mAwake;
+    }
+
+    void updateAwake(boolean awake) {
+        mAwake = awake;
+        animate();
+    }
+
+    void sleep() {
+        mReveal = MIN_REVEAL;
+        mAwake = false;
+    }
+
+    /**
+     * A listener to trace value changes of reveal.
+     */
+    public interface RevealStateListener {
+
+        /**
+         * Called back while reveal status changes.
+         */
+        void onRevealStateChanged();
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java
new file mode 100644
index 0000000..8916b28
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.glwallpaper;
+
+import static android.opengl.GLES20.GL_COLOR_BUFFER_BIT;
+import static android.opengl.GLES20.glClear;
+import static android.opengl.GLES20.glClearColor;
+import static android.opengl.GLES20.glUniform1f;
+import static android.opengl.GLES20.glUniform1i;
+import static android.opengl.GLES20.glViewport;
+
+import android.app.WallpaperManager;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Rect;
+import android.opengl.GLSurfaceView;
+import android.util.Log;
+
+import com.android.systemui.ImageWallpaper;
+import com.android.systemui.ImageWallpaper.ImageGLView;
+import com.android.systemui.R;
+
+import javax.microedition.khronos.egl.EGLConfig;
+import javax.microedition.khronos.opengles.GL10;
+
+/**
+ * A GL renderer for image wallpaper.
+ */
+public class ImageWallpaperRenderer implements GLSurfaceView.Renderer,
+        ImageWallpaper.SensorEventListener, ImageWallpaper.WallpaperStatusListener,
+        ImageRevealHelper.RevealStateListener {
+    private static final String TAG = ImageWallpaperRenderer.class.getSimpleName();
+
+    private final WallpaperManager mWallpaperManager;
+    private final ImageGLProgram mProgram;
+    private final ImageGLWallpaper mWallpaper;
+    private final ImageProcessHelper mImageProcessHelper;
+    private final ImageRevealHelper mImageRevealHelper;
+    private final ImageGLView mGLView;
+    private boolean mIsInAmbientMode;
+    private float mXOffset = 0f;
+    private float mYOffset = 0f;
+
+    public ImageWallpaperRenderer(Context context, ImageGLView glView) {
+        mWallpaperManager = context.getSystemService(WallpaperManager.class);
+        if (mWallpaperManager == null) {
+            Log.w(TAG, "WallpaperManager not available");
+        }
+
+        mProgram = new ImageGLProgram(context);
+        mWallpaper = new ImageGLWallpaper(mProgram);
+        mImageProcessHelper = new ImageProcessHelper();
+        mImageRevealHelper = new ImageRevealHelper(this);
+        mGLView = glView;
+
+        if (mWallpaperManager != null) {
+            // Compute per85 as transition threshold, this is an async work.
+            mImageProcessHelper.startComputingPercentile85(mWallpaperManager.getBitmap());
+        }
+    }
+
+    @Override
+    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
+        glClearColor(0f, 0f, 0f, 1.0f);
+        mProgram.useGLProgram(
+                R.raw.image_wallpaper_vertex_shader, R.raw.image_wallpaper_fragment_shader);
+        mWallpaper.setup();
+        mWallpaper.setupTexture(mWallpaperManager.getBitmap());
+    }
+
+    @Override
+    public void onSurfaceChanged(GL10 gl, int width, int height) {
+        glViewport(0, 0, width, height);
+        mWallpaper.adjustTextureCoordinates(mWallpaperManager.getBitmap(),
+                width, height, mXOffset, mYOffset);
+    }
+
+    @Override
+    public void onDrawFrame(GL10 gl) {
+        float threshold = mImageProcessHelper.getPercentile85();
+        float reveal = mImageRevealHelper.getReveal();
+
+        glClear(GL_COLOR_BUFFER_BIT);
+
+        glUniform1f(mWallpaper.getHandle(ImageGLWallpaper.U_AOD2OPACITY), .25f);
+        glUniform1f(mWallpaper.getHandle(ImageGLWallpaper.U_CENTER_REVEAL), threshold);
+        glUniform1f(mWallpaper.getHandle(ImageGLWallpaper.U_REVEAL), reveal);
+        glUniform1i(mWallpaper.getHandle(ImageGLWallpaper.U_AOD_MODE), mIsInAmbientMode ? 1 : 0);
+
+        mWallpaper.useTexture();
+        mWallpaper.draw();
+    }
+
+    @Override
+    public void onSensorEvent(boolean awake) {
+        mImageRevealHelper.updateAwake(awake);
+    }
+
+    @Override
+    public void onAmbientModeChanged(boolean inAmbientMode) {
+        mIsInAmbientMode = inAmbientMode;
+        if (inAmbientMode) {
+            mImageRevealHelper.sleep();
+        }
+        requestRender();
+    }
+
+    @Override
+    public void onOffsetsChanged(float xOffset, float yOffset, Rect frame) {
+        if (frame == null || mWallpaperManager == null
+                || (xOffset == mXOffset && yOffset == mYOffset)) {
+            return;
+        }
+
+        Bitmap bitmap = mWallpaperManager.getBitmap();
+        if (bitmap == null) {
+            return;
+        }
+
+        int width = frame.width();
+        int height = frame.height();
+        mXOffset = xOffset;
+        mYOffset = yOffset;
+
+        mWallpaper.adjustTextureCoordinates(bitmap, width, height, mXOffset, mYOffset);
+        requestRender();
+    }
+
+    @Override
+    public void onRevealStateChanged() {
+        requestRender();
+    }
+
+    private void requestRender() {
+        if (mGLView != null) {
+            mGLView.render();
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipAccessibilityInteractionConnection.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipAccessibilityInteractionConnection.java
index 968bd28..60dceef 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipAccessibilityInteractionConnection.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipAccessibilityInteractionConnection.java
@@ -165,6 +165,11 @@
         }
     }
 
+    @Override
+    public void clearAccessibilityFocus() {
+        // We should not be here.
+    }
+
     public static AccessibilityNodeInfo obtainRootAccessibilityNodeInfo() {
         AccessibilityNodeInfo info = AccessibilityNodeInfo.obtain();
         info.setSourceNodeId(AccessibilityNodeInfo.ROOT_NODE_ID,
diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
old mode 100755
new mode 100644
index ca3cdf4..5f2614e
--- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
@@ -42,6 +42,7 @@
 import android.os.Debug;
 import android.os.Handler;
 import android.os.RemoteException;
+import android.os.UserHandle;
 import android.text.TextUtils;
 import android.util.Log;
 import android.util.Pair;
@@ -247,7 +248,8 @@
         ActivityManagerWrapper.getInstance().registerTaskStackListener(mTaskStackListener);
         IntentFilter intentFilter = new IntentFilter();
         intentFilter.addAction(Intent.ACTION_MEDIA_RESOURCE_GRANTED);
-        mContext.registerReceiver(mBroadcastReceiver, intentFilter);
+        mContext.registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, intentFilter,
+                null, null);
 
         if (sSettingsPackageAndClassNamePairList == null) {
             String[] settings = mContext.getResources().getStringArray(
diff --git a/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt b/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt
index db5c244..1cd3509 100644
--- a/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt
+++ b/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt
@@ -19,8 +19,10 @@
 import android.content.Context
 import android.content.DialogInterface
 import android.content.Intent
+import android.content.pm.PackageManager
 import android.content.res.ColorStateList
 import android.os.UserHandle
+import android.provider.Settings
 import android.util.IconDrawableFactory
 import android.view.Gravity
 import android.view.LayoutInflater
@@ -63,7 +65,7 @@
             setPositiveButton(R.string.ongoing_privacy_dialog_ok, null)
             setNeutralButton(R.string.ongoing_privacy_dialog_open_settings,
                     object : DialogInterface.OnClickListener {
-                        val intent = Intent(Intent.ACTION_REVIEW_PERMISSION_USAGE).putExtra(
+                        val intent = Intent(Settings.ACTION_ENTERPRISE_PRIVACY_SETTINGS).putExtra(
                                 Intent.EXTRA_DURATION_MILLIS, TimeUnit.MINUTES.toMillis(1))
 
                         @Suppress("DEPRECATION")
@@ -157,16 +159,21 @@
         } else {
             icons.visibility = View.GONE
         }
-        item.setOnClickListener(object : View.OnClickListener {
-            val intent = Intent(Intent.ACTION_REVIEW_APP_PERMISSION_USAGE)
-                    .putExtra(Intent.EXTRA_PACKAGE_NAME, app.packageName)
-                    .putExtra(Intent.EXTRA_USER, UserHandle.getUserHandleForUid(app.uid))
-            override fun onClick(v: View?) {
-                Dependency.get(ActivityStarter::class.java)
-                        .postStartActivityDismissingKeyguard(intent, 0)
-                dismissDialog?.invoke()
-            }
-        })
+        try {
+            // Check if package exists
+            context.packageManager.getPackageInfo(app.packageName, 0)
+            item.setOnClickListener(object : View.OnClickListener {
+                val intent = Intent(Intent.ACTION_REVIEW_APP_PERMISSION_USAGE)
+                        .putExtra(Intent.EXTRA_PACKAGE_NAME, app.packageName)
+                        .putExtra(Intent.EXTRA_USER, UserHandle.getUserHandleForUid(app.uid))
+                override fun onClick(v: View?) {
+                    Dependency.get(ActivityStarter::class.java)
+                            .postStartActivityDismissingKeyguard(intent, 0)
+                    dismissDialog?.invoke()
+                }
+            })
+        } catch (e: PackageManager.NameNotFoundException) {}
+
         itemList.addView(item)
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
index 6f847c8..995dc66 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
@@ -274,8 +274,6 @@
                     if (record.tileView.getVisibility() == GONE) continue;
                     previousView = record.tileView.updateAccessibilityOrder(previousView);
                 }
-                mRecords.get(0).tileView.setAccessibilityTraversalAfter(
-                        R.id.alarm_status_collapsed);
                 mRecords.get(mRecords.size() - 1).tileView.setAccessibilityTraversalBefore(
                         R.id.expand_indicator);
             }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java
index d740033..a0f4e24 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java
@@ -24,7 +24,6 @@
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.systemui.R;
-import com.android.systemui.R.drawable;
 import com.android.systemui.plugins.ActivityStarter;
 import com.android.systemui.plugins.qs.QSTile.BooleanState;
 import com.android.systemui.qs.QSHost;
@@ -38,7 +37,7 @@
 /** Quick settings tile: Location **/
 public class LocationTile extends QSTileImpl<BooleanState> {
 
-    private final Icon mIcon = ResourceIcon.get(drawable.ic_signal_location);
+    private final Icon mIcon = ResourceIcon.get(com.android.internal.R.drawable.ic_signal_location);
 
     private final LocationController mController;
     private final KeyguardMonitor mKeyguard;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java
index 43ce0b5..de78d33 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java
@@ -111,7 +111,7 @@
     protected void handleUpdateState(BooleanState state, Object arg) {
         state.value = mController.isActivated();
         state.label = mContext.getString(R.string.quick_settings_night_display_label);
-        state.icon = ResourceIcon.get(R.drawable.ic_qs_night_display_on);
+        state.icon = ResourceIcon.get(com.android.internal.R.drawable.ic_qs_night_display_on);
         state.expandedAccessibilityClassName = Switch.class.getName();
         state.state = state.value ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE;
         state.secondaryLabel = getSecondaryLabel(state.value);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/AlertingNotificationManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/AlertingNotificationManager.java
index a776d0f..2f19630 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/AlertingNotificationManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/AlertingNotificationManager.java
@@ -257,6 +257,10 @@
     public void setShouldManageLifetime(NotificationEntry entry, boolean shouldExtend) {
         if (shouldExtend) {
             mExtendedLifetimeAlertEntries.add(entry);
+            // We need to make sure that entries are stopping to alert eventually, let's remove
+            // this as soon as possible.
+            AlertEntry alertEntry = mAlertEntries.get(entry.key);
+            alertEntry.removeAsSoonAsPossible();
         } else {
             mExtendedLifetimeAlertEntries.remove(entry);
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java
index a188c5a..0a39549 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java
@@ -462,13 +462,6 @@
         }
     }
 
-    public void setRestingAlpha(float alpha) {
-        mRestingAlpha = alpha;
-
-        // TODO: Handle the case an animation is playing.
-        setImageAlpha(alpha, false);
-    }
-
     public float getRestingAlpha() {
         return mRestingAlpha;
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
index 158430f..2811505 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
@@ -486,7 +486,7 @@
             if (msg.what == MSG_HIDE_TRANSIENT) {
                 hideTransientIndication();
             } else if (msg.what == MSG_CLEAR_BIOMETRIC_MSG) {
-                mLockIcon.setTransientFpError(false);
+                mLockIcon.setTransientBiometricsError(false);
             }
         }
     };
@@ -579,7 +579,7 @@
                 mStatusBarKeyguardViewManager.showBouncerMessage(helpString,
                         errorColorState);
             } else if (updateMonitor.isScreenOn()) {
-                mLockIcon.setTransientFpError(true);
+                mLockIcon.setTransientBiometricsError(true);
                 showTransientIndication(helpString, errorColorState);
                 hideTransientIndicationDelayed(TRANSIENT_BIOMETRIC_ERROR_TIMEOUT);
                 mHandler.removeMessages(MSG_CLEAR_BIOMETRIC_MSG);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/MediaTransferManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/MediaTransferManager.java
new file mode 100644
index 0000000..752b6a8
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/MediaTransferManager.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar;
+
+import android.content.Context;
+import android.content.Intent;
+import android.service.notification.StatusBarNotification;
+import android.util.FeatureFlagUtils;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+
+import com.android.settingslib.media.MediaOutputSliceConstants;
+import com.android.systemui.Dependency;
+import com.android.systemui.plugins.ActivityStarter;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
+
+/**
+ * Class for handling MediaTransfer state over a set of notifications.
+ */
+public class MediaTransferManager {
+    private final Context mContext;
+    private final ActivityStarter mActivityStarter;
+
+    private final View.OnClickListener mOnClickHandler = new View.OnClickListener() {
+        @Override
+        public void onClick(View view) {
+            if (handleMediaTransfer(view)) {
+                return;
+            }
+        }
+
+        private boolean handleMediaTransfer(View view) {
+            if (view.findViewById(com.android.internal.R.id.media_seamless) == null) {
+                return false;
+            }
+
+            ViewParent parent = view.getParent();
+            StatusBarNotification statusBarNotification = getNotificationForParent(parent);
+            final Intent intent = new Intent()
+                    .setAction(MediaOutputSliceConstants.ACTION_MEDIA_OUTPUT)
+                    .putExtra(MediaOutputSliceConstants.EXTRA_PACKAGE_NAME,
+                            statusBarNotification.getPackageName());
+            mActivityStarter.startActivity(intent, false, true /* dismissShade */,
+                    Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+            return true;
+        }
+
+        private StatusBarNotification getNotificationForParent(ViewParent parent) {
+            while (parent != null) {
+                if (parent instanceof ExpandableNotificationRow) {
+                    return ((ExpandableNotificationRow) parent).getStatusBarNotification();
+                }
+                parent = parent.getParent();
+            }
+            return null;
+        }
+    };
+
+    public MediaTransferManager(Context context) {
+        mContext = context;
+        mActivityStarter = Dependency.get(ActivityStarter.class);
+    }
+
+    /**
+     * apply the action button for MediaTransfer
+     *
+     * @param root  The parent container of the view.
+     * @param entry The entry of MediaTransfer action button.
+     */
+    public void applyMediaTransferView(ViewGroup root, NotificationEntry entry) {
+        if (!FeatureFlagUtils.isEnabled(mContext, FeatureFlagUtils.SEAMLESS_TRANSFER)) {
+            return;
+        }
+
+        View view = root.findViewById(com.android.internal.R.id.media_seamless);
+        if (view == null) {
+            return;
+        }
+
+        view.setVisibility(View.VISIBLE);
+        view.setOnClickListener(mOnClickHandler);
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java
index f3a46ce..be63bad 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java
@@ -20,6 +20,8 @@
 import static com.android.systemui.statusbar.phone.StatusBar.DEBUG;
 import static com.android.systemui.statusbar.phone.StatusBar.ENABLE_CHILD_NOTIFICATIONS;
 
+import android.annotation.SuppressLint;
+import android.app.NotificationManager;
 import android.content.ComponentName;
 import android.content.Context;
 import android.os.RemoteException;
@@ -32,10 +34,13 @@
 import com.android.systemui.statusbar.phone.NotificationGroupManager;
 import com.android.systemui.statusbar.phone.NotificationListenerWithPlugins;
 
+import java.util.ArrayList;
+
 /**
  * This class handles listening to notification updates and passing them along to
  * NotificationPresenter to be displayed to the user.
  */
+@SuppressLint("OverrideAbstract")
 public class NotificationListener extends NotificationListenerWithPlugins {
     private static final String TAG = "NotificationListener";
 
@@ -47,14 +52,17 @@
     private final NotificationGroupManager mGroupManager =
             Dependency.get(NotificationGroupManager.class);
 
+    private final ArrayList<NotificationSettingsListener> mSettingsListeners = new ArrayList<>();
     private final Context mContext;
 
-    protected NotificationPresenter mPresenter;
-
     public NotificationListener(Context context) {
         mContext = context;
     }
 
+    public void addNotificationSettingsListener(NotificationSettingsListener listener) {
+        mSettingsListeners.add(listener);
+    }
+
     @Override
     public void onListenerConnected() {
         if (DEBUG) Log.d(TAG, "onListenerConnected");
@@ -70,6 +78,8 @@
                 mEntryManager.addNotification(sbn, currentRanking);
             }
         });
+        NotificationManager noMan = mContext.getSystemService(NotificationManager.class);
+        onStatusBarIconsBehaviorChanged(noMan.shouldHideSilentStatusBarIcons());
     }
 
     @Override
@@ -133,9 +143,14 @@
         }
     }
 
-    public void setUpWithPresenter(NotificationPresenter presenter) {
-        mPresenter = presenter;
+    @Override
+    public void onStatusBarIconsBehaviorChanged(boolean hideSilentStatusIcons) {
+        for (NotificationSettingsListener listener : mSettingsListeners) {
+            listener.onStatusBarIconsBehaviorChanged(hideSilentStatusIcons);
+        }
+    }
 
+    public void registerAsSystemService() {
         try {
             registerAsSystemService(mContext,
                     new ComponentName(mContext.getPackageName(), getClass().getCanonicalName()),
@@ -144,4 +159,10 @@
             Log.e(TAG, "Unable to register notification listener", e);
         }
     }
+
+    public interface NotificationSettingsListener {
+
+        default void onStatusBarIconsBehaviorChanged(boolean hideSilentStatusIcons) { }
+
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationUiAdjustment.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationUiAdjustment.java
index f0d804d..3db02b9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationUiAdjustment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationUiAdjustment.java
@@ -54,7 +54,7 @@
     public static NotificationUiAdjustment extractFromNotificationEntry(
             NotificationEntry entry) {
         return new NotificationUiAdjustment(
-                entry.key, entry.systemGeneratedSmartActions, entry.smartReplies);
+                entry.key, entry.systemGeneratedSmartActions, entry.systemGeneratedSmartReplies);
     }
 
     public static boolean needReinflate(
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SmartReplyController.java b/packages/SystemUI/src/com/android/systemui/statusbar/SmartReplyController.java
index a2abcd2..5a8f71d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SmartReplyController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SmartReplyController.java
@@ -56,12 +56,13 @@
      * Notifies StatusBarService a smart reply is sent.
      */
     public void smartReplySent(NotificationEntry entry, int replyIndex, CharSequence reply,
-            boolean generatedByAssistant) {
+            boolean generatedByAssistant, int notificationLocation) {
         mCallback.onSmartReplySent(entry, reply);
         mSendingKeys.add(entry.key);
         try {
             mBarService.onNotificationSmartReplySent(
-                    entry.notification.getKey(), replyIndex, reply, generatedByAssistant);
+                    entry.notification.getKey(), replyIndex, reply, generatedByAssistant,
+                    notificationLocation);
         } catch (RemoteException e) {
             // Nothing to do, system going down
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
index 19ed13e..acacc8f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
@@ -594,8 +594,8 @@
                     mCurrentSetColor, Color.WHITE, mDarkAmount);
             updateTintMatrix(mMatrix, color, DARK_ALPHA_BOOST * mDarkAmount);
             mMatrixColorFilter.setColorMatrixArray(mMatrix);
+            setColorFilter(null);  // setColorFilter only invalidates if the instance changed.
             setColorFilter(mMatrixColorFilter);
-            invalidate();  // setColorFilter only invalidates if the filter instance changed.
         } else {
             mDozer.updateGrayscale(this, mDarkAmount);
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java
index ef5e936..5c62005 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java
@@ -27,7 +27,6 @@
 import com.android.internal.statusbar.NotificationVisibility;
 import com.android.systemui.Dependency;
 import com.android.systemui.Dumpable;
-import com.android.systemui.ForegroundServiceController;
 import com.android.systemui.statusbar.NotificationLifetimeExtender;
 import com.android.systemui.statusbar.NotificationPresenter;
 import com.android.systemui.statusbar.NotificationRemoteInputManager;
@@ -62,13 +61,9 @@
     private static final String TAG = "NotificationEntryMgr";
     private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
 
-    private final Context mContext;
     @VisibleForTesting
     protected final HashMap<String, NotificationEntry> mPendingNotifications = new HashMap<>();
 
-    private final ForegroundServiceController mForegroundServiceController =
-            Dependency.get(ForegroundServiceController.class);
-
     // Lazily retrieved dependencies
     private NotificationRemoteInputManager mRemoteInputManager;
     private NotificationRowBinder mNotificationRowBinder;
@@ -97,7 +92,6 @@
     }
 
     public NotificationEntryManager(Context context) {
-        mContext = context;
         mNotificationData = new NotificationData();
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java
index 2e93c382..db9fcc8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java
@@ -102,7 +102,9 @@
     /** Smart Actions provided by the NotificationAssistantService. */
     @NonNull
     public List<Notification.Action> systemGeneratedSmartActions = Collections.emptyList();
-    public CharSequence[] smartReplies = new CharSequence[0];
+    /** Smart replies provided by the NotificationAssistantService. */
+    @NonNull
+    public CharSequence[] systemGeneratedSmartReplies = new CharSequence[0];
     @VisibleForTesting
     public int suppressedVisualEffects;
     public boolean suspended;
@@ -182,7 +184,7 @@
         userSentiment = ranking.getUserSentiment();
         systemGeneratedSmartActions = ranking.getSmartActions() == null
                 ? Collections.emptyList() : ranking.getSmartActions();
-        smartReplies = ranking.getSmartReplies() == null
+        systemGeneratedSmartReplies = ranking.getSmartReplies() == null
                 ? new CharSequence[0]
                 : ranking.getSmartReplies().toArray(new CharSequence[0]);
         suppressedVisualEffects = ranking.getSuppressedVisualEffects();
@@ -239,6 +241,13 @@
     }
 
     /**
+     * Returns the data needed for a bubble for this notification, if it exists.
+     */
+    public Notification.BubbleMetadata getBubbleMetadata() {
+        return notification.getNotification().getBubbleMetadata();
+    }
+
+    /**
      * Resets the notification entry to be re-used.
      */
     public void reset() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBlockingHelperManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBlockingHelperManager.java
index 6df72fe..580e702 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBlockingHelperManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBlockingHelperManager.java
@@ -165,8 +165,7 @@
     private LogMaker getLogMaker() {
         return mBlockingHelperRow.getStatusBarNotification()
             .getLogMaker()
-            .setCategory(MetricsEvent.NOTIFICATION_ITEM)
-            .setType(MetricsEvent.NOTIFICATION_BLOCKING_HELPER);
+            .setCategory(MetricsEvent.NOTIFICATION_BLOCKING_HELPER);
     }
 
     // Format must stay in sync with frameworks/base/core/res/res/values/config.xml
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
index c161da3..878d533 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
@@ -43,6 +43,7 @@
 import com.android.internal.util.ContrastColorUtil;
 import com.android.systemui.Dependency;
 import com.android.systemui.R;
+import com.android.systemui.statusbar.MediaTransferManager;
 import com.android.systemui.statusbar.RemoteInputController;
 import com.android.systemui.statusbar.SmartReplyController;
 import com.android.systemui.statusbar.TransformableView;
@@ -163,11 +164,13 @@
     private boolean mIsContentExpandable;
     private boolean mRemoteInputVisible;
     private int mUnrestrictedContentHeight;
+    private MediaTransferManager mMediaTransferManager;
 
 
     public NotificationContentView(Context context, AttributeSet attrs) {
         super(context, attrs);
         mHybridGroupManager = new HybridGroupManager(getContext(), this);
+        mMediaTransferManager = new MediaTransferManager(getContext());
         mSmartReplyConstants = Dependency.get(SmartReplyConstants.class);
         mSmartReplyController = Dependency.get(SmartReplyController.class);
         initView();
@@ -1250,6 +1253,7 @@
             mAmbientWrapper.onContentUpdated(row);
         }
         applyRemoteInputAndSmartReply(entry);
+        applyMediaTransfer(entry);
         updateLegacy();
         mForceSelectNextLayout = true;
         setDark(mDark, false /* animate */, 0 /* delay */);
@@ -1292,6 +1296,22 @@
         }
     }
 
+    private void applyMediaTransfer(final NotificationEntry entry) {
+        View bigContentView = mExpandedChild;
+        if (bigContentView == null || !entry.isMediaNotification()) {
+            return;
+        }
+
+        View mediaActionContainer = bigContentView.findViewById(
+                com.android.internal.R.id.media_actions);
+        if (!(mediaActionContainer instanceof LinearLayout)) {
+            return;
+        }
+
+        mMediaTransferManager.applyMediaTransferView((ViewGroup) mediaActionContainer,
+                entry);
+    }
+
     private void applyRemoteInputAndSmartReply(final NotificationEntry entry) {
         if (mRemoteInputController == null) {
             return;
@@ -1314,16 +1334,21 @@
     static SmartRepliesAndActions chooseSmartRepliesAndActions(
             SmartReplyConstants smartReplyConstants,
             final NotificationEntry entry) {
-        boolean enableAppGeneratedSmartReplies = (smartReplyConstants.isEnabled()
-                && (!smartReplyConstants.requiresTargetingP()
-                || entry.targetSdk >= Build.VERSION_CODES.P));
-
         Notification notification = entry.notification.getNotification();
         Pair<RemoteInput, Notification.Action> remoteInputActionPair =
                 notification.findRemoteInputActionPair(false /* freeform */);
         Pair<RemoteInput, Notification.Action> freeformRemoteInputActionPair =
                 notification.findRemoteInputActionPair(true /* freeform */);
 
+        if (!smartReplyConstants.isEnabled()) {
+            return new SmartRepliesAndActions(null, null, freeformRemoteInputActionPair != null);
+        }
+        // Only use smart replies from the app if they target P or above. We have this check because
+        // the smart reply API has been used for other things (Wearables) in the past. The API to
+        // add smart actions is new in Q so it doesn't require a target-sdk check.
+        boolean enableAppGeneratedSmartReplies = (!smartReplyConstants.requiresTargetingP()
+                || entry.targetSdk >= Build.VERSION_CODES.P);
+
         boolean appGeneratedSmartRepliesExist =
                 enableAppGeneratedSmartReplies
                         && remoteInputActionPair != null
@@ -1348,13 +1373,13 @@
         }
         // Apps didn't provide any smart replies / actions, use those from NAS (if any).
         if (!appGeneratedSmartRepliesExist && !appGeneratedSmartActionsExist) {
-            boolean useGeneratedReplies = !ArrayUtils.isEmpty(entry.smartReplies)
+            boolean useGeneratedReplies = !ArrayUtils.isEmpty(entry.systemGeneratedSmartReplies)
                     && freeformRemoteInputActionPair != null
                     && freeformRemoteInputActionPair.second.getAllowGeneratedReplies()
                     && freeformRemoteInputActionPair.second.actionIntent != null;
             if (useGeneratedReplies) {
                 smartReplies = new SmartReplyView.SmartReplies(
-                        entry.smartReplies,
+                        entry.systemGeneratedSmartReplies,
                         freeformRemoteInputActionPair.first,
                         freeformRemoteInputActionPair.second.actionIntent,
                         true /* fromAssistant */);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java
index cb1384c..aa221993 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java
@@ -25,7 +25,6 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
-import android.metrics.LogMaker;
 import android.net.Uri;
 import android.os.ServiceManager;
 import android.os.UserHandle;
@@ -392,12 +391,6 @@
             return false;
         }
 
-        LogMaker logMaker = (row.getStatusBarNotification() == null)
-                ? new LogMaker(MetricsProto.MetricsEvent.ACTION_NOTE_CONTROLS)
-                : row.getStatusBarNotification().getLogMaker();
-        mMetricsLogger.write(logMaker.setCategory(MetricsProto.MetricsEvent.ACTION_NOTE_CONTROLS)
-                    .setType(MetricsProto.MetricsEvent.TYPE_ACTION));
-
         // ensure that it's laid but not visible until actually laid out
         guts.setVisibility(View.INVISIBLE);
         // Post to ensure the the guts are properly laid out.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java
index 2a9a815..b6948fc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java
@@ -126,15 +126,23 @@
     private OnClickListener mOnKeepShowing = v -> {
         mExitReason = NotificationCounters.BLOCKING_HELPER_KEEP_SHOWING;
         closeControls(v);
-        mMetricsLogger.write(getLogMaker().setType(MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
-                .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_STAY_SILENT));
+        if (mIsForBlockingHelper) {
+            mMetricsLogger.write(getLogMaker().setCategory(
+                    MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
+                    .setType(MetricsEvent.TYPE_ACTION)
+                    .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_STAY_SILENT));
+        }
     };
 
     private OnClickListener mOnToggleSilent = v -> {
         Runnable saveImportance = () -> {
             swapContent(ACTION_TOGGLE_SILENT, true /* animate */);
-            mMetricsLogger.write(getLogMaker().setType(MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
-                    .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_ALERT_ME));
+            if (mIsForBlockingHelper) {
+                mMetricsLogger.write(getLogMaker()
+                        .setCategory(MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
+                        .setType(MetricsEvent.TYPE_ACTION)
+                        .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_ALERT_ME));
+            }
         };
         if (mCheckSaveListener != null) {
             mCheckSaveListener.checkSave(saveImportance, mSbn);
@@ -146,8 +154,12 @@
     private OnClickListener mOnStopOrMinimizeNotifications = v -> {
         Runnable saveImportance = () -> {
             swapContent(ACTION_BLOCK, true /* animate */);
-            mMetricsLogger.write(getLogMaker().setType(MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
-                    .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_BLOCKED));
+            if (mIsForBlockingHelper) {
+                mMetricsLogger.write(getLogMaker()
+                        .setCategory(MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
+                        .setType(MetricsEvent.TYPE_ACTION)
+                        .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_BLOCKED));
+            }
         };
         if (mCheckSaveListener != null) {
             mCheckSaveListener.checkSave(saveImportance, mSbn);
@@ -159,11 +171,16 @@
     private OnClickListener mOnUndo = v -> {
         // Reset exit counter that we'll log and record an undo event separately (not an exit event)
         mExitReason = NotificationCounters.BLOCKING_HELPER_DISMISSED;
-        logBlockingHelperCounter(NotificationCounters.BLOCKING_HELPER_UNDO);
-        mMetricsLogger.write(importanceChangeLogMaker().setType(MetricsEvent.TYPE_DISMISS));
+        if (mIsForBlockingHelper) {
+            logBlockingHelperCounter(NotificationCounters.BLOCKING_HELPER_UNDO);
+            mMetricsLogger.write(getLogMaker().setCategory(
+                    MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
+                    .setType(MetricsEvent.TYPE_DISMISS)
+                    .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_UNDO));
+        } else {
+            mMetricsLogger.write(importanceChangeLogMaker().setType(MetricsEvent.TYPE_DISMISS));
+        }
         swapContent(ACTION_UNDO, true /* animate */);
-        mMetricsLogger.write(getLogMaker().setType(MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
-                .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_UNDO));
     };
 
     public NotificationInfo(Context context, AttributeSet attrs) {
@@ -263,10 +280,11 @@
         bindPrompt();
         bindButtons();
 
-        mMetricsLogger.write(getLogMaker().setType(MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
-                .setSubtype(MetricsEvent.BLOCKING_HELPER_DISPLAY));
+        mMetricsLogger.write(notificationControlsLogMaker());
     }
 
+
+
     private void bindHeader() throws RemoteException {
         // Package name
         Drawable pkgicon = null;
@@ -397,19 +415,6 @@
         }
     }
 
-    /**
-     * Returns an initialized LogMaker for logging importance changes.
-     * The caller may override the type (to DISMISS) before passing it to mMetricsLogger.
-     * @return new LogMaker
-     */
-    private LogMaker importanceChangeLogMaker() {
-        Integer chosenImportance =
-                mChosenImportance != null ? mChosenImportance : mStartingChannelImportance;
-        return new LogMaker(MetricsEvent.ACTION_SAVE_IMPORTANCE)
-                .setType(MetricsEvent.TYPE_ACTION)
-                .setSubtype(chosenImportance - mStartingChannelImportance);
-    }
-
     private boolean hasImportanceChanged() {
         return mSingleNotificationChannel != null
                 && mChosenImportance != null
@@ -609,8 +614,8 @@
         confirmation.setAlpha(1f);
         header.setVisibility(VISIBLE);
         header.setAlpha(1f);
-        mMetricsLogger.write(getLogMaker().setType(MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
-                .setSubtype(MetricsEvent.BLOCKING_HELPER_DISMISS));
+
+        mMetricsLogger.write(notificationControlsLogMaker().setType(MetricsEvent.TYPE_CLOSE));
     }
 
     @Override
@@ -757,7 +762,39 @@
         }
     }
 
+    /**
+     * Returns a LogMaker with all available notification information.
+     * Caller should set category, type, and maybe subtype, before passing it to mMetricsLogger.
+     * @return LogMaker
+     */
     private LogMaker getLogMaker() {
-        return mSbn.getLogMaker().setCategory(MetricsEvent.NOTIFICATION_ITEM);
+        // The constructor requires a category, so also do it in the other branch for consistency.
+        return mSbn == null ? new LogMaker(MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
+                : mSbn.getLogMaker().setCategory(MetricsEvent.NOTIFICATION_BLOCKING_HELPER);
+    }
+
+    /**
+     * Returns an initialized LogMaker for logging importance changes.
+     * The caller may override the type before passing it to mMetricsLogger.
+     * @return LogMaker
+     */
+    private LogMaker importanceChangeLogMaker() {
+        Integer chosenImportance =
+                mChosenImportance != null ? mChosenImportance : mStartingChannelImportance;
+        return getLogMaker().setCategory(MetricsEvent.ACTION_SAVE_IMPORTANCE)
+                .setType(MetricsEvent.TYPE_ACTION)
+                .setSubtype(chosenImportance - mStartingChannelImportance);
+    }
+
+    /**
+     * Returns an initialized LogMaker for logging open/close of the info display.
+     * The caller may override the type before passing it to mMetricsLogger.
+     * @return LogMaker
+     */
+    private LogMaker notificationControlsLogMaker() {
+        return getLogMaker().setCategory(MetricsEvent.ACTION_NOTE_CONTROLS)
+                .setType(MetricsEvent.TYPE_OPEN)
+                .setSubtype(mIsForBlockingHelper ? MetricsEvent.BLOCKING_HELPER_DISPLAY
+                        : MetricsEvent.BLOCKING_HELPER_UNKNOWN);
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
index 302d630..304d2ee 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
@@ -47,7 +47,7 @@
     private static final String BIOMETRIC_WAKE_LOCK_NAME = "wake-and-unlock wakelock";
 
     /**
-     * Mode in which we don't need to wake up the device when we get a fingerprint.
+     * Mode in which we don't need to wake up the device when we authenticate.
      */
     public static final int MODE_NONE = 0;
 
@@ -70,8 +70,7 @@
     public static final int MODE_SHOW_BOUNCER = 3;
 
     /**
-     * Mode in which we only wake up the device, and keyguard was not showing when we acquired a
-     * fingerprint.
+     * Mode in which we only wake up the device, and keyguard was not showing when we authenticated.
      * */
     public static final int MODE_ONLY_WAKE = 4;
 
@@ -96,22 +95,21 @@
      */
     private static final float BIOMETRIC_COLLAPSE_SPEEDUP_FACTOR = 1.1f;
 
-    private final NotificationMediaManager mMediaManager =
-            Dependency.get(NotificationMediaManager.class);
-    private PowerManager mPowerManager;
-    private Handler mHandler = new Handler();
+    private final NotificationMediaManager mMediaManager;
+    private final PowerManager mPowerManager;
+    private final Handler mHandler;
     private PowerManager.WakeLock mWakeLock;
-    private KeyguardUpdateMonitor mUpdateMonitor;
+    private final KeyguardUpdateMonitor mUpdateMonitor;
+    private final UnlockMethodCache mUnlockMethodCache;
+    private final StatusBarWindowController mStatusBarWindowController;
+    private final Context mContext;
+    private final int mWakeUpDelay;
     private int mMode;
     private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
-    private StatusBarWindowController mStatusBarWindowController;
     private DozeScrimController mDozeScrimController;
     private KeyguardViewMediator mKeyguardViewMediator;
     private ScrimController mScrimController;
     private StatusBar mStatusBar;
-    private final UnlockMethodCache mUnlockMethodCache;
-    private final Context mContext;
-    private final int mWakeUpDelay;
     private int mPendingAuthenticatedUserId = -1;
     private BiometricSourceType mPendingAuthenticatedBioSourceType = null;
     private boolean mPendingShowBouncer;
@@ -122,11 +120,14 @@
                                      KeyguardViewMediator keyguardViewMediator,
                                      ScrimController scrimController,
                                      StatusBar statusBar,
-                                     UnlockMethodCache unlockMethodCache) {
+                                     UnlockMethodCache unlockMethodCache, Handler handler,
+                                     KeyguardUpdateMonitor keyguardUpdateMonitor,
+                                     int wakeUpDelay) {
         mContext = context;
         mPowerManager = context.getSystemService(PowerManager.class);
-        mUpdateMonitor = KeyguardUpdateMonitor.getInstance(context);
+        mUpdateMonitor = keyguardUpdateMonitor;
         mUpdateMonitor.registerCallback(this);
+        mMediaManager = Dependency.get(NotificationMediaManager.class);
         Dependency.get(WakefulnessLifecycle.class).addObserver(mWakefulnessObserver);
         Dependency.get(ScreenLifecycle.class).addObserver(mScreenObserver);
         mStatusBarWindowController = Dependency.get(StatusBarWindowController.class);
@@ -135,8 +136,8 @@
         mScrimController = scrimController;
         mStatusBar = statusBar;
         mUnlockMethodCache = unlockMethodCache;
-        mWakeUpDelay = context.getResources().getInteger(
-                com.android.internal.R.integer.config_wakeUpDelayDoze);
+        mHandler = handler;
+        mWakeUpDelay = wakeUpDelay;
     }
 
     public void setStatusBarKeyguardViewManager(
@@ -206,7 +207,7 @@
             Trace.endSection();
             return;
         }
-        startWakeAndUnlock(calculateMode());
+        startWakeAndUnlock(calculateMode(biometricSourceType));
     }
 
     public void startWakeAndUnlock(int mode) {
@@ -295,7 +296,7 @@
     }
 
     private void showBouncer() {
-        if (calculateMode() == MODE_SHOW_BOUNCER) {
+        if (mMode == MODE_SHOW_BOUNCER) {
             mStatusBarKeyguardViewManager.showBouncer(false);
         }
         mStatusBarKeyguardViewManager.animateCollapsePanels(
@@ -339,29 +340,30 @@
         return mMode;
     }
 
-    private int calculateMode() {
+    private int calculateMode(BiometricSourceType biometricSourceType) {
         boolean unlockingAllowed = mUpdateMonitor.isUnlockingWithBiometricAllowed();
         boolean deviceDreaming = mUpdateMonitor.isDreaming();
+        boolean isFace = biometricSourceType == BiometricSourceType.FACE;
 
         if (!mUpdateMonitor.isDeviceInteractive()) {
             if (!mStatusBarKeyguardViewManager.isShowing()) {
                 return MODE_ONLY_WAKE;
             } else if (mDozeScrimController.isPulsing() && unlockingAllowed) {
-                return MODE_WAKE_AND_UNLOCK_PULSING;
+                return isFace ? MODE_NONE : MODE_WAKE_AND_UNLOCK_PULSING;
             } else if (unlockingAllowed || !mUnlockMethodCache.isMethodSecure()) {
                 return MODE_WAKE_AND_UNLOCK;
             } else {
                 return MODE_SHOW_BOUNCER;
             }
         }
-        if (unlockingAllowed && deviceDreaming) {
+        if (unlockingAllowed && deviceDreaming && !isFace) {
             return MODE_WAKE_AND_UNLOCK_FROM_DREAM;
         }
         if (mStatusBarKeyguardViewManager.isShowing()) {
             if (mStatusBarKeyguardViewManager.isBouncerShowing() && unlockingAllowed) {
                 return MODE_DISMISS_BOUNCER;
             } else if (unlockingAllowed) {
-                return MODE_UNLOCK;
+                return isFace ? MODE_ONLY_WAKE : MODE_UNLOCK;
             } else if (!mStatusBarKeyguardViewManager.isBouncerShowing()) {
                 return MODE_SHOW_BOUNCER;
             }
@@ -437,7 +439,7 @@
     }
 
     /**
-     * Successful authentication with fingerprint that wakes up the device.
+     * Successful authentication with fingerprint, face, or iris that wakes up the device.
      */
     public boolean isWakeAndUnlock() {
         return mMode == MODE_WAKE_AND_UNLOCK
@@ -446,7 +448,8 @@
     }
 
     /**
-     * Successful authentication with fingerprint when the screen was either on or off.
+     * Successful authentication with fingerprint, face, or iris when the screen was either
+     * on or off.
      */
     public boolean isBiometricUnlock() {
         return isWakeAndUnlock() || mMode == MODE_UNLOCK;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
index 7f75223..035ccf1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
@@ -359,6 +359,14 @@
     }
 
     @Override
+    public boolean shouldExtendLifetime(NotificationEntry entry) {
+        // We should not defer the removal if reordering isn't allowed since otherwise
+        // these won't disappear until reordering is allowed again, which happens only once
+        // the notification panel is collapsed again.
+        return mVisualStabilityManager.isReorderingAllowed() && super.shouldExtendLifetime(entry);
+    }
+
+    @Override
     public void onConfigChanged(Configuration newConfig) {
         Resources resources = mContext.getResources();
         mStatusBarHeight = resources.getDimensionPixelSize(
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
index 2e9d9bc..6fe23fb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
@@ -251,7 +251,6 @@
         mUnlockMethodCache.addListener(this);
         KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
         mLockIcon.setScreenOn(updateMonitor.isScreenOn());
-        mLockIcon.setDeviceInteractive(updateMonitor.isDeviceInteractive());
         mLockIcon.update();
         setClipChildren(false);
         setClipToPadding(false);
@@ -337,8 +336,8 @@
         updateRightAffordanceIcon();
 
         lp = mLockIcon.getLayoutParams();
-        lp.width = getResources().getDimensionPixelSize(R.dimen.keyguard_affordance_width);
-        lp.height = getResources().getDimensionPixelSize(R.dimen.keyguard_affordance_height);
+        lp.width = getResources().getDimensionPixelSize(R.dimen.keyguard_lock_width);
+        lp.height = getResources().getDimensionPixelSize(R.dimen.keyguard_lock_height);
         mLockIcon.setLayoutParams(lp);
         mLockIcon.setContentDescription(getContext().getText(R.string.accessibility_unlock_button));
         mLockIcon.update(true /* force */);
@@ -748,16 +747,6 @@
                 }
 
                 @Override
-                public void onStartedWakingUp() {
-                    mLockIcon.setDeviceInteractive(true);
-                }
-
-                @Override
-                public void onFinishedGoingToSleep(int why) {
-                    mLockIcon.setDeviceInteractive(false);
-                }
-
-                @Override
                 public void onScreenTurnedOn() {
                     mLockIcon.setScreenOn(true);
                 }
@@ -862,7 +851,8 @@
                         R.string.accessibility_voice_assist_button);
             } else {
                 mIconState.isVisible = mUserSetupComplete && showAffordance && isPhoneVisible();
-                mIconState.drawable = mContext.getDrawable(R.drawable.ic_phone_24dp);
+                mIconState.drawable = mContext.getDrawable(
+                        com.android.internal.R.drawable.ic_phone);
                 mIconState.contentDescription = mContext.getString(
                         R.string.accessibility_phone_button);
             }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
index d934d95..60015ef 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
@@ -18,12 +18,13 @@
 
 import android.content.Context;
 import android.content.res.Configuration;
+import android.content.res.TypedArray;
 import android.graphics.Color;
 import android.graphics.PorterDuff;
 import android.graphics.drawable.AnimatedVectorDrawable;
 import android.graphics.drawable.Drawable;
-import android.os.SystemProperties;
 import android.util.AttributeSet;
+import android.view.ContextThemeWrapper;
 import android.view.accessibility.AccessibilityNodeInfo;
 
 import com.android.internal.graphics.ColorUtils;
@@ -44,28 +45,33 @@
     private static final int STATE_LOCK_OPEN = 1;
     private static final int STATE_FACE_UNLOCK = 2;
     private static final int STATE_FINGERPRINT = 3;
-    private static final int STATE_FINGERPRINT_ERROR = 4;
+    private static final int STATE_BIOMETRICS_ERROR = 4;
 
     private int mLastState = 0;
-    private boolean mLastDeviceInteractive;
-    private boolean mTransientFpError;
-    private boolean mDeviceInteractive;
+    private boolean mTransientBiometricsError;
     private boolean mScreenOn;
     private boolean mLastScreenOn;
     private Drawable mUserAvatarIcon;
     private final UnlockMethodCache mUnlockMethodCache;
     private AccessibilityController mAccessibilityController;
-    private boolean mHasFingerPrintIcon;
-    private boolean mHasFaceUnlockIcon;
+    private boolean mHasFingerPrintState;
+    private boolean mIsFaceUnlockState;
     private int mDensity;
     private boolean mPulsing;
     private boolean mDozing;
+    private boolean mLastDozing;
+    private boolean mLastPulsing;
 
     private final Runnable mDrawOffTimeout = () -> update(true /* forceUpdate */);
     private float mDarkAmount;
 
     public LockIcon(Context context, AttributeSet attrs) {
         super(context, attrs);
+        TypedArray typedArray = context.getTheme().obtainStyledAttributes(
+                attrs, new int[]{ R.attr.backgroundProtectedStyle }, 0, 0);
+        mContext = new ContextThemeWrapper(context,
+                typedArray.getResourceId(0, R.style.BackgroundProtectedStyle));
+        typedArray.recycle();
         mUnlockMethodCache = UnlockMethodCache.getInstance(context);
     }
 
@@ -75,13 +81,11 @@
         update();
     }
 
-    public void setTransientFpError(boolean transientFpError) {
-        mTransientFpError = transientFpError;
-        update();
-    }
-
-    public void setDeviceInteractive(boolean deviceInteractive) {
-        mDeviceInteractive = deviceInteractive;
+    /**
+     * If we're currently presenting an authentication error message.
+     */
+    public void setTransientBiometricsError(boolean transientBiometricsError) {
+        mTransientBiometricsError = transientBiometricsError;
         update();
     }
 
@@ -106,21 +110,14 @@
 
     public void update(boolean force) {
         int state = getState();
-        boolean anyFingerprintIcon = state == STATE_FINGERPRINT || state == STATE_FINGERPRINT_ERROR;
-        mHasFaceUnlockIcon = state == STATE_FACE_UNLOCK;
-        if (state != mLastState || mDeviceInteractive != mLastDeviceInteractive
-                || mScreenOn != mLastScreenOn || force) {
-            int iconAnimRes =
-                getAnimationResForTransition(mLastState, state, mLastDeviceInteractive,
-                    mDeviceInteractive, mLastScreenOn, mScreenOn);
+        boolean anyFingerprintState = state == STATE_FINGERPRINT
+                || state == STATE_BIOMETRICS_ERROR;
+        mIsFaceUnlockState = state == STATE_FACE_UNLOCK;
+        if (state != mLastState || mLastDozing == mDozing || mLastPulsing == mPulsing
+                || mLastScreenOn != mScreenOn || force) {
+            int iconAnimRes = getAnimationResForTransition(mLastState, state, mLastPulsing,
+                    mPulsing, mLastDozing, mDozing);
             boolean isAnim = iconAnimRes != -1;
-            if (iconAnimRes == R.drawable.lockscreen_fingerprint_draw_off_animation) {
-                anyFingerprintIcon = true;
-            } else if (iconAnimRes == R.drawable.trusted_state_to_error_animation) {
-                anyFingerprintIcon = true;
-            } else if (iconAnimRes == R.drawable.error_to_trustedstate_animation) {
-                anyFingerprintIcon = true;
-            }
 
             Drawable icon;
             if (isAnim) {
@@ -128,7 +125,7 @@
                 icon = mContext.getDrawable(iconAnimRes);
             } else {
                 // Load the static icon resource based on the current state.
-                icon = getIconForState(state, mScreenOn, mDeviceInteractive);
+                icon = getIconForState(state);
             }
 
             final AnimatedVectorDrawable animation = icon instanceof AnimatedVectorDrawable
@@ -136,18 +133,18 @@
                     : null;
             setImageDrawable(icon, false);
             updateDarkTint();
-            if (mHasFaceUnlockIcon) {
+            if (mIsFaceUnlockState) {
                 announceForAccessibility(getContext().getString(
                     R.string.accessibility_scanning_face));
             }
 
-            mHasFingerPrintIcon = anyFingerprintIcon;
+            mHasFingerPrintState = anyFingerprintState;
             if (animation != null && isAnim) {
                 animation.forceAnimationOnUI();
                 animation.start();
             }
 
-            if (iconAnimRes == R.drawable.lockscreen_fingerprint_draw_off_animation) {
+            if (isAnim && !mLastScreenOn) {
                 removeCallbacks(mDrawOffTimeout);
                 postDelayed(mDrawOffTimeout, FP_DRAW_OFF_TIMEOUT);
             } else {
@@ -155,8 +152,9 @@
             }
 
             mLastState = state;
-            mLastDeviceInteractive = mDeviceInteractive;
             mLastScreenOn = mScreenOn;
+            mLastDozing = mDozing;
+            mLastPulsing = mPulsing;
         }
 
         setVisibility(mDozing && !mPulsing ? GONE : VISIBLE);
@@ -167,11 +165,11 @@
         if (mAccessibilityController == null) {
             return;
         }
+        boolean canLock = mUnlockMethodCache.isMethodSecure()
+                && mUnlockMethodCache.canSkipBouncer();
         boolean clickToUnlock = mAccessibilityController.isAccessibilityEnabled();
-        boolean clickToForceLock = mUnlockMethodCache.isTrustManaged()
-                && !clickToUnlock;
-        boolean longClickToForceLock = mUnlockMethodCache.isTrustManaged()
-                && !clickToForceLock;
+        boolean clickToForceLock = canLock && !clickToUnlock;
+        boolean longClickToForceLock = canLock && !clickToForceLock;
         setClickable(clickToForceLock || clickToUnlock);
         setLongClickable(longClickToForceLock);
         setFocusable(mAccessibilityController.isAccessibilityEnabled());
@@ -180,7 +178,7 @@
     @Override
     public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
         super.onInitializeAccessibilityNodeInfo(info);
-        if (mHasFingerPrintIcon) {
+        if (mHasFingerPrintState) {
             AccessibilityNodeInfo.AccessibilityAction unlock
                     = new AccessibilityNodeInfo.AccessibilityAction(
                     AccessibilityNodeInfo.ACTION_CLICK,
@@ -188,7 +186,7 @@
             info.addAction(unlock);
             info.setHintText(getContext().getString(
                     R.string.accessibility_waiting_for_fingerprint));
-        } else if (mHasFaceUnlockIcon){
+        } else if (mIsFaceUnlockState) {
             //Avoid 'button' to be spoken for scanning face
             info.setClassName(LockIcon.class.getName());
             info.setContentDescription(getContext().getString(
@@ -200,26 +198,24 @@
         mAccessibilityController = accessibilityController;
     }
 
-    private Drawable getIconForState(int state, boolean screenOn, boolean deviceInteractive) {
+    private Drawable getIconForState(int state) {
         int iconRes;
         switch (state) {
             case STATE_FINGERPRINT:
             case STATE_LOCKED:
-                iconRes = R.drawable.ic_lock;
+            case STATE_FACE_UNLOCK:
+                iconRes = com.android.internal.R.drawable.ic_lock_24dp;
                 break;
             case STATE_LOCK_OPEN:
                 if (mUnlockMethodCache.isTrustManaged() && mUnlockMethodCache.isTrusted()
                     && mUserAvatarIcon != null) {
                     return mUserAvatarIcon;
                 } else {
-                    iconRes = R.drawable.ic_lock_open;
+                    iconRes = com.android.internal.R.drawable.ic_lock_open_24dp;
                 }
                 break;
-            case STATE_FACE_UNLOCK:
-                iconRes = R.drawable.ic_face_unlock;
-                break;
-            case STATE_FINGERPRINT_ERROR:
-                iconRes = R.drawable.ic_fingerprint_error;
+            case STATE_BIOMETRICS_ERROR:
+                iconRes = com.android.internal.R.drawable.ic_auth_error;
                 break;
             default:
                 throw new IllegalArgumentException();
@@ -229,36 +225,36 @@
     }
 
     private int getAnimationResForTransition(int oldState, int newState,
-            boolean oldDeviceInteractive, boolean deviceInteractive,
-            boolean oldScreenOn, boolean screenOn) {
-        if (oldState == STATE_FINGERPRINT && newState == STATE_FINGERPRINT_ERROR) {
-            return R.drawable.lockscreen_fingerprint_fp_to_error_state_animation;
-        } else if (oldState == STATE_LOCK_OPEN && newState == STATE_FINGERPRINT_ERROR) {
-            return R.drawable.trusted_state_to_error_animation;
-        } else if (oldState == STATE_FINGERPRINT_ERROR && newState == STATE_LOCK_OPEN) {
-            return R.drawable.error_to_trustedstate_animation;
-        } else if (oldState == STATE_FINGERPRINT_ERROR && newState == STATE_FINGERPRINT) {
-            return R.drawable.lockscreen_fingerprint_error_state_to_fp_animation;
-        } else if (oldState == STATE_FINGERPRINT && newState == STATE_LOCK_OPEN
-                && !mUnlockMethodCache.isTrusted()) {
-            return R.drawable.lockscreen_fingerprint_draw_off_animation;
-        } else if (newState == STATE_FINGERPRINT && (!oldScreenOn && screenOn && deviceInteractive
-                || screenOn && !oldDeviceInteractive && deviceInteractive)) {
-            return R.drawable.lockscreen_fingerprint_draw_on_animation;
-        } else {
-            return -1;
+            boolean wasPulsing, boolean pulsing,
+            boolean wasDozing, boolean dozing) {
+
+        boolean isError = newState == STATE_BIOMETRICS_ERROR;
+        boolean isUnlocked = newState == STATE_LOCK_OPEN;
+        boolean isLocked = !isUnlocked;
+        boolean wasUnlocked = oldState == STATE_LOCK_OPEN;
+
+        if (isError) {
+            return com.android.internal.R.anim.lock_to_error;
+        } else if (isUnlocked) {
+            return com.android.internal.R.anim.lock_unlock;
+        } else if (wasUnlocked && isLocked && mScreenOn) {
+            return com.android.internal.R.anim.lock_lock;
+        } else if (isLocked && (!wasPulsing && pulsing || wasDozing && !dozing)) {
+            return com.android.internal.R.anim.lock_in;
         }
+        return -1;
     }
 
     private int getState() {
         KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
         boolean fingerprintRunning = updateMonitor.isFingerprintDetectionRunning();
         boolean unlockingAllowed = updateMonitor.isUnlockingWithBiometricAllowed();
-        if (mTransientFpError) {
-            return STATE_FINGERPRINT_ERROR;
+        if (mTransientBiometricsError) {
+            return STATE_BIOMETRICS_ERROR;
         } else if (mUnlockMethodCache.canSkipBouncer()) {
             return STATE_LOCK_OPEN;
-        } else if (mUnlockMethodCache.isFaceUnlockRunning()) {
+        } else if (mUnlockMethodCache.isFaceUnlockRunning()
+                || updateMonitor.isFaceDetectionRunning()) {
             return STATE_FACE_UNLOCK;
         } else if (fingerprintRunning && unlockingAllowed) {
             return STATE_FINGERPRINT;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
index 8bf1c58..02683c1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -158,6 +158,7 @@
     private NavigationBackAction mBackAction;
     private QuickSwitchAction mQuickSwitchAction;
     private NavigationAssistantAction mAssistantAction;
+    private NavigationNotificationPanelAction mNotificationPanelAction;
 
     /**
      * Helper that is responsible for showing the right toast when a disallowed activity operation
@@ -374,6 +375,10 @@
             mAssistantAction = new NavigationAssistantAction(this, mOverviewProxyService,
                     assistManager);
         }
+        if (mNotificationPanelAction == null) {
+            mNotificationPanelAction = new NavigationNotificationPanelAction(this,
+                    mOverviewProxyService, panel);
+        }
         if (mGestureHelper instanceof QuickStepController) {
             ((QuickStepController) mGestureHelper).setComponents(this);
             updateNavigationGestures();
@@ -406,6 +411,8 @@
                 return mQuickSwitchAction;
             case NavigationPrototypeController.ACTION_ASSISTANT:
                 return mAssistantAction;
+            case NavigationPrototypeController.ACTION_EXPAND_NOTIFICATION:
+                return mNotificationPanelAction;
             case NavigationPrototypeController.ACTION_NOTHING:
                 return null;
             default:
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationGestureAction.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationGestureAction.java
index 39fbbb1..eca14eb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationGestureAction.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationGestureAction.java
@@ -20,12 +20,10 @@
 import static android.view.WindowManagerPolicyConstants.NAV_BAR_RIGHT;
 
 import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_NONE;
-import static com.android.systemui.statusbar.phone.NavigationPrototypeController.PROTOTYPE_ENABLED;
 
 import android.annotation.NonNull;
 import android.content.Context;
 import android.graphics.Canvas;
-import android.provider.Settings;
 import android.view.MotionEvent;
 
 import com.android.systemui.recents.OverviewProxyService;
@@ -34,10 +32,6 @@
  * A gesture action that would be triggered and reassigned by {@link QuickStepController}
  */
 public abstract class NavigationGestureAction {
-    private static final String ENABLE_TASK_STABILIZER_FLAG = "ENABLE_TASK_STABILIZER";
-
-    static private boolean sLastTaskStabilizationFlag;
-
     protected final NavigationBarView mNavigationBarView;
     protected final OverviewProxyService mProxySender;
 
@@ -50,9 +44,6 @@
             @NonNull OverviewProxyService service) {
         mNavigationBarView = navigationBarView;
         mProxySender = service;
-        sLastTaskStabilizationFlag = Settings.Global.getInt(
-                mNavigationBarView.getContext().getContentResolver(),
-                ENABLE_TASK_STABILIZER_FLAG, 0) != 0;
     }
 
     /**
@@ -82,15 +73,6 @@
      */
     public void startGesture(MotionEvent event) {
         mIsActive = true;
-
-        // Tell launcher that this action requires a stable task list or not
-        boolean flag = requiresStableTaskList();
-        if (getGlobalBoolean(PROTOTYPE_ENABLED) && flag != sLastTaskStabilizationFlag) {
-            Settings.Global.putInt(mNavigationBarView.getContext().getContentResolver(),
-                    ENABLE_TASK_STABILIZER_FLAG, flag ? 1 : 0);
-            sLastTaskStabilizationFlag = flag;
-        }
-
         onGestureStart(event);
     }
 
@@ -163,13 +145,6 @@
      */
     public abstract boolean isEnabled();
 
-    /**
-     * @return action requires a stable task list from launcher
-     */
-    protected boolean requiresStableTaskList() {
-        return false;
-    }
-
     protected void onDarkIntensityChange(float intensity) {
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationNotificationPanelAction.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationNotificationPanelAction.java
new file mode 100644
index 0000000..6c7870d
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationNotificationPanelAction.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.phone;
+
+import android.annotation.NonNull;
+import android.view.MotionEvent;
+
+import com.android.systemui.recents.OverviewProxyService;
+
+/**
+ * Triggers notification panel to be expanded when executed
+ */
+public class NavigationNotificationPanelAction extends NavigationGestureAction {
+    private final NotificationPanelView mPanelView;
+
+    public NavigationNotificationPanelAction(@NonNull NavigationBarView navigationBarView,
+            @NonNull OverviewProxyService service, @NonNull NotificationPanelView panelView) {
+        super(navigationBarView, service);
+        mPanelView = panelView;
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return true;
+    }
+
+    @Override
+    public boolean disableProxyEvents() {
+        return true;
+    }
+
+    @Override
+    public void onGestureStart(MotionEvent event) {
+        mPanelView.expand(true);
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationPrototypeController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationPrototypeController.java
index f762a6a..b4feb25 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationPrototypeController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationPrototypeController.java
@@ -37,11 +37,10 @@
 
     private final String GESTURE_MATCH_SETTING = "quickstepcontroller_gesture_match_map";
     public static final String NAV_COLOR_ADAPT_ENABLE_SETTING = "navbar_color_adapt_enable";
-    public static final String PROTOTYPE_ENABLED = "prototype_enabled";
 
     @Retention(RetentionPolicy.SOURCE)
     @IntDef({ACTION_DEFAULT, ACTION_QUICKSTEP, ACTION_QUICKSCRUB, ACTION_BACK,
-            ACTION_QUICKSWITCH, ACTION_NOTHING, ACTION_ASSISTANT})
+            ACTION_QUICKSWITCH, ACTION_NOTHING, ACTION_ASSISTANT, ACTION_EXPAND_NOTIFICATION})
     @interface GestureAction {}
     static final int ACTION_DEFAULT = 0;
     static final int ACTION_QUICKSTEP = 1;
@@ -50,6 +49,7 @@
     static final int ACTION_QUICKSWITCH = 4;
     static final int ACTION_NOTHING = 5;
     static final int ACTION_ASSISTANT = 6;
+    static final int ACTION_EXPAND_NOTIFICATION = 7;
 
     private OnPrototypeChangedListener mListener;
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
index e86996a..9e99fe9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
@@ -11,9 +11,7 @@
 import android.view.ViewGroup;
 import android.widget.FrameLayout;
 
-import androidx.annotation.NonNull;
-import androidx.collection.ArrayMap;
-
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.statusbar.StatusBarIcon;
 import com.android.internal.util.ContrastColorUtil;
 import com.android.internal.widget.ViewClippingUtil;
@@ -21,6 +19,7 @@
 import com.android.systemui.R;
 import com.android.systemui.plugins.DarkIconDispatcher;
 import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
+import com.android.systemui.statusbar.NotificationListener;
 import com.android.systemui.statusbar.NotificationShelf;
 import com.android.systemui.statusbar.StatusBarIconView;
 import com.android.systemui.statusbar.StatusBarStateController;
@@ -28,11 +27,13 @@
 import com.android.systemui.statusbar.notification.NotificationUtils;
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
 import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
-import com.android.systemui.tuner.TunerService;
 
 import java.util.ArrayList;
 import java.util.function.Function;
 
+import androidx.annotation.NonNull;
+import androidx.collection.ArrayMap;
+
 /**
  * A controller for the space in the status bar to the left of the system icons. This area is
  * normally reserved for notifications.
@@ -46,18 +47,19 @@
     private final NotificationEntryManager mEntryManager;
     private final Runnable mUpdateStatusBarIcons = this::updateStatusBarIcons;
     private final StatusBarStateController mStatusBarStateController;
-    private final TunerService.Tunable mTunable = new TunerService.Tunable() {
-        @Override
-        public void onTuningChanged(String key, String newValue) {
-            if (key.equals(LOW_PRIORITY)) {
-                mShowLowPriority = "1".equals(newValue)
-                        || !NotificationUtils.useNewInterruptionModel(mContext);
-                if (mNotificationScrollLayout != null) {
-                    updateStatusBarIcons();
+    @VisibleForTesting
+    final NotificationListener.NotificationSettingsListener mSettingsListener =
+            new NotificationListener.NotificationSettingsListener() {
+                @Override
+                public void onStatusBarIconsBehaviorChanged(boolean hideSilentStatusIcons) {
+                    if (NotificationUtils.useNewInterruptionModel(mContext)) {
+                        mShowLowPriority = !hideSilentStatusIcons;
+                        if (mNotificationScrollLayout != null) {
+                            updateStatusBarIcons();
+                        }
+                    }
                 }
-            }
-        }
-    };
+            };
 
     private int mIconSize;
     private int mIconHPadding;
@@ -71,7 +73,7 @@
     private ViewGroup mNotificationScrollLayout;
     private Context mContext;
     private boolean mFullyDark;
-    private boolean mShowLowPriority;
+    private boolean mShowLowPriority = true;
 
     /**
      * Ratio representing being awake or in ambient mode, where 1 is dark and 0 awake.
@@ -90,15 +92,15 @@
             view -> view instanceof StatusBarWindowView;
 
     public NotificationIconAreaController(Context context, StatusBar statusBar,
-            StatusBarStateController statusBarStateController) {
+            StatusBarStateController statusBarStateController,
+            NotificationListener notificationListener) {
         mStatusBar = statusBar;
         mContrastColorUtil = ContrastColorUtil.getInstance(context);
         mContext = context;
         mEntryManager = Dependency.get(NotificationEntryManager.class);
         mStatusBarStateController = statusBarStateController;
         mStatusBarStateController.addCallback(this);
-
-        Dependency.get(TunerService.class).addTunable(mTunable, LOW_PRIORITY);
+        notificationListener.addNotificationSettingsListener(mSettingsListener);
 
         initializeNotificationAreaViews(context);
     }
@@ -243,6 +245,11 @@
                 true /* hideRepliedMessages */);
     }
 
+    @VisibleForTesting
+    boolean shouldShouldLowPriorityIcons() {
+        return mShowLowPriority;
+    }
+
     /**
      * Updates the notification icons for a host layout. This will ensure that the notification
      * host layout will have the same icons like the ones in here.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index c108371..a9727c9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -448,6 +448,11 @@
                 false);
         addView(mKeyguardStatusView, index);
 
+        // Re-associate the clock container with the keyguard clock switch.
+        mBigClockContainer.removeAllViews();
+        KeyguardClockSwitch keyguardClockSwitch = findViewById(R.id.keyguard_clock_container);
+        keyguardClockSwitch.setBigClockContainer(mBigClockContainer);
+
         // Update keyguard bottom area
         index = indexOfChild(mKeyguardBottomArea);
         removeView(mKeyguardBottomArea);
@@ -1795,11 +1800,9 @@
                 || mBarState == StatusBarState.SHADE_LOCKED) {
             boolean active = getMaxPanelHeight() - getExpandedHeight() > mUnlockMoveDistance;
             KeyguardAffordanceView lockIcon = mKeyguardBottomArea.getLockIcon();
-            if (active && !mUnlockIconActive && mTracking) {
-                lockIcon.setImageAlpha(1.0f, true, 150, Interpolators.FAST_OUT_LINEAR_IN, null);
-            } else if (!active && mUnlockIconActive && mTracking) {
-                lockIcon.setImageAlpha(lockIcon.getRestingAlpha(), true /* animate */,
-                        150, Interpolators.FAST_OUT_LINEAR_IN, null);
+            if (active != mUnlockIconActive && mTracking) {
+                lockIcon.setImageAlpha(lockIcon.getRestingAlpha(), true, 150,
+                        Interpolators.FAST_OUT_LINEAR_IN, null);
             }
             mUnlockIconActive = active;
         }
@@ -2010,7 +2013,6 @@
                 || mBarState == StatusBarState.SHADE_LOCKED)) {
             KeyguardAffordanceView lockIcon = mKeyguardBottomArea.getLockIcon();
             lockIcon.setImageAlpha(0.0f, true, 100, Interpolators.FAST_OUT_LINEAR_IN, null);
-            lockIcon.setImageScale(2.0f, true, 100, Interpolators.FAST_OUT_LINEAR_IN);
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepAction.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepAction.java
index 1999f9a..b18b79e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepAction.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepAction.java
@@ -47,10 +47,6 @@
         return mNavigationBarView.isQuickStepSwipeUpEnabled();
     }
 
-    protected boolean requiresStableTaskList() {
-        return true;
-    }
-
     @Override
     public void onGestureStart(MotionEvent event) {
         try {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java
index 9e91ab7..d5d283c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java
@@ -281,7 +281,8 @@
                 int xDiff = Math.abs(x - mTouchDownX);
                 int yDiff = Math.abs(y - mTouchDownY);
 
-                boolean exceededSwipeHorizontalTouchSlop, exceededSwipeVerticalTouchSlop;
+                boolean exceededSwipeHorizontalTouchSlop, exceededSwipeVerticalTouchSlop,
+                        exceededSwipeVerticalDragSlop;
                 int posH, touchDownH, posV, touchDownV;
 
                 if (isNavBarVertical()) {
@@ -289,6 +290,8 @@
                             yDiff > NavigationBarCompat.getQuickScrubTouchSlopPx() && yDiff > xDiff;
                     exceededSwipeVerticalTouchSlop =
                             xDiff > NavigationBarCompat.getQuickStepTouchSlopPx() && xDiff > yDiff;
+                    exceededSwipeVerticalDragSlop =
+                            xDiff > NavigationBarCompat.getQuickStepDragSlopPx() && xDiff > yDiff;
                     posH = y;
                     touchDownH = mTouchDownY;
                     posV = x;
@@ -298,6 +301,8 @@
                             xDiff > NavigationBarCompat.getQuickScrubTouchSlopPx() && xDiff > yDiff;
                     exceededSwipeVerticalTouchSlop =
                             yDiff > NavigationBarCompat.getQuickStepTouchSlopPx() && yDiff > xDiff;
+                    exceededSwipeVerticalDragSlop =
+                            yDiff > NavigationBarCompat.getQuickStepDragSlopPx() && yDiff > xDiff;
                     posH = x;
                     touchDownH = mTouchDownX;
                     posV = y;
@@ -309,11 +314,14 @@
                     mCurrentAction.onGestureMove(x, y);
                 } else {
                     // Detect gesture and try to execute an action, only one can run at a time
-                    if (exceededSwipeVerticalTouchSlop) {
+                    if (exceededSwipeVerticalTouchSlop || exceededSwipeVerticalDragSlop) {
                         if (mDragVPositive ? (posV < touchDownV) : (posV > touchDownV)) {
-                            // Swiping up gesture
-                            tryToStartGesture(mGestureActions[ACTION_SWIPE_UP_INDEX],
-                                    false /* alignedWithNavBar */, event);
+                            // Swipe up gesture must use the larger slop
+                            if (exceededSwipeVerticalTouchSlop) {
+                                // Swiping up gesture
+                                tryToStartGesture(mGestureActions[ACTION_SWIPE_UP_INDEX],
+                                        false /* alignedWithNavBar */, event);
+                            }
                         } else {
                             // Swiping down gesture
                             tryToStartGesture(mGestureActions[ACTION_SWIPE_DOWN_INDEX],
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index 1470d0f..c129143 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -354,6 +354,8 @@
     protected StatusBarWindowController mStatusBarWindowController;
     protected UnlockMethodCache mUnlockMethodCache;
     @VisibleForTesting
+    KeyguardUpdateMonitor mKeyguardUpdateMonitor;
+    @VisibleForTesting
     DozeServiceHost mDozeServiceHost = new DozeServiceHost();
     private boolean mWakeUpComingFromTouch;
     private PointF mWakeUpTouchLocation;
@@ -480,8 +482,7 @@
             updateAodMaskVisibility(deviceSupportsAodWallpaper && aodImageWallpaperEnabled);
             // If WallpaperInfo is null, it must be ImageWallpaper.
             final boolean supportsAmbientMode = deviceSupportsAodWallpaper
-                    && (info == null && aodImageWallpaperEnabled
-                        || info != null && info.supportsAmbientMode());
+                    && (info == null || info.supportsAmbientMode());
 
             mStatusBarWindowController.setWallpaperSupportsAmbientMode(supportsAmbientMode);
             mScrimController.setWallpaperSupportsAmbientMode(supportsAmbientMode);
@@ -613,6 +614,7 @@
         mNotificationLogger = Dependency.get(NotificationLogger.class);
         mRemoteInputManager = Dependency.get(NotificationRemoteInputManager.class);
         mNotificationListener =  Dependency.get(NotificationListener.class);
+        mNotificationListener.registerAsSystemService();
         mNetworkController = Dependency.get(NetworkController.class);
         mUserSwitcherController = Dependency.get(UserSwitcherController.class);
         mScreenLifecycle = Dependency.get(ScreenLifecycle.class);
@@ -674,7 +676,7 @@
                 mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
 
         mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
-
+        mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
         mBarService = IStatusBarService.Stub.asInterface(
                 ServiceManager.getService(Context.STATUS_BAR_SERVICE));
 
@@ -761,7 +763,7 @@
         mUnlockMethodCache.addListener(this);
         startKeyguard();
 
-        KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateCallback);
+        mKeyguardUpdateMonitor.registerCallback(mUpdateCallback);
         putComponent(DozeHost.class, mDozeServiceHost);
 
         mScreenPinningRequest = new ScreenPinningRequest(mContext);
@@ -801,7 +803,8 @@
         mNotificationLogger.setUpWithContainer(notifListContainer);
 
         mNotificationIconAreaController = SystemUIFactory.getInstance()
-                .createNotificationIconAreaController(context, this, mStatusBarStateController);
+                .createNotificationIconAreaController(
+                        context, this, mStatusBarStateController, mNotificationListener);
         inflateShelf();
         mNotificationIconAreaController.setupShelf(mNotificationShelf);
 
@@ -1054,7 +1057,6 @@
                         mDeviceProvisionedController);
 
         mAppOpsController.addCallback(APP_OPS, this);
-        mNotificationListener.setUpWithPresenter(mPresenter);
         mNotificationShelf.setOnActivatedListener(mPresenter);
         mRemoteInputManager.getController().addCallback(mStatusBarWindowController);
 
@@ -1206,7 +1208,9 @@
         KeyguardViewMediator keyguardViewMediator = getComponent(KeyguardViewMediator.class);
         mBiometricUnlockController = new BiometricUnlockController(mContext,
                 mDozeScrimController, keyguardViewMediator,
-                mScrimController, this, UnlockMethodCache.getInstance(mContext));
+                mScrimController, this, UnlockMethodCache.getInstance(mContext),
+                new Handler(), mKeyguardUpdateMonitor, mContext.getResources().getInteger(
+                com.android.internal.R.integer.config_wakeUpDelayDoze));
         mStatusBarKeyguardViewManager = keyguardViewMediator.registerStatusBar(this,
                 getBouncerContainer(), mNotificationPanel, mBiometricUnlockController);
         mKeyguardIndicationController
@@ -1444,6 +1448,7 @@
         return new StatusBar.H();
     }
 
+    @Override
     public void startActivity(Intent intent, boolean onlyProvisioned, boolean dismissShade,
             int flags) {
         startActivityDismissingKeyguard(intent, onlyProvisioned, dismissShade, flags);
@@ -2356,8 +2361,8 @@
             mLightBarController.dump(fd, pw, args);
         }
 
-        if (KeyguardUpdateMonitor.getInstance(mContext) != null) {
-            KeyguardUpdateMonitor.getInstance(mContext).dump(fd, pw, args);
+        if (mKeyguardUpdateMonitor != null) {
+            mKeyguardUpdateMonitor.dump(fd, pw, args);
         }
 
         FalsingManager.getInstance(mContext).dump(pw);
@@ -3890,6 +3895,11 @@
                 return;
             }
 
+            if (mKeyguardUpdateMonitor != null
+                    && reason == DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN) {
+                mKeyguardUpdateMonitor.onAuthInterruptDetected();
+            }
+
             // Set the state to pulsing, so ScrimController will know what to do once we ask it to
             // execute the transition. The pulse callback will then be invoked when the scrims
             // are black, indicating that StatusBar is ready to present the rest of the UI.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyConstants.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyConstants.java
index db04620..b22150b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyConstants.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyConstants.java
@@ -47,6 +47,7 @@
             "edit_choices_before_sending";
     private static final String KEY_SHOW_IN_HEADS_UP = "show_in_heads_up";
     private static final String KEY_MIN_NUM_REPLIES = "min_num_system_generated_replies";
+    private static final String KEY_MAX_NUM_ACTIONS = "max_num_actions";
 
     private final boolean mDefaultEnabled;
     private final boolean mDefaultRequiresP;
@@ -54,6 +55,7 @@
     private final boolean mDefaultEditChoicesBeforeSending;
     private final boolean mDefaultShowInHeadsUp;
     private final int mDefaultMinNumSystemGeneratedReplies;
+    private final int mDefaultMaxNumActions;
 
     private boolean mEnabled;
     private boolean mRequiresTargetingP;
@@ -61,6 +63,7 @@
     private boolean mEditChoicesBeforeSending;
     private boolean mShowInHeadsUp;
     private int mMinNumSystemGeneratedReplies;
+    private int mMaxNumActions;
 
     private final Context mContext;
     private final KeyValueListParser mParser = new KeyValueListParser(',');
@@ -83,6 +86,8 @@
                 R.bool.config_smart_replies_in_notifications_show_in_heads_up);
         mDefaultMinNumSystemGeneratedReplies = resources.getInteger(
                 R.integer.config_smart_replies_in_notifications_min_num_system_generated_replies);
+        mDefaultMaxNumActions = resources.getInteger(
+                R.integer.config_smart_replies_in_notifications_max_num_actions);
 
         mContext.getContentResolver().registerContentObserver(
                 Settings.Global.getUriFor(Settings.Global.SMART_REPLIES_IN_NOTIFICATIONS_FLAGS),
@@ -112,6 +117,7 @@
             mShowInHeadsUp = mParser.getBoolean(KEY_SHOW_IN_HEADS_UP, mDefaultShowInHeadsUp);
             mMinNumSystemGeneratedReplies =
                     mParser.getInt(KEY_MIN_NUM_REPLIES, mDefaultMinNumSystemGeneratedReplies);
+            mMaxNumActions = mParser.getInt(KEY_MAX_NUM_ACTIONS, mDefaultMaxNumActions);
         }
     }
 
@@ -170,4 +176,12 @@
     public int getMinNumSystemGeneratedReplies() {
         return mMinNumSystemGeneratedReplies;
     }
+
+    /**
+     * Returns the maximum number smart actions to show in a notification, or -1 if there shouldn't
+     * be a limit.
+     */
+    public int getMaxNumActions() {
+        return mMaxNumActions;
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
index 07c6587..1d2d6f7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
@@ -38,6 +38,7 @@
 import com.android.systemui.statusbar.SmartReplyController;
 import com.android.systemui.statusbar.notification.NotificationUtils;
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.notification.logging.NotificationLogger;
 import com.android.systemui.statusbar.phone.KeyguardDismissUtil;
 
 import java.text.BreakIterator;
@@ -258,8 +259,9 @@
                 return false;
             }
 
-            smartReplyController.smartReplySent(
-                    entry, replyIndex, b.getText(), smartReplies.fromAssistant);
+            smartReplyController.smartReplySent(entry, replyIndex, b.getText(),
+                    smartReplies.fromAssistant,
+                    NotificationLogger.getNotificationLocation(entry).toMetricsEventEnum());
             Bundle results = new Bundle();
             results.putString(smartReplies.remoteInput.getResultKey(), choice.toString());
             Intent intent = new Intent().addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
@@ -372,8 +374,17 @@
         // reply button is added.
         SmartSuggestionMeasures actionsMeasures = null;
 
+        final int maxNumActions = mConstants.getMaxNumActions();
+        int numShownActions = 0;
+
         for (View child : smartSuggestions) {
             final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+            if (maxNumActions != -1 // -1 means 'no limit'
+                    && lp.buttonType == SmartButtonType.ACTION
+                    && numShownActions >= maxNumActions) {
+                // We've reached the maximum number of actions, don't add another one!
+                continue;
+            }
 
             child.setPadding(accumulatedMeasures.mButtonPaddingHorizontal, child.getPaddingTop(),
                     accumulatedMeasures.mButtonPaddingHorizontal, child.getPaddingBottom());
@@ -457,6 +468,9 @@
 
             lp.show = true;
             displayedChildCount++;
+            if (lp.buttonType == SmartButtonType.ACTION) {
+                numShownActions++;
+            }
         }
 
         if (mSmartRepliesGeneratedByAssistant) {
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
index b588305..c903ab5 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
@@ -255,7 +255,8 @@
                 addRow(STREAM_ALARM,
                         R.drawable.ic_volume_alarm, R.drawable.ic_volume_alarm_mute, true, false);
                 addRow(AudioManager.STREAM_VOICE_CALL,
-                        R.drawable.ic_volume_voice, R.drawable.ic_volume_voice, false, false);
+                        com.android.internal.R.drawable.ic_phone,
+                        com.android.internal.R.drawable.ic_phone, false, false);
                 addRow(AudioManager.STREAM_BLUETOOTH_SCO,
                         R.drawable.ic_volume_bt_sco, R.drawable.ic_volume_bt_sco, false, false);
                 addRow(AudioManager.STREAM_SYSTEM, R.drawable.ic_volume_system,
diff --git a/packages/SystemUI/src/com/android/systemui/wallpaper/AodMaskView.java b/packages/SystemUI/src/com/android/systemui/wallpaper/AodMaskView.java
index 52cabe2..dd1d0ca 100644
--- a/packages/SystemUI/src/com/android/systemui/wallpaper/AodMaskView.java
+++ b/packages/SystemUI/src/com/android/systemui/wallpaper/AodMaskView.java
@@ -156,6 +156,8 @@
 
     private boolean checkIfNeedMask() {
         // We need mask for ImageWallpaper / LockScreen Wallpaper (Music album art).
+        // Because of conflicting with another wallpaper feature,
+        // we only support LockScreen wallpaper currently.
         return mWallpaperManager.getWallpaperInfo() == null || ScrimState.AOD.hasBackdrop();
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
index 2055519..d5a275e 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
@@ -18,15 +18,33 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import com.google.common.truth.Truth.*;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
+import android.app.admin.DevicePolicyManager;
+import android.app.trust.TrustManager;
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.hardware.biometrics.BiometricManager;
+import android.hardware.biometrics.BiometricSourceType;
+import android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback;
+import android.hardware.face.FaceManager;
+import android.hardware.fingerprint.FingerprintManager;
 import android.os.Bundle;
+import android.os.UserManager;
 import android.telephony.ServiceState;
 import android.telephony.SubscriptionManager;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.testing.AndroidTestingRunner;
+import android.testing.TestableContext;
 import android.testing.TestableLooper;
 import android.testing.TestableLooper.RunWithLooper;
 
@@ -39,6 +57,8 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
 
 import java.util.concurrent.atomic.AtomicBoolean;
 
@@ -52,37 +72,71 @@
 @RunWithLooper(setAsMainLooper = true)
 public class KeyguardUpdateMonitorTest extends SysuiTestCase {
 
+    @Mock
+    private KeyguardUpdateMonitor.StrongAuthTracker mStrongAuthTracker;
+    @Mock
+    private TrustManager mTrustManager;
+    @Mock
+    private FingerprintManager mFingerprintManager;
+    @Mock
+    private FaceManager mFaceManager;
+    @Mock
+    private BiometricManager mBiometricManager;
+    @Mock
+    private PackageManager mPackageManager;
+    @Mock
+    private UserManager mUserManager;
+    @Mock
+    private DevicePolicyManager mDevicePolicyManager;
     private TestableLooper mTestableLooper;
+    private TestableKeyguardUpdateMonitor mKeyguardUpdateMonitor;
 
     @Before
     public void setup() {
+        MockitoAnnotations.initMocks(this);
+        TestableContext context = spy(mContext);
+        when(mPackageManager.hasSystemFeature(anyString())).thenReturn(true);
+        when(context.getPackageManager()).thenReturn(mPackageManager);
+        doAnswer(invocation -> {
+            IBiometricEnabledOnKeyguardCallback callback = invocation.getArgument(0);
+            callback.onChanged(BiometricSourceType.FACE, true /* enabled */);
+            return null;
+        }).when(mBiometricManager).registerEnabledOnKeyguardCallback(any());
+        when(mFaceManager.isHardwareDetected()).thenReturn(true);
+        when(mFaceManager.hasEnrolledTemplates()).thenReturn(true);
+        when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(true);
+        when(mUserManager.isUserUnlocked(anyInt())).thenReturn(true);
+        when(mStrongAuthTracker.isUnlockingWithBiometricAllowed()).thenReturn(true);
+        context.addMockSystemService(TrustManager.class, mTrustManager);
+        context.addMockSystemService(FingerprintManager.class, mFingerprintManager);
+        context.addMockSystemService(BiometricManager.class, mBiometricManager);
+        context.addMockSystemService(FaceManager.class, mFaceManager);
+        context.addMockSystemService(UserManager.class, mUserManager);
+        context.addMockSystemService(DevicePolicyManager.class, mDevicePolicyManager);
+
         mTestableLooper = TestableLooper.get(this);
+        mKeyguardUpdateMonitor = new TestableKeyguardUpdateMonitor(context);
     }
 
     @Test
     public void testIgnoresSimStateCallback_rebroadcast() {
         Intent intent = new Intent(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
 
-        TestableKeyguardUpdateMonitor keyguardUpdateMonitor =
-                new TestableKeyguardUpdateMonitor(getContext());
-
-        keyguardUpdateMonitor.mBroadcastReceiver.onReceive(getContext(), intent);
+        mKeyguardUpdateMonitor.mBroadcastReceiver.onReceive(getContext(), intent);
         mTestableLooper.processAllMessages();
         Assert.assertTrue("onSimStateChanged not called",
-                keyguardUpdateMonitor.hasSimStateJustChanged());
+                mKeyguardUpdateMonitor.hasSimStateJustChanged());
 
         intent.putExtra(TelephonyIntents.EXTRA_REBROADCAST_ON_UNLOCK, true);
-        keyguardUpdateMonitor.mBroadcastReceiver.onReceive(getContext(), intent);
+        mKeyguardUpdateMonitor.mBroadcastReceiver.onReceive(getContext(), intent);
         mTestableLooper.processAllMessages();
         Assert.assertFalse("onSimStateChanged should have been skipped",
-                keyguardUpdateMonitor.hasSimStateJustChanged());
+                mKeyguardUpdateMonitor.hasSimStateJustChanged());
     }
 
     @Test
     public void testTelephonyCapable_BootInitState() {
-        TestableKeyguardUpdateMonitor keyguardUpdateMonitor =
-                new TestableKeyguardUpdateMonitor(getContext());
-        assertThat(keyguardUpdateMonitor.mTelephonyCapable).isFalse();
+        assertThat(mKeyguardUpdateMonitor.mTelephonyCapable).isFalse();
     }
 
     @Test
@@ -90,36 +144,30 @@
         Intent intent = new Intent(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
         intent.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE
                 , IccCardConstants.INTENT_VALUE_ICC_ABSENT);
-        TestableKeyguardUpdateMonitor keyguardUpdateMonitor =
-                new TestableKeyguardUpdateMonitor(getContext());
-        keyguardUpdateMonitor.mBroadcastReceiver.onReceive(getContext()
+        mKeyguardUpdateMonitor.mBroadcastReceiver.onReceive(getContext()
                 , putPhoneInfo(intent,null, false));
         mTestableLooper.processAllMessages();
-        assertThat(keyguardUpdateMonitor.mTelephonyCapable).isTrue();
+        assertThat(mKeyguardUpdateMonitor.mTelephonyCapable).isTrue();
     }
 
     @Test
     public void testTelephonyCapable_SimInvalid_ServiceState_InService() {
         // SERVICE_STATE - IN_SERVICE, but SIM_STATE is invalid TelephonyCapable should be False
-        TestableKeyguardUpdateMonitor keyguardUpdateMonitor =
-                new TestableKeyguardUpdateMonitor(getContext());
         Intent intent = new Intent(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED);
         Bundle data = new Bundle();
         ServiceState state = new ServiceState();
         state.setState(ServiceState.STATE_IN_SERVICE);
         state.fillInNotifierBundle(data);
-        keyguardUpdateMonitor.mBroadcastReceiver.onReceive(getContext()
+        mKeyguardUpdateMonitor.mBroadcastReceiver.onReceive(getContext()
                 , putPhoneInfo(intent, data, false));
         mTestableLooper.processAllMessages();
-        assertThat(keyguardUpdateMonitor.mTelephonyCapable).isFalse();
+        assertThat(mKeyguardUpdateMonitor.mTelephonyCapable).isFalse();
     }
 
     @Test
     public void testTelephonyCapable_SimValid_ServiceState_PowerOff() {
         // Simulate AirplaneMode case, SERVICE_STATE - POWER_OFF, check TelephonyCapable False
         // Only receive ServiceState callback IN_SERVICE -> OUT_OF_SERVICE -> POWER_OFF
-        TestableKeyguardUpdateMonitor keyguardUpdateMonitor =
-                new TestableKeyguardUpdateMonitor(getContext());
         Intent intent = new Intent(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED);
         intent.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE
                 , IccCardConstants.INTENT_VALUE_ICC_LOADED);
@@ -127,10 +175,10 @@
         ServiceState state = new ServiceState();
         state.setState(ServiceState.STATE_POWER_OFF);
         state.fillInNotifierBundle(data);
-        keyguardUpdateMonitor.mBroadcastReceiver.onReceive(getContext()
+        mKeyguardUpdateMonitor.mBroadcastReceiver.onReceive(getContext()
                 , putPhoneInfo(intent, data, true));
         mTestableLooper.processAllMessages();
-        assertThat(keyguardUpdateMonitor.mTelephonyCapable).isTrue();
+        assertThat(mKeyguardUpdateMonitor.mTelephonyCapable).isTrue();
     }
 
     /* Normal SIM inserted flow
@@ -142,24 +190,20 @@
      */
     @Test
     public void testTelephonyCapable_BootInitState_ServiceState_OutOfService() {
-        TestableKeyguardUpdateMonitor keyguardUpdateMonitor =
-                new TestableKeyguardUpdateMonitor(getContext());
         Intent intent = new Intent(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED);
         Bundle data = new Bundle();
         ServiceState state = new ServiceState();
         state.setState(ServiceState.STATE_OUT_OF_SERVICE);
         state.fillInNotifierBundle(data);
         intent.putExtras(data);
-        keyguardUpdateMonitor.mBroadcastReceiver.onReceive(getContext()
+        mKeyguardUpdateMonitor.mBroadcastReceiver.onReceive(getContext()
                 , putPhoneInfo(intent, data, false));
         mTestableLooper.processAllMessages();
-        assertThat(keyguardUpdateMonitor.mTelephonyCapable).isFalse();
+        assertThat(mKeyguardUpdateMonitor.mTelephonyCapable).isFalse();
     }
 
     @Test
     public void testTelephonyCapable_BootInitState_SimState_NotReady() {
-        TestableKeyguardUpdateMonitor keyguardUpdateMonitor =
-                new TestableKeyguardUpdateMonitor(getContext());
         Bundle data = new Bundle();
         ServiceState state = new ServiceState();
         state.setState(ServiceState.STATE_OUT_OF_SERVICE);
@@ -167,16 +211,14 @@
         Intent intent = new Intent(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
         intent.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE
                 , IccCardConstants.INTENT_VALUE_ICC_NOT_READY);
-        keyguardUpdateMonitor.mBroadcastReceiver.onReceive(getContext()
+        mKeyguardUpdateMonitor.mBroadcastReceiver.onReceive(getContext()
                 , putPhoneInfo(intent, data, false));
         mTestableLooper.processAllMessages();
-        assertThat(keyguardUpdateMonitor.mTelephonyCapable).isFalse();
+        assertThat(mKeyguardUpdateMonitor.mTelephonyCapable).isFalse();
     }
 
     @Test
     public void testTelephonyCapable_BootInitState_SimState_Ready() {
-        TestableKeyguardUpdateMonitor keyguardUpdateMonitor =
-                new TestableKeyguardUpdateMonitor(getContext());
         Bundle data = new Bundle();
         ServiceState state = new ServiceState();
         state.setState(ServiceState.STATE_OUT_OF_SERVICE);
@@ -184,46 +226,40 @@
         Intent intent = new Intent(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
         intent.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE
                 , IccCardConstants.INTENT_VALUE_ICC_READY);
-        keyguardUpdateMonitor.mBroadcastReceiver.onReceive(getContext()
+        mKeyguardUpdateMonitor.mBroadcastReceiver.onReceive(getContext()
                 , putPhoneInfo(intent, data, false));
         mTestableLooper.processAllMessages();
-        assertThat(keyguardUpdateMonitor.mTelephonyCapable).isFalse();
+        assertThat(mKeyguardUpdateMonitor.mTelephonyCapable).isFalse();
     }
 
     @Test
     public void testTelephonyCapable_BootInitState_ServiceState_PowerOff() {
-        TestableKeyguardUpdateMonitor keyguardUpdateMonitor =
-                new TestableKeyguardUpdateMonitor(getContext());
         Intent intent = new Intent(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED);
         Bundle data = new Bundle();
         ServiceState state = new ServiceState();
         state.setState(ServiceState.STATE_POWER_OFF);
         state.fillInNotifierBundle(data);
-        keyguardUpdateMonitor.mBroadcastReceiver.onReceive(getContext()
+        mKeyguardUpdateMonitor.mBroadcastReceiver.onReceive(getContext()
                 , putPhoneInfo(intent, data, false));
         mTestableLooper.processAllMessages();
-        assertThat(keyguardUpdateMonitor.mTelephonyCapable).isFalse();
+        assertThat(mKeyguardUpdateMonitor.mTelephonyCapable).isFalse();
     }
 
     @Test
     public void testTelephonyCapable_SimValid_ServiceState_InService() {
-        TestableKeyguardUpdateMonitor keyguardUpdateMonitor =
-                new TestableKeyguardUpdateMonitor(getContext());
         Intent intent = new Intent(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED);
         Bundle data = new Bundle();
         ServiceState state = new ServiceState();
         state.setState(ServiceState.STATE_IN_SERVICE);
         state.fillInNotifierBundle(data);
-        keyguardUpdateMonitor.mBroadcastReceiver.onReceive(getContext()
+        mKeyguardUpdateMonitor.mBroadcastReceiver.onReceive(getContext()
                 , putPhoneInfo(intent, data, true));
         mTestableLooper.processAllMessages();
-        assertThat(keyguardUpdateMonitor.mTelephonyCapable).isTrue();
+        assertThat(mKeyguardUpdateMonitor.mTelephonyCapable).isTrue();
     }
 
     @Test
     public void testTelephonyCapable_SimValid_SimState_Loaded() {
-        TestableKeyguardUpdateMonitor keyguardUpdateMonitor =
-                new TestableKeyguardUpdateMonitor(getContext());
         Bundle data = new Bundle();
         ServiceState state = new ServiceState();
         state.setState(ServiceState.STATE_IN_SERVICE);
@@ -231,19 +267,96 @@
         Intent intentSimState = new Intent(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
         intentSimState.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE
                 , IccCardConstants.INTENT_VALUE_ICC_LOADED);
-        keyguardUpdateMonitor.mBroadcastReceiver.onReceive(getContext()
+        mKeyguardUpdateMonitor.mBroadcastReceiver.onReceive(getContext()
                 , putPhoneInfo(intentSimState, data, true));
         mTestableLooper.processAllMessages();
         // Even SimState Loaded, still need ACTION_SERVICE_STATE_CHANGED turn on mTelephonyCapable
-        assertThat(keyguardUpdateMonitor.mTelephonyCapable).isFalse();
+        assertThat(mKeyguardUpdateMonitor.mTelephonyCapable).isFalse();
 
         Intent intentServiceState =  new Intent(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED);
         intentSimState.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE
                 , IccCardConstants.INTENT_VALUE_ICC_LOADED);
-        keyguardUpdateMonitor.mBroadcastReceiver.onReceive(getContext()
+        mKeyguardUpdateMonitor.mBroadcastReceiver.onReceive(getContext()
                 , putPhoneInfo(intentServiceState, data, true));
         mTestableLooper.processAllMessages();
-        assertThat(keyguardUpdateMonitor.mTelephonyCapable).isTrue();
+        assertThat(mKeyguardUpdateMonitor.mTelephonyCapable).isTrue();
+    }
+
+    @Test
+    public void testTriesToAuthenticate_whenBouncer() {
+        mKeyguardUpdateMonitor.sendKeyguardBouncerChanged(true);
+        mTestableLooper.processAllMessages();
+
+        verify(mFaceManager).authenticate(any(), any(), anyInt(), any(), any());
+        verify(mFaceManager).isHardwareDetected();
+        verify(mFaceManager).hasEnrolledTemplates(anyInt());
+    }
+
+    @Test
+    public void testTriesToAuthenticate_whenKeyguard() {
+        mKeyguardUpdateMonitor.dispatchStartedWakingUp();
+        mTestableLooper.processAllMessages();
+        mKeyguardUpdateMonitor.onKeyguardVisibilityChanged(true);
+        verify(mFaceManager).authenticate(any(), any(), anyInt(), any(), any());
+    }
+
+    @Test
+    public void skipsAuthentication_whenEncryptedKeyguard() {
+        reset(mUserManager);
+        when(mUserManager.isUserUnlocked(anyInt())).thenReturn(false);
+
+        mKeyguardUpdateMonitor.dispatchStartedWakingUp();
+        mTestableLooper.processAllMessages();
+        mKeyguardUpdateMonitor.onKeyguardVisibilityChanged(true);
+        verify(mFaceManager, never()).authenticate(any(), any(), anyInt(), any(), any());
+    }
+
+    @Test
+    public void testTriesToAuthenticate_whenAssistant() {
+        mKeyguardUpdateMonitor.setKeyguardOccluded(true);
+        mKeyguardUpdateMonitor.setAssistantVisible(true);
+
+        verify(mFaceManager).authenticate(any(), any(), anyInt(), any(), any());
+    }
+
+    @Test
+    public void testNeverAuthenticates_whenFaceLockout() {
+        mKeyguardUpdateMonitor.mFaceAuthenticationCallback
+                .onAuthenticationError(FaceManager.FACE_ERROR_LOCKOUT, "lockout");
+        mKeyguardUpdateMonitor.sendKeyguardBouncerChanged(true);
+        mTestableLooper.processAllMessages();
+
+        verify(mFaceManager, never()).authenticate(any(), any(), anyInt(), any(), any());
+    }
+
+    @Test
+    public void testOnFaceAuthenticated_skipsFaceWhenAuthenticated() {
+        mKeyguardUpdateMonitor.onFaceAuthenticated(KeyguardUpdateMonitor.getCurrentUser());
+        mKeyguardUpdateMonitor.sendKeyguardBouncerChanged(true);
+        mTestableLooper.processAllMessages();
+
+        verify(mFaceManager, never()).authenticate(any(), any(), anyInt(), any(), any());
+    }
+
+    @Test
+    public void testGetUserCanSkipBouncer_whenFace() {
+        int user = KeyguardUpdateMonitor.getCurrentUser();
+        mKeyguardUpdateMonitor.onFaceAuthenticated(user);
+        assertThat(mKeyguardUpdateMonitor.getUserCanSkipBouncer(user)).isTrue();
+    }
+
+    @Test
+    public void testGetUserCanSkipBouncer_whenFingerprint() {
+        int user = KeyguardUpdateMonitor.getCurrentUser();
+        mKeyguardUpdateMonitor.onFingerprintAuthenticated(user);
+        assertThat(mKeyguardUpdateMonitor.getUserCanSkipBouncer(user)).isTrue();
+    }
+
+    @Test
+    public void testGetUserCanSkipBouncer_whenTrust() {
+        int user = KeyguardUpdateMonitor.getCurrentUser();
+        mKeyguardUpdateMonitor.onTrustChanged(true /* enabled */, user, 0 /* flags */);
+        assertThat(mKeyguardUpdateMonitor.getUserCanSkipBouncer(user)).isTrue();
     }
 
     private Intent putPhoneInfo(Intent intent, Bundle data, Boolean simInited) {
@@ -261,8 +374,9 @@
 
         protected TestableKeyguardUpdateMonitor(Context context) {
             super(context);
-            // Avoid race condition when unexpected broadcast could be received.
             context.unregisterReceiver(mBroadcastReceiver);
+            context.unregisterReceiver(mBroadcastAllReceiver);
+            mStrongAuthTracker = KeyguardUpdateMonitorTest.this.mStrongAuthTracker;
         }
 
         public boolean hasSimStateJustChanged() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java
index e802757..e32d48d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java
@@ -36,6 +36,7 @@
 import com.android.systemui.statusbar.notification.NotificationEntryListener;
 import com.android.systemui.statusbar.notification.NotificationEntryManager;
 import com.android.systemui.statusbar.notification.collection.NotificationData;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
 import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
 import com.android.systemui.statusbar.phone.DozeParameters;
 import com.android.systemui.statusbar.phone.StatusBarWindowController;
@@ -72,9 +73,14 @@
     private NotificationTestHelper mNotificationTestHelper;
     private ExpandableNotificationRow mRow;
     private ExpandableNotificationRow mRow2;
+    private ExpandableNotificationRow mNoChannelRow;
 
     @Mock
     private NotificationData mNotificationData;
+    @Mock
+    private BubbleController.BubbleStateChangeListener mBubbleStateChangeListener;
+    @Mock
+    private BubbleController.BubbleExpandListener mBubbleExpandListener;
 
     @Before
     public void setUp() throws Exception {
@@ -91,12 +97,16 @@
         mNotificationTestHelper = new NotificationTestHelper(mContext);
         mRow = mNotificationTestHelper.createBubble();
         mRow2 = mNotificationTestHelper.createBubble();
+        mNoChannelRow = mNotificationTestHelper.createBubble();
 
         // Return non-null notification data from the NEM
         when(mNotificationEntryManager.getNotificationData()).thenReturn(mNotificationData);
         when(mNotificationData.getChannel(mRow.getEntry().key)).thenReturn(mRow.getEntry().channel);
+        when(mNotificationData.getChannel(mNoChannelRow.getEntry().key)).thenReturn(null);
 
         mBubbleController = new TestableBubbleController(mContext, mStatusBarWindowController);
+        mBubbleController.setBubbleStateChangeListener(mBubbleStateChangeListener);
+        mBubbleController.setExpandListener(mBubbleExpandListener);
 
         // Get a reference to the BubbleController's entry listener
         verify(mNotificationEntryManager, atLeastOnce())
@@ -108,6 +118,8 @@
     public void testAddBubble() {
         mBubbleController.updateBubble(mRow.getEntry(), true /* updatePosition */);
         assertTrue(mBubbleController.hasBubbles());
+
+        verify(mBubbleStateChangeListener).onHasBubblesChanged(true);
     }
 
     @Test
@@ -122,10 +134,14 @@
         mBubbleController.updateBubble(mRow.getEntry(), true /* updatePosition */);
         assertTrue(mBubbleController.hasBubbles());
 
+        verify(mBubbleStateChangeListener).onHasBubblesChanged(true);
+
         mBubbleController.removeBubble(mRow.getEntry().key);
         assertFalse(mStatusBarWindowController.getBubblesShowing());
         assertTrue(mRow.getEntry().isBubbleDismissed());
         verify(mNotificationEntryManager).updateNotifications();
+
+        verify(mBubbleStateChangeListener).onHasBubblesChanged(false);
     }
 
     @Test
@@ -137,41 +153,133 @@
         mBubbleController.dismissStack();
         assertFalse(mStatusBarWindowController.getBubblesShowing());
         verify(mNotificationEntryManager).updateNotifications();
+        assertTrue(mRow.getEntry().isBubbleDismissed());
+        assertTrue(mRow2.getEntry().isBubbleDismissed());
     }
 
     @Test
-    public void testIsStackExpanded() {
+    public void testExpandCollapseStack() {
         assertFalse(mBubbleController.isStackExpanded());
+
+        // Mark it as a bubble and add it explicitly
+        mEntryListener.onPendingEntryAdded(mRow.getEntry());
         mBubbleController.updateBubble(mRow.getEntry(), true /* updatePosition */);
 
+        // We should have bubbles & their notifs should show in the shade
+        assertTrue(mBubbleController.hasBubbles());
+        assertTrue(mRow.getEntry().showInShadeWhenBubble());
+
+        // Expand the stack
         BubbleStackView stackView = mBubbleController.getStackView();
         stackView.expandStack();
         assertTrue(mBubbleController.isStackExpanded());
+        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getEntry().key);
 
+        // Make sure it's no longer in the shade
+        assertFalse(mRow.getEntry().showInShadeWhenBubble());
+
+        // Collapse
         stackView.collapseStack();
+        verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow.getEntry().key);
         assertFalse(mBubbleController.isStackExpanded());
     }
 
     @Test
-    public void testCollapseStack() {
+    public void testCollapseAfterChangingExpandedBubble() {
+        // Mark it as a bubble and add it explicitly
+        mEntryListener.onPendingEntryAdded(mRow.getEntry());
+        mEntryListener.onPendingEntryAdded(mRow2.getEntry());
         mBubbleController.updateBubble(mRow.getEntry(), true /* updatePosition */);
         mBubbleController.updateBubble(mRow2.getEntry(), true /* updatePosition */);
 
+        // We should have bubbles & their notifs should show in the shade
+        assertTrue(mBubbleController.hasBubbles());
+        assertTrue(mRow.getEntry().showInShadeWhenBubble());
+        assertTrue(mRow2.getEntry().showInShadeWhenBubble());
+
+        // Expand
         BubbleStackView stackView = mBubbleController.getStackView();
         stackView.expandStack();
         assertTrue(mBubbleController.isStackExpanded());
+        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow2.getEntry().key);
 
+        // Last added is the one that is expanded
+        assertEquals(mRow2.getEntry(), stackView.getExpandedBubble().getEntry());
+        assertFalse(mRow2.getEntry().showInShadeWhenBubble());
+
+        // Switch which bubble is expanded
         stackView.setExpandedBubble(mRow.getEntry());
-        assertEquals(stackView.getExpandedBubble().getEntry(), mRow.getEntry());
+        assertEquals(mRow.getEntry(), stackView.getExpandedBubble().getEntry());
+        assertFalse(mRow.getEntry().showInShadeWhenBubble());
 
-        stackView.setExpandedBubble(mRow2.getEntry());
-        assertEquals(stackView.getExpandedBubble().getEntry(), mRow2.getEntry());
+        // collapse for previous bubble
+        verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow2.getEntry().key);
+        // expand for selected bubble
+        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getEntry().key);
 
+        // Collapse
         mBubbleController.collapseStack();
         assertFalse(mBubbleController.isStackExpanded());
     }
 
     @Test
+    public void testExpansionRemovesShowInShade() {
+        // Mark it as a bubble and add it explicitly
+        mEntryListener.onPendingEntryAdded(mRow.getEntry());
+        mBubbleController.updateBubble(mRow.getEntry(), true /* updatePosition */);
+
+        // We should have bubbles & their notifs should show in the shade
+        assertTrue(mBubbleController.hasBubbles());
+        assertTrue(mRow.getEntry().showInShadeWhenBubble());
+
+        // Expand
+        BubbleStackView stackView = mBubbleController.getStackView();
+        stackView.expandStack();
+        assertTrue(mBubbleController.isStackExpanded());
+        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getEntry().key);
+
+        // No longer show shade in notif after expansion
+        assertFalse(mRow.getEntry().showInShadeWhenBubble());
+    }
+
+    @Test
+    public void testRemoveLastExpandedCollapses() {
+        // Mark it as a bubble and add it explicitly
+        mEntryListener.onPendingEntryAdded(mRow.getEntry());
+        mEntryListener.onPendingEntryAdded(mRow2.getEntry());
+        mBubbleController.updateBubble(mRow.getEntry(), true /* updatePosition */);
+        mBubbleController.updateBubble(mRow2.getEntry(), true /* updatePosition */);
+        verify(mBubbleStateChangeListener).onHasBubblesChanged(true);
+
+        // Expand
+        BubbleStackView stackView = mBubbleController.getStackView();
+        stackView.expandStack();
+
+        assertTrue(mBubbleController.isStackExpanded());
+        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow2.getEntry().key);
+
+        // Last added is the one that is expanded
+        assertEquals(mRow2.getEntry(), stackView.getExpandedBubble().getEntry());
+        assertFalse(mRow2.getEntry().showInShadeWhenBubble());
+
+        // Dismiss currently expanded
+        mBubbleController.removeBubble(stackView.getExpandedBubble().getKey());
+        verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow2.getEntry().key);
+
+        // Make sure next bubble is selected
+        assertEquals(mRow.getEntry(), stackView.getExpandedBubble().getEntry());
+        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getEntry().key);
+
+        // Dismiss that one
+        mBubbleController.removeBubble(stackView.getExpandedBubble().getKey());
+
+        // Make sure state changes and collapse happens
+        verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow.getEntry().key);
+        verify(mBubbleStateChangeListener).onHasBubblesChanged(false);
+        assertFalse(mBubbleController.hasBubbles());
+    }
+
+    @Test
     public void testMarkNewNotificationAsBubble() {
         mEntryListener.onPendingEntryAdded(mRow.getEntry());
         assertTrue(mRow.getEntry().isBubble());
@@ -183,11 +291,21 @@
         assertTrue(mRow.getEntry().showInShadeWhenBubble());
     }
 
+    @Test
+    public void testNotificationWithoutChannel() {
+        assertFalse(mBubbleController.shouldBubble(mNoChannelRow.getEntry()));
+    }
+
     static class TestableBubbleController extends BubbleController {
 
         TestableBubbleController(Context context,
                 StatusBarWindowController statusBarWindowController) {
             super(context, statusBarWindowController);
         }
+
+        @Override
+        public boolean shouldAutoBubbleForFlags(Context c, NotificationEntry entry) {
+            return entry.notification.getNotification().getBubbleMetadata() != null;
+        }
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/PhysicsAnimationLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/PhysicsAnimationLayoutTest.java
index bfc02d9..5be991f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/PhysicsAnimationLayoutTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/PhysicsAnimationLayoutTest.java
@@ -75,7 +75,7 @@
     }
 
     @Test
-    public void testRenderVisibility() {
+    public void testRenderVisibility() throws InterruptedException {
         mLayout.setController(mTestableController);
         addOneMoreThanRenderLimitBubbles();
 
@@ -87,7 +87,7 @@
     }
 
     @Test
-    public void testHierarchyChanges() {
+    public void testHierarchyChanges() throws InterruptedException {
         mLayout.setController(mTestableController);
         addOneMoreThanRenderLimitBubbles();
 
@@ -242,26 +242,6 @@
     }
 
     @Test
-    public void testPrecedingNonRemovedIndex() {
-        mLayout.setController(mTestableController);
-        addOneMoreThanRenderLimitBubbles();
-
-        // Call removeView at index 4, but don't actually remove it yet (as if we're animating it
-        // out). The preceding, non-removed view index to 3 should initially be 4, but then 5 since
-        // 4 is on its way out.
-        assertEquals(4, mLayout.getPrecedingNonRemovedViewIndex(3));
-        mLayout.removeView(mViews.get(4));
-        assertEquals(5, mLayout.getPrecedingNonRemovedViewIndex(3));
-
-        // Call removeView at index 1, and actually remove it immediately. With the old view at 1
-        // instantly gone, the preceding view to 0 should be 1 in both cases.
-        assertEquals(1, mLayout.getPrecedingNonRemovedViewIndex(0));
-        mTestableController.setRemoveImmediately(true);
-        mLayout.removeView(mViews.get(1));
-        assertEquals(1, mLayout.getPrecedingNonRemovedViewIndex(0));
-    }
-
-    @Test
     public void testSetController() throws InterruptedException {
         // Add the bubbles, then set the controller, to make sure that a controller added to an
         // already-initialized view works correctly.
@@ -360,8 +340,6 @@
 
         mLayout.cancelAllAnimations();
 
-        waitForLayoutMessageQueue();
-
         // Animations should be somewhere before their end point.
         assertTrue(mViews.get(0).getTranslationX() < 1000);
         assertTrue(mViews.get(0).getTranslationY() < 1000);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/PhysicsAnimationLayoutTestCase.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/PhysicsAnimationLayoutTestCase.java
index 186a762..31e44d7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/PhysicsAnimationLayoutTestCase.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/PhysicsAnimationLayoutTestCase.java
@@ -23,6 +23,7 @@
 import android.os.Looper;
 import android.view.DisplayCutout;
 import android.view.View;
+import android.view.ViewGroup;
 import android.view.WindowInsets;
 import android.widget.FrameLayout;
 
@@ -93,7 +94,7 @@
     }
 
     /** Add one extra bubble over the limit, so we can make sure it's gone/chains appropriately. */
-    void addOneMoreThanRenderLimitBubbles() {
+    void addOneMoreThanRenderLimitBubbles() throws InterruptedException {
         for (int i = 0; i < mMaxRenderedBubbles + 1; i++) {
             final View newView = new FrameLayout(mContext);
             mLayout.addView(newView, 0);
@@ -129,7 +130,7 @@
     void waitForLayoutMessageQueue() throws InterruptedException {
         // Wait for layout, then the view should be actually removed.
         CountDownLatch layoutLatch = new CountDownLatch(1);
-        mLayout.post(layoutLatch::countDown);
+        mMainThreadHandler.post(layoutLatch::countDown);
         layoutLatch.await(1, TimeUnit.SECONDS);
     }
 
@@ -145,11 +146,7 @@
         @Override
         public void setController(PhysicsAnimationController controller) {
             mMainThreadHandler.post(() -> super.setController(controller));
-            try {
-                waitForLayoutMessageQueue();
-            } catch (InterruptedException e) {
-                e.printStackTrace();
-            }
+            waitForMessageQueueAndIgnoreIfInterrupted();
         }
 
         @Override
@@ -169,6 +166,32 @@
             return mWindowInsets;
         }
 
+        @Override
+        public void removeView(View view) {
+            mMainThreadHandler.post(() ->
+                    super.removeView(view));
+            waitForMessageQueueAndIgnoreIfInterrupted();
+        }
+
+        @Override
+        public void addView(View child, int index, ViewGroup.LayoutParams params) {
+            mMainThreadHandler.post(() ->
+                    super.addView(child, index, params));
+            waitForMessageQueueAndIgnoreIfInterrupted();
+        }
+
+        /**
+         * Wait for the queue but just catch and print the exception if interrupted, since we can't
+         * just add the exception to the overridden methods' signatures.
+         */
+        private void waitForMessageQueueAndIgnoreIfInterrupted() {
+            try {
+                waitForLayoutMessageQueue();
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+        }
+
         /**
          * Sets an end listener that will be called after the 'real' end listener that was already
          * set.
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/StackAnimationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/StackAnimationControllerTest.java
index db819d5..97935ed 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/StackAnimationControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/StackAnimationControllerTest.java
@@ -178,17 +178,20 @@
 
     @Test
     public void testChildRemoved() throws InterruptedException {
+        assertEquals(0, mLayout.getTransientViewCount());
+
         final View firstView = mLayout.getChildAt(0);
         mLayout.removeView(firstView);
 
-        // The view should still be there, since the controller is animating it out and hasn't yet
-        // actually removed it from the parent view.
-        assertEquals(0, mLayout.indexOfChild(firstView));
+        // The view should now be transient, and missing from the view's normal hierarchy.
+        assertEquals(1, mLayout.getTransientViewCount());
+        assertEquals(-1, mLayout.indexOfChild(firstView));
 
         waitForPropertyAnimations(DynamicAnimation.ALPHA);
         waitForLayoutMessageQueue();
 
-        assertEquals(-1, mLayout.indexOfChild(firstView));
+        // The view should now be gone entirely, no transient views left.
+        assertEquals(0, mLayout.getTransientViewCount());
 
         // The subsequent view should have been translated over to 0, not stacked off to the left.
         assertEquals(0, mLayout.getChildAt(0).getTranslationX(), .1f);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
index e1c481e..5a6200f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
@@ -230,9 +230,9 @@
     public void testPulseReason_getMatchesRequest() {
         mMachine.requestState(INITIALIZED);
         mMachine.requestState(DOZE);
-        mMachine.requestPulse(DozeLog.PULSE_REASON_SENSOR_DOUBLE_TAP);
+        mMachine.requestPulse(DozeLog.REASON_SENSOR_DOUBLE_TAP);
 
-        assertEquals(DozeLog.PULSE_REASON_SENSOR_DOUBLE_TAP, mMachine.getPulseReason());
+        assertEquals(DozeLog.REASON_SENSOR_DOUBLE_TAP, mMachine.getPulseReason());
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
index 7b358b9..cdac7c97 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
@@ -125,7 +125,7 @@
     public void testOnSensor_whenUndockedWithNearAndDoubleTapScreen_shouldNotWakeUp() {
         mSensors.getMockProximitySensor().sendProximityResult(false /* far */);
 
-        mTriggers.onSensor(DozeLog.PULSE_REASON_SENSOR_DOUBLE_TAP,
+        mTriggers.onSensor(DozeLog.REASON_SENSOR_DOUBLE_TAP,
                 false /* sensorPerformedProxCheck */, 50 /* screenX */, 50 /* screenY */,
                 null /* rawValues */);
 
@@ -137,7 +137,7 @@
         doReturn(true).when(mDockManagerFake).isDocked();
         mSensors.getMockProximitySensor().sendProximityResult(false /* far */);
 
-        mTriggers.onSensor(DozeLog.PULSE_REASON_SENSOR_DOUBLE_TAP,
+        mTriggers.onSensor(DozeLog.REASON_SENSOR_DOUBLE_TAP,
                 false /* sensorPerformedProxCheck */, 50 /* screenX */, 50 /* screenY */,
                 null /* rawValues */);
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/AlertingNotificationManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/AlertingNotificationManagerTest.java
index f8957b2..660f853 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/AlertingNotificationManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/AlertingNotificationManagerTest.java
@@ -23,6 +23,8 @@
 import static junit.framework.Assert.assertTrue;
 
 import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
 
 import android.app.ActivityManager;
 import android.app.Notification;
@@ -75,6 +77,8 @@
     @Mock protected ExpandableNotificationRow mRow;
 
     private final class TestableAlertingNotificationManager extends AlertingNotificationManager {
+        private AlertEntry mLastCreatedEntry;
+
         private TestableAlertingNotificationManager() {
             mMinimumDisplayTime = TEST_MINIMUM_DISPLAY_TIME;
             mAutoDismissNotificationDecay = TEST_AUTO_DISMISS_TIME;
@@ -88,6 +92,12 @@
         protected void onAlertEntryRemoved(AlertEntry alertEntry) {}
 
         @Override
+        protected AlertEntry createAlertEntry() {
+            mLastCreatedEntry = spy(super.createAlertEntry());
+            return mLastCreatedEntry;
+        }
+
+        @Override
         public int getContentFlag() {
             return FLAG_CONTENT_VIEW_CONTRACTED;
         }
@@ -206,6 +216,17 @@
     }
 
     @Test
+    public void testSetShouldManageLifetime_setShouldManageCallsRemoval() {
+        mAlertingNotificationManager.showNotification(mEntry);
+        mAlertingNotificationManager.setShouldManageLifetime(mEntry, true /* shouldManage */);
+        if (mAlertingNotificationManager instanceof TestableAlertingNotificationManager) {
+            TestableAlertingNotificationManager testableManager =
+                    (TestableAlertingNotificationManager) mAlertingNotificationManager;
+            verify(testableManager.mLastCreatedEntry).removeAsSoonAsPossible();
+        }
+    }
+
+    @Test
     public void testSetShouldManageLifetime_setShouldNotManage() {
         mAlertingNotificationManager.mExtendedLifetimeAlertEntries.add(mEntry);
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java
index 425ca58..8e926848 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java
@@ -97,7 +97,6 @@
                 mDelegate);
         lockscreenUserManager.setUpWithPresenter(mPresenter);
         viewHierarchyManager.setUpWithPresenter(mPresenter, mListContainer);
-        notificationListener.setUpWithPresenter(mPresenter);
 
         TestableLooper.get(this).processAllMessages();
         assertFalse(mDependency.hasInstantiatedDependency(StatusBarWindowController.class));
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationListenerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationListenerTest.java
index c880172..cffa9c7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationListenerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationListenerTest.java
@@ -17,10 +17,12 @@
 package com.android.systemui.statusbar;
 
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.app.Notification;
+import android.app.NotificationManager;
 import android.os.Handler;
 import android.os.UserHandle;
 import android.service.notification.NotificationListenerService;
@@ -55,6 +57,7 @@
     // Dependency mocks:
     @Mock private NotificationEntryManager mEntryManager;
     @Mock private NotificationRemoteInputManager mRemoteInputManager;
+    @Mock private NotificationManager mNotificationManager;
 
     private NotificationListener mListener;
     private StatusBarNotification mSbn;
@@ -67,14 +70,13 @@
                 mRemoteInputManager);
         mDependency.injectTestDependency(Dependency.MAIN_HANDLER,
                 new Handler(TestableLooper.get(this).getLooper()));
+        mContext.addMockSystemService(NotificationManager.class, mNotificationManager);
 
         when(mEntryManager.getNotificationData()).thenReturn(mNotificationData);
 
         mListener = new NotificationListener(mContext);
         mSbn = new StatusBarNotification(TEST_PACKAGE_NAME, TEST_PACKAGE_NAME, 0, null, TEST_UID, 0,
                 new Notification(), UserHandle.CURRENT, null, 0);
-
-        mListener.setUpWithPresenter(mPresenter);
     }
 
     @Test
@@ -106,4 +108,28 @@
         // RankingMap may be modified by plugins.
         verify(mEntryManager).updateNotificationRanking(any());
     }
+
+    @Test
+    public void testOnConnectReadStatusBarSetting() {
+        NotificationListener.NotificationSettingsListener settingsListener =
+                mock(NotificationListener.NotificationSettingsListener.class);
+        mListener.addNotificationSettingsListener(settingsListener);
+
+        when(mNotificationManager.shouldHideSilentStatusBarIcons()).thenReturn(true);
+
+        mListener.onListenerConnected();
+
+        verify(settingsListener).onStatusBarIconsBehaviorChanged(true);
+    }
+
+    @Test
+    public void testOnStatusBarIconsBehaviorChanged() {
+        NotificationListener.NotificationSettingsListener settingsListener =
+                mock(NotificationListener.NotificationSettingsListener.class);
+        mListener.addNotificationSettingsListener(settingsListener);
+
+        mListener.onStatusBarIconsBehaviorChanged(true);
+
+        verify(settingsListener).onStatusBarIconsBehaviorChanged(true);
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java
index 6cca434..f34e1a6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java
@@ -33,6 +33,7 @@
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
 
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.internal.statusbar.IStatusBarService;
 import com.android.systemui.R;
 import com.android.systemui.SysuiTestCase;
@@ -97,7 +98,8 @@
 
     @Test
     public void testSendSmartReply_updatesRemoteInput() {
-        mSmartReplyController.smartReplySent(mEntry, TEST_CHOICE_INDEX, TEST_CHOICE_TEXT, false);
+        mSmartReplyController.smartReplySent(mEntry, TEST_CHOICE_INDEX, TEST_CHOICE_TEXT, false,
+                MetricsEvent.LOCATION_UNKNOWN);
 
         // Sending smart reply should make calls to NotificationEntryManager
         // to update the notification with reply and spinner.
@@ -107,21 +109,23 @@
 
     @Test
     public void testSendSmartReply_logsToStatusBar() throws RemoteException {
-        mSmartReplyController.smartReplySent(mEntry, TEST_CHOICE_INDEX, TEST_CHOICE_TEXT, false);
+        mSmartReplyController.smartReplySent(mEntry, TEST_CHOICE_INDEX, TEST_CHOICE_TEXT, false,
+                MetricsEvent.LOCATION_UNKNOWN);
 
         // Check we log the result to the status bar service.
         verify(mIStatusBarService).onNotificationSmartReplySent(mSbn.getKey(),
-                TEST_CHOICE_INDEX, TEST_CHOICE_TEXT, false);
+                TEST_CHOICE_INDEX, TEST_CHOICE_TEXT, false, MetricsEvent.LOCATION_UNKNOWN);
     }
 
 
     @Test
     public void testSendSmartReply_logsToStatusBar_generatedByAssistant() throws RemoteException {
-        mSmartReplyController.smartReplySent(mEntry, TEST_CHOICE_INDEX, TEST_CHOICE_TEXT, true);
+        mSmartReplyController.smartReplySent(mEntry, TEST_CHOICE_INDEX, TEST_CHOICE_TEXT, true,
+                MetricsEvent.LOCATION_UNKNOWN);
 
         // Check we log the result to the status bar service.
         verify(mIStatusBarService).onNotificationSmartReplySent(mSbn.getKey(),
-                TEST_CHOICE_INDEX, TEST_CHOICE_TEXT, true);
+                TEST_CHOICE_INDEX, TEST_CHOICE_TEXT, true, MetricsEvent.LOCATION_UNKNOWN);
     }
 
     @Test
@@ -137,14 +141,16 @@
 
     @Test
     public void testSendSmartReply_reportsSending() {
-        mSmartReplyController.smartReplySent(mEntry, TEST_CHOICE_INDEX, TEST_CHOICE_TEXT, false);
+        mSmartReplyController.smartReplySent(mEntry, TEST_CHOICE_INDEX, TEST_CHOICE_TEXT, false,
+                MetricsEvent.LOCATION_UNKNOWN);
 
         assertTrue(mSmartReplyController.isSendingSmartReply(mSbn.getKey()));
     }
 
     @Test
     public void testSendingSmartReply_afterRemove_shouldReturnFalse() {
-        mSmartReplyController.smartReplySent(mEntry, TEST_CHOICE_INDEX, TEST_CHOICE_TEXT, false);
+        mSmartReplyController.smartReplySent(mEntry, TEST_CHOICE_INDEX, TEST_CHOICE_TEXT, false,
+                MetricsEvent.LOCATION_UNKNOWN);
         mSmartReplyController.stopSending(mEntry);
 
         assertFalse(mSmartReplyController.isSendingSmartReply(mSbn.getKey()));
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java
index d94bf84..c80396d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java
@@ -193,14 +193,33 @@
     }
 
     @Test
-    public void chooseSmartRepliesAndActions_smartRepliesOff_noAppGeneratedSmartReplies() {
-        setupAppGeneratedReplies(new String[] {"Reply1", "Reply2"});
+    public void chooseSmartRepliesAndActions_smartRepliesOff_noAppGeneratedSmartSuggestions() {
+        CharSequence[] smartReplies = new String[] {"Reply1", "Reply2"};
+        List<Notification.Action> smartActions =
+                createActions(new String[] {"Test Action 1", "Test Action 2"});
+        setupAppGeneratedSuggestions(smartReplies, smartActions);
         when(mSmartReplyConstants.isEnabled()).thenReturn(false);
 
         NotificationContentView.SmartRepliesAndActions repliesAndActions =
                 NotificationContentView.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry);
 
         assertThat(repliesAndActions.smartReplies).isNull();
+        assertThat(repliesAndActions.smartActions).isNull();
+    }
+
+    @Test
+    public void chooseSmartRepliesAndActions_smartRepliesOff_noSystemGeneratedSmartSuggestions() {
+        mEntry.systemGeneratedSmartReplies =
+                new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"};
+        mEntry.systemGeneratedSmartActions =
+                createActions(new String[] {"Sys Smart Action 1", "Sys Smart Action 2"});
+        when(mSmartReplyConstants.isEnabled()).thenReturn(false);
+
+        NotificationContentView.SmartRepliesAndActions repliesAndActions =
+                NotificationContentView.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry);
+
+        assertThat(repliesAndActions.smartReplies).isNull();
+        assertThat(repliesAndActions.smartActions).isNull();
     }
 
     @Test
@@ -238,11 +257,13 @@
         // replies.
         setupAppGeneratedReplies(null /* smartReplies */);
 
-        mEntry.smartReplies = new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"};
+        mEntry.systemGeneratedSmartReplies =
+                new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"};
         NotificationContentView.SmartRepliesAndActions repliesAndActions =
                 NotificationContentView.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry);
 
-        assertThat(repliesAndActions.smartReplies.choices).isEqualTo(mEntry.smartReplies);
+        assertThat(repliesAndActions.smartReplies.choices).isEqualTo(
+                mEntry.systemGeneratedSmartReplies);
         assertThat(repliesAndActions.smartReplies.fromAssistant).isTrue();
         assertThat(repliesAndActions.smartActions).isNull();
     }
@@ -253,7 +274,7 @@
         // replies.
         setupAppGeneratedReplies(null /* smartReplies */, false /* allowSystemGeneratedReplies */);
 
-        mEntry.smartReplies =
+        mEntry.systemGeneratedSmartReplies =
                 new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"};
         NotificationContentView.SmartRepliesAndActions repliesAndActions =
                 NotificationContentView.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry);
@@ -288,7 +309,8 @@
                 createActions(new String[] {"Test Action 1", "Test Action 2"});
         setupAppGeneratedSuggestions(appGenSmartReplies, appGenSmartActions);
 
-        mEntry.smartReplies = new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"};
+        mEntry.systemGeneratedSmartReplies =
+                new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"};
         mEntry.systemGeneratedSmartActions =
                 createActions(new String[] {"Sys Smart Action 1", "Sys Smart Action 2"});
 
@@ -307,7 +329,8 @@
         // actions.
         setupAppGeneratedReplies(null /* smartReplies */, false /* allowSystemGeneratedReplies */);
         when(mNotification.getAllowSystemGeneratedContextualActions()).thenReturn(false);
-        mEntry.smartReplies = new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"};
+        mEntry.systemGeneratedSmartReplies =
+                new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"};
         mEntry.systemGeneratedSmartActions =
                 createActions(new String[] {"Sys Smart Action 1", "Sys Smart Action 2"});
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
index fdc9e0c..727e9af 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
@@ -45,7 +45,6 @@
 import android.app.NotificationChannel;
 import android.content.Intent;
 import android.content.pm.PackageManager;
-import android.metrics.LogMaker;
 import android.os.Binder;
 import android.os.Handler;
 import android.provider.Settings;
@@ -57,7 +56,6 @@
 import android.view.View;
 
 import com.android.internal.logging.MetricsLogger;
-import com.android.internal.logging.nano.MetricsProto;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
 import com.android.systemui.statusbar.NotificationPresenter;
@@ -220,34 +218,6 @@
     }
 
     @Test
-    public void testOpenGutsLogging() {
-        NotificationGutsManager gutsManager = spy(mGutsManager);
-        doReturn(true).when(gutsManager).bindGuts(any(), any());
-
-        NotificationGuts guts = spy(new NotificationGuts(mContext));
-        doReturn(true).when(guts).post(any());
-
-        ExpandableNotificationRow realRow = createTestNotificationRow();
-        NotificationMenuRowPlugin.MenuItem menuItem = createTestMenuItem(realRow);
-
-        ExpandableNotificationRow row = spy(realRow);
-        when(row.getWindowToken()).thenReturn(new Binder());
-        when(row.getGuts()).thenReturn(guts);
-        StatusBarNotification notification = spy(realRow.getStatusBarNotification());
-        when(row.getStatusBarNotification()).thenReturn(notification);
-
-        assertTrue(gutsManager.openGuts(row, 0, 0, menuItem));
-
-        ArgumentCaptor<LogMaker> logMakerCaptor = ArgumentCaptor.forClass(LogMaker.class);
-        verify(notification).getLogMaker();
-        verify(mMetricsLogger).write(logMakerCaptor.capture());
-        assertEquals(MetricsProto.MetricsEvent.ACTION_NOTE_CONTROLS,
-                logMakerCaptor.getValue().getCategory());
-        assertEquals(MetricsProto.MetricsEvent.TYPE_ACTION,
-                logMakerCaptor.getValue().getType());
-    }
-
-    @Test
     public void testAppOpsSettingsIntent_camera() {
         ArraySet<Integer> ops = new ArraySet<>();
         ops.add(OP_CAMERA);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java
index 08955e3..2a64445 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java
@@ -83,7 +83,6 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
-import org.mockito.ArgumentMatcher;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
@@ -107,11 +106,16 @@
     private NotificationChannel mDefaultNotificationChannel;
     private StatusBarNotification mSbn;
 
-    @Rule public MockitoRule mockito = MockitoJUnit.rule();
-    @Mock private MetricsLogger mMetricsLogger;
-    @Mock private INotificationManager mMockINotificationManager;
-    @Mock private PackageManager mMockPackageManager;
-    @Mock private NotificationBlockingHelperManager mBlockingHelperManager;
+    @Rule
+    public MockitoRule mockito = MockitoJUnit.rule();
+    @Mock
+    private MetricsLogger mMetricsLogger;
+    @Mock
+    private INotificationManager mMockINotificationManager;
+    @Mock
+    private PackageManager mMockPackageManager;
+    @Mock
+    private NotificationBlockingHelperManager mBlockingHelperManager;
 
     @Before
     public void setUp() throws Exception {
@@ -172,44 +176,25 @@
         PollingCheck.waitFor(1000,
                 () -> VISIBLE == mNotificationInfo.findViewById(R.id.confirmation).getVisibility());
     }
+
     private void ensureNoUndoButton() {
         PollingCheck.waitFor(1000,
                 () -> GONE == mNotificationInfo.findViewById(R.id.confirmation).getVisibility()
                         && !mNotificationInfo.isAnimating());
     }
+
     private void waitForStopButton() {
         PollingCheck.waitFor(1000,
                 () -> VISIBLE == mNotificationInfo.findViewById(R.id.prompt).getVisibility());
     }
 
-    class ImportanceChangeLogMaker implements ArgumentMatcher<LogMaker> {
-        private static final int CATEGORY = MetricsProto.MetricsEvent.ACTION_SAVE_IMPORTANCE;
-        private int mType, mSubtype;
-
-        ImportanceChangeLogMaker(int type, int subtype) {
-            mType = type;
-            mSubtype = subtype;
-        }
-        public boolean matches(LogMaker l) {
-            return (l.getCategory() == CATEGORY)
-                    && (l.getType() == mType)
-                    && (l.getSubtype() == mSubtype);
-        }
-
-        public String toString() {
-            return String.format("LogMaker(%d, %d, %d)", CATEGORY, mType, mSubtype);
-        }
-    }
-
-    private LogMaker importanceChangeLog(int type, int subtype) {
-        return argThat(new ImportanceChangeLogMaker(type, subtype));
-    }
-
     @Test
     public void testBindNotification_SetsTextApplicationName() throws Exception {
         when(mMockPackageManager.getApplicationLabel(any())).thenReturn("App Name");
         mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
-                TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false,
+                TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn,
+                null, null, null,
+                true, false,
                 IMPORTANCE_DEFAULT, true);
         final TextView textView = mNotificationInfo.findViewById(R.id.pkgname);
         assertTrue(textView.getText().toString().contains("App Name"));
@@ -330,9 +315,9 @@
 
     @Test
     public void testBindNotification_BlockButton() throws Exception {
-       mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
-               TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false,
-               IMPORTANCE_DEFAULT, true);
+        mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
+                TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false,
+                IMPORTANCE_DEFAULT, true);
         final View block = mNotificationInfo.findViewById(R.id.int_block);
         final View minimize = mNotificationInfo.findViewById(R.id.block_or_minimize);
         assertEquals(VISIBLE, block.getVisibility());
@@ -340,7 +325,7 @@
     }
 
     @Test
-    public void testBindNotification_BlockButton_BlockHelper() throws Exception {
+    public void testBindNotification_BlockButton_BlockingHelper() throws Exception {
         mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
                 TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false,
                 true /* isBlockingHelper */, false, IMPORTANCE_DEFAULT, true);
@@ -498,13 +483,30 @@
     }
 
     @Test
-    public void testLogBlockingHelperCounter_logGutsViewDisplayed() throws Exception {
+    public void testBindNotificationLogging_notBlockingHelper() throws Exception {
         mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
-                TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false,
+                TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn,
+                null, null, null,
+                true, false,
                 IMPORTANCE_DEFAULT, true);
-        mNotificationInfo.logBlockingHelperCounter("HowCanNotifsBeRealIfAppsArent");
         verify(mMetricsLogger).write(argThat(logMaker ->
-                logMaker.getType() == MetricsEvent.NOTIFICATION_BLOCKING_HELPER
+                logMaker.getCategory() == MetricsEvent.ACTION_NOTE_CONTROLS
+                        && logMaker.getType() == MetricsEvent.TYPE_OPEN
+                        && logMaker.getSubtype() == MetricsEvent.BLOCKING_HELPER_UNKNOWN
+        ));
+    }
+
+    @Test
+    public void testBindNotificationLogging_BlockingHelper() throws Exception {
+        mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
+                TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn,
+                null, null, null,
+                false, true,
+                true, true,
+                IMPORTANCE_DEFAULT, true);
+        verify(mMetricsLogger).write(argThat(logMaker ->
+                logMaker.getCategory() == MetricsEvent.ACTION_NOTE_CONTROLS
+                        && logMaker.getType() == MetricsEvent.TYPE_OPEN
                         && logMaker.getSubtype() == MetricsEvent.BLOCKING_HELPER_DISPLAY
         ));
     }
@@ -512,8 +514,11 @@
     @Test
     public void testLogBlockingHelperCounter_logsForBlockingHelper() throws Exception {
         mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
-                TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, false, true,
-                true, true, IMPORTANCE_DEFAULT, true);
+                TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn,
+                null, null, null,
+                false, true,
+                true, true,
+                IMPORTANCE_DEFAULT, true);
         mNotificationInfo.logBlockingHelperCounter("HowCanNotifsBeRealIfAppsArent");
         verify(mMetricsLogger).count(eq("HowCanNotifsBeRealIfAppsArent"), eq(1));
     }
@@ -679,7 +684,7 @@
         mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
                 TEST_PACKAGE_NAME, mNotificationChannel /* notificationChannel */,
                 10 /* numUniqueChannelsInRow */, mSbn, null /* checkSaveListener */,
-                null /* onSettingsClick */, null /* onAppSettingsClick */ ,
+                null /* onSettingsClick */, null /* onAppSettingsClick */,
                 true, false /* isNonblockable */, IMPORTANCE_DEFAULT, false
         );
 
@@ -721,7 +726,7 @@
         mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
                 TEST_PACKAGE_NAME, mNotificationChannel /* notificationChannel */,
                 10 /* numUniqueChannelsInRow */, mSbn, null /* checkSaveListener */,
-                null /* onSettingsClick */, null /* onAppSettingsClick */ ,
+                null /* onSettingsClick */, null /* onAppSettingsClick */,
                 true /* provisioned */,
                 false /* isNonblockable */, true /* isForBlockingHelper */,
                 true /* isUserSentimentNegative */, IMPORTANCE_DEFAULT, true);
@@ -743,14 +748,14 @@
     }
 
     @Test
-    public void testCloseControls_nonNullCheckSaveListenerDoesntDelayKeepShowing()
+    public void testCloseControls_nonNullCheckSaveListenerDoesntDelayKeepShowing_BlockingHelper()
             throws Exception {
         NotificationInfo.CheckSaveListener listener =
                 mock(NotificationInfo.CheckSaveListener.class);
         mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
                 TEST_PACKAGE_NAME, mNotificationChannel /* notificationChannel */,
                 10 /* numUniqueChannelsInRow */, mSbn, listener /* checkSaveListener */,
-                null /* onSettingsClick */, null /* onAppSettingsClick */ , true /* provisioned */,
+                null /* onSettingsClick */, null /* onAppSettingsClick */, true /* provisioned */,
                 false /* isNonblockable */, true /* isForBlockingHelper */,
                 true /* isUserSentimentNegative */, IMPORTANCE_DEFAULT, true);
 
@@ -771,14 +776,14 @@
     }
 
     @Test
-    public void testCloseControls_nonNullCheckSaveListenerDoesntDelayDismiss()
+    public void testCloseControls_nonNullCheckSaveListenerDoesntDelayDismiss_BlockingHelper()
             throws Exception {
         NotificationInfo.CheckSaveListener listener =
                 mock(NotificationInfo.CheckSaveListener.class);
         mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
                 TEST_PACKAGE_NAME, mNotificationChannel /* notificationChannel */,
                 10 /* numUniqueChannelsInRow */, mSbn, listener /* checkSaveListener */,
-                null /* onSettingsClick */, null /* onAppSettingsClick */ ,
+                null /* onSettingsClick */, null /* onAppSettingsClick */,
                 false /* isNonblockable */, true /* isForBlockingHelper */,
                 true, true /* isUserSentimentNegative */,  /* isNoisy */
                 IMPORTANCE_DEFAULT, true);
@@ -790,7 +795,7 @@
     }
 
     @Test
-    public void testCloseControls_checkSaveListenerDelaysStopNotifications()
+    public void testCloseControls_checkSaveListenerDelaysStopNotifications_BlockingHelper()
             throws Exception {
         NotificationInfo.CheckSaveListener listener =
                 mock(NotificationInfo.CheckSaveListener.class);
@@ -848,18 +853,25 @@
     }
 
     @Test
-    public void testBlockChangedCallsUpdateNotificationChannel() throws Exception {
+    public void testBlockChangedCallsUpdateNotificationChannel_notBlockingHelper()
+            throws Exception {
         mNotificationChannel.setImportance(IMPORTANCE_LOW);
         mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
-                TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false,
+                TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn,
+                null, null, null,
+                true, false,
                 IMPORTANCE_DEFAULT, false);
 
         mNotificationInfo.findViewById(R.id.int_block).performClick();
         waitForUndoButton();
         mNotificationInfo.handleCloseControls(true, false);
 
-        verify(mMetricsLogger).write(importanceChangeLog(
-                MetricsProto.MetricsEvent.TYPE_ACTION, IMPORTANCE_NONE - IMPORTANCE_LOW));
+        ArgumentCaptor<LogMaker> logMakerCaptor = ArgumentCaptor.forClass(LogMaker.class);
+        verify(mMetricsLogger, times(2)).write(logMakerCaptor.capture());
+        assertEquals(MetricsProto.MetricsEvent.TYPE_ACTION,
+                logMakerCaptor.getValue().getType());
+        assertEquals(IMPORTANCE_NONE - IMPORTANCE_LOW,
+                logMakerCaptor.getValue().getSubtype());
 
         mTestableLooper.processAllMessages();
         ArgumentCaptor<NotificationChannel> updated =
@@ -895,8 +907,12 @@
         waitForUndoButton();
         mNotificationInfo.handleCloseControls(true, false);
 
-        verify(mMetricsLogger).write(importanceChangeLog(
-                MetricsProto.MetricsEvent.TYPE_ACTION, IMPORTANCE_NONE - IMPORTANCE_LOW));
+        ArgumentCaptor<LogMaker> logMakerCaptor = ArgumentCaptor.forClass(LogMaker.class);
+        verify(mMetricsLogger, times(3)).write(logMakerCaptor.capture());
+        assertEquals(MetricsProto.MetricsEvent.TYPE_ACTION,
+                logMakerCaptor.getValue().getType());
+        assertEquals(IMPORTANCE_NONE - IMPORTANCE_LOW,
+                logMakerCaptor.getValue().getSubtype());
 
         mTestableLooper.processAllMessages();
         ArgumentCaptor<NotificationChannel> updated =
@@ -964,10 +980,12 @@
     }
 
     @Test
-    public void testBlockUndoDoesNotBlockNotificationChannel() throws Exception {
+    public void testBlockUndoDoesNotBlockNotificationChannel_notBlockingHelper() throws Exception {
         mNotificationChannel.setImportance(IMPORTANCE_LOW);
         mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
-                TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false,
+                TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn,
+                null, null, null,
+                true, false,
                 IMPORTANCE_DEFAULT, false);
 
         mNotificationInfo.findViewById(R.id.int_block).performClick();
@@ -976,8 +994,15 @@
         waitForStopButton();
         // mNotificationInfo.handleCloseControls doesn't get called by this interaction.
 
-        verify(mMetricsLogger).write(importanceChangeLog(
-                MetricsProto.MetricsEvent.TYPE_DISMISS, IMPORTANCE_NONE - IMPORTANCE_LOW));
+        ArgumentCaptor<LogMaker> logMakerCaptor = ArgumentCaptor.forClass(LogMaker.class);
+        verify(mMetricsLogger, times(2)).write(logMakerCaptor.capture());
+        assertEquals(MetricsEvent.ACTION_SAVE_IMPORTANCE,
+                logMakerCaptor.getValue().getCategory());
+        assertEquals(MetricsEvent.TYPE_DISMISS,
+                logMakerCaptor.getValue().getType());
+        assertEquals(IMPORTANCE_NONE - IMPORTANCE_LOW,
+                logMakerCaptor.getValue().getSubtype());
+
 
         mTestableLooper.processAllMessages();
         verify(mMockINotificationManager, never()).updateNotificationChannelForPackage(
@@ -985,11 +1010,12 @@
     }
 
     @Test
-    public void testMinUndoDoesNotMinNotificationChannel() throws Exception {
+    public void testMinUndoDoesNotMinNotificationChannel_notBlockingHelper() throws Exception {
         mNotificationChannel.setImportance(IMPORTANCE_LOW);
         mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
-                TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, true,
-                IMPORTANCE_DEFAULT, false);
+                TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn,
+                null, null, null, true,
+                true, IMPORTANCE_DEFAULT, false);
 
         mNotificationInfo.findViewById(R.id.minimize).performClick();
         waitForUndoButton();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
new file mode 100644
index 0000000..7be4756
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.phone;
+
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyFloat;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.hardware.biometrics.BiometricSourceType;
+import android.os.Handler;
+import android.os.PowerManager;
+import android.os.UserHandle;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper.RunWithLooper;
+
+import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.keyguard.KeyguardViewMediator;
+import com.android.systemui.statusbar.NotificationMediaManager;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+@RunWithLooper
+public class BiometricsUnlockControllerTest extends SysuiTestCase {
+
+    @Mock
+    private NotificationMediaManager mMediaManager;
+    @Mock
+    private PowerManager mPowerManager;
+    @Mock
+    private KeyguardUpdateMonitor mUpdateMonitor;
+    @Mock
+    private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
+    @Mock
+    private StatusBarWindowController mStatusBarWindowController;
+    @Mock
+    private DozeScrimController mDozeScrimController;
+    @Mock
+    private KeyguardViewMediator mKeyguardViewMediator;
+    @Mock
+    private ScrimController mScrimController;
+    @Mock
+    private StatusBar mStatusBar;
+    @Mock
+    private UnlockMethodCache mUnlockMethodCache;
+    private BiometricUnlockController mBiometricUnlockController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
+        when(mUpdateMonitor.isDeviceInteractive()).thenReturn(true);
+        mContext.addMockSystemService(PowerManager.class, mPowerManager);
+        mDependency.injectTestDependency(NotificationMediaManager.class, mMediaManager);
+        mDependency.injectTestDependency(StatusBarWindowController.class,
+                mStatusBarWindowController);
+        mBiometricUnlockController = new BiometricUnlockController(mContext, mDozeScrimController,
+                mKeyguardViewMediator, mScrimController, mStatusBar, mUnlockMethodCache,
+                new Handler(), mUpdateMonitor, 0 /* wakeUpDelay */);
+        mBiometricUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager);
+    }
+
+    @Test
+    public void onBiometricAuthenticated_whenFingerprintAndBiometricsDisallowed_showBouncer() {
+        mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT,
+                BiometricSourceType.FINGERPRINT);
+        verify(mStatusBarKeyguardViewManager).showBouncer(eq(false));
+        verify(mStatusBarKeyguardViewManager).animateCollapsePanels(anyFloat());
+    }
+
+    @Test
+    public void onBiometricAuthenticated_whenFingerprintAndNotInteractive_wakeAndUnlock() {
+        reset(mUpdateMonitor);
+        reset(mStatusBarKeyguardViewManager);
+        when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
+        when(mUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(true);
+        when(mDozeScrimController.isPulsing()).thenReturn(true);
+        mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT,
+                BiometricSourceType.FINGERPRINT);
+
+        verify(mKeyguardViewMediator).onWakeAndUnlocking();
+    }
+
+    @Test
+    public void onBiometricAuthenticated_whenFingerprint_dismissKeyguard() {
+        when(mUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(true);
+        mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT,
+                BiometricSourceType.FINGERPRINT);
+
+        verify(mStatusBarKeyguardViewManager, never()).showBouncer(anyBoolean());
+        verify(mStatusBarKeyguardViewManager).animateCollapsePanels(anyFloat());
+    }
+
+    @Test
+    public void onBiometricAuthenticated_whenFingerprintOnBouncer_dismissBouncer() {
+        when(mUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(true);
+        when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true);
+        mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT,
+                BiometricSourceType.FINGERPRINT);
+
+        verify(mStatusBarKeyguardViewManager).notifyKeyguardAuthenticated(eq(false));
+    }
+
+    @Test
+    public void onBiometricAuthenticated_whenFace_dontDismissKeyguard() {
+        when(mUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(true);
+        mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT,
+                BiometricSourceType.FACE);
+
+        verify(mStatusBarKeyguardViewManager, never()).animateCollapsePanels(anyFloat());
+    }
+
+    @Test
+    public void onBiometricAuthenticated_whenFaceOnBouncer_dismissBouncer() {
+        when(mUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(true);
+        when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true);
+        mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT,
+                BiometricSourceType.FACE);
+
+        verify(mStatusBarKeyguardViewManager).notifyKeyguardAuthenticated(eq(false));
+    }
+
+    @Test
+    public void onBiometricAuthenticated_whenFaceAndPulsing_dontDismissKeyguard() {
+        reset(mUpdateMonitor);
+        reset(mStatusBarKeyguardViewManager);
+        when(mUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(true);
+        when(mDozeScrimController.isPulsing()).thenReturn(true);
+        mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT,
+                BiometricSourceType.FACE);
+
+        verify(mStatusBarKeyguardViewManager, never()).animateCollapsePanels(anyFloat());
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java
new file mode 100644
index 0000000..13145b8
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.phone;
+
+import static android.provider.Settings.Secure.NOTIFICATION_NEW_INTERRUPTION_MODEL;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.support.test.filters.SmallTest;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.statusbar.CommandQueue;
+import com.android.systemui.statusbar.NotificationListener;
+import com.android.systemui.statusbar.StatusBarStateController;
+import com.android.systemui.statusbar.phone.LightBarTransitionsController.DarkIntensityApplier;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+@TestableLooper.RunWithLooper
+public class NotificationIconAreaControllerTest extends SysuiTestCase {
+
+    @Mock
+    private NotificationListener mListener;
+    @Mock
+    StatusBar mStatusBar;
+    @Mock
+    StatusBarStateController mStatusBarStateController;
+    private NotificationIconAreaController mController;
+
+    @Before
+    public void setup() {
+        MockitoAnnotations.initMocks(this);
+
+        mController = new NotificationIconAreaController(mContext, mStatusBar,
+                mStatusBarStateController, mListener);
+    }
+
+    @Test
+    public void testNotificationIcons_featureOff() {
+        Settings.Secure.putInt(
+                mContext.getContentResolver(), NOTIFICATION_NEW_INTERRUPTION_MODEL, 0);
+        assertTrue(mController.shouldShouldLowPriorityIcons());
+    }
+
+    @Test
+    public void testNotificationIcons_featureOn_settingHideIcons() {
+        Settings.Secure.putInt(
+                mContext.getContentResolver(), NOTIFICATION_NEW_INTERRUPTION_MODEL, 1);
+        mController.mSettingsListener.onStatusBarIconsBehaviorChanged(true);
+
+        assertFalse(mController.shouldShouldLowPriorityIcons());
+    }
+
+    @Test
+    public void testNotificationIcons_featureOn_settingShowIcons() {
+        Settings.Secure.putInt(
+                mContext.getContentResolver(), NOTIFICATION_NEW_INTERRUPTION_MODEL, 1);
+        mController.mSettingsListener.onStatusBarIconsBehaviorChanged(false);
+
+        assertTrue(mController.shouldShouldLowPriorityIcons());
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
index 17611ff..49fcafd 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
@@ -64,6 +64,7 @@
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.internal.logging.testing.FakeMetricsLogger;
 import com.android.internal.statusbar.IStatusBarService;
+import com.android.keyguard.KeyguardUpdateMonitor;
 import com.android.systemui.Dependency;
 import com.android.systemui.ForegroundServiceController;
 import com.android.systemui.InitController;
@@ -120,6 +121,9 @@
 import java.io.ByteArrayOutputStream;
 import java.io.PrintWriter;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
 
 @SmallTest
 @RunWith(AndroidTestingRunner.class)
@@ -161,6 +165,8 @@
     private NotificationAlertingManager mNotificationAlertingManager;
     @Mock
     private NotificationLogger.ExpansionStateLogger mExpansionStateLogger;
+    @Mock
+    private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
 
     private TestableStatusBar mStatusBar;
     private FakeMetricsLogger mMetricsLogger;
@@ -252,7 +258,7 @@
                 mDozeScrimController, mock(NotificationShelf.class),
                 mLockscreenUserManager, mCommandQueue, mNotificationPresenter,
                 mock(BubbleController.class), mock(NavigationBarController.class),
-                mock(AutoHideController.class));
+                mock(AutoHideController.class), mKeyguardUpdateMonitor);
         mStatusBar.mContext = mContext;
         mStatusBar.mComponents = mContext.getComponents();
         SystemUIFactory.getInstance().getRootComponent()
@@ -631,6 +637,39 @@
     }
 
     @Test
+    public void testPulseWhileDozing_notifyAuthInterrupt() {
+        HashSet<Integer> reasonsWantingAuth = new HashSet<>(
+                Collections.singletonList(DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN));
+        HashSet<Integer> reasonsSkippingAuth = new HashSet<>(
+                Arrays.asList(DozeLog.PULSE_REASON_INTENT,
+                        DozeLog.PULSE_REASON_NOTIFICATION,
+                        DozeLog.PULSE_REASON_SENSOR_SIGMOTION,
+                        DozeLog.REASON_SENSOR_PICKUP,
+                        DozeLog.REASON_SENSOR_DOUBLE_TAP,
+                        DozeLog.PULSE_REASON_SENSOR_LONG_PRESS,
+                        DozeLog.PULSE_REASON_DOCKING,
+                        DozeLog.REASON_SENSOR_WAKE_UP,
+                        DozeLog.REASON_SENSOR_TAP));
+        HashSet<Integer> reasonsThatDontPulse = new HashSet<>(
+                Arrays.asList(DozeLog.REASON_SENSOR_PICKUP,
+                        DozeLog.REASON_SENSOR_DOUBLE_TAP,
+                        DozeLog.REASON_SENSOR_TAP));
+
+        for (int i = 0; i < DozeLog.REASONS; i++) {
+            reset(mKeyguardUpdateMonitor);
+            mStatusBar.mDozeServiceHost.pulseWhileDozing(mock(DozeHost.PulseCallback.class), i);
+            if (reasonsWantingAuth.contains(i)) {
+                verify(mKeyguardUpdateMonitor).onAuthInterruptDetected();
+            } else if (reasonsSkippingAuth.contains(i) || reasonsThatDontPulse.contains(i)) {
+                verify(mKeyguardUpdateMonitor, never()).onAuthInterruptDetected();
+            } else {
+                throw new AssertionError("Reason " + i + " isn't specified as wanting or skipping"
+                        + " passive auth. Please consider how this pulse reason should behave.");
+            }
+        }
+    }
+
+    @Test
     public void testSetState_changesIsFullScreenUserSwitcherState() {
         mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
         assertFalse(mStatusBar.isFullScreenUserSwitcherState());
@@ -705,7 +744,8 @@
                 NotificationPresenter notificationPresenter,
                 BubbleController bubbleController,
                 NavigationBarController navBarController,
-                AutoHideController autoHideController) {
+                AutoHideController autoHideController,
+                KeyguardUpdateMonitor keyguardUpdateMonitor) {
             mStatusBarKeyguardViewManager = man;
             mUnlockMethodCache = unlock;
             mKeyguardIndicationController = key;
@@ -738,6 +778,7 @@
             mBubbleController = bubbleController;
             mNavigationBarController = navBarController;
             mAutoHideController = autoHideController;
+            mKeyguardUpdateMonitor = keyguardUpdateMonitor;
         }
 
         private WakefulnessLifecycle createAwakeWakefulnessLifecycle() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyConstantsTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyConstantsTest.java
index 03b7c95..bc0f742 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyConstantsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyConstantsTest.java
@@ -176,6 +176,19 @@
         assertFalse(mConstants.getShowInHeadsUp());
     }
 
+    @Test
+    public void testMaxNumActionsWithNoConfig() {
+        assertTrue(mConstants.isEnabled());
+        assertEquals(-1, mConstants.getMaxNumActions());
+    }
+
+    @Test
+    public void testMaxNumActionsSet() {
+        overrideSetting("enabled=true,max_num_actions=10");
+        triggerConstantsOnChange();
+        assertEquals(10, mConstants.getMaxNumActions());
+    }
+
     private void overrideSetting(String flags) {
         Settings.Global.putString(mContext.getContentResolver(),
                 Settings.Global.SMART_REPLIES_IN_NOTIFICATIONS_FLAGS, flags);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java
index d1c4d01..5570122 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java
@@ -45,6 +45,7 @@
 import android.widget.Button;
 import android.widget.LinearLayout;
 
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.systemui.R;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.plugins.ActivityStarter;
@@ -117,6 +118,7 @@
         // Any number of replies are fine.
         when(mConstants.getMinNumSystemGeneratedReplies()).thenReturn(0);
         when(mConstants.getMaxSqueezeRemeasureAttempts()).thenReturn(3);
+        when(mConstants.getMaxNumActions()).thenReturn(-1);
 
         final Resources res = mContext.getResources();
         mSingleLinePaddingHorizontal = res.getDimensionPixelSize(
@@ -189,7 +191,7 @@
         setSmartReplies(TEST_CHOICES);
         mView.getChildAt(2).performClick();
         verify(mLogger).smartReplySent(mEntry, 2, TEST_CHOICES[2],
-                false /* generatedByAsssitant */);
+                false /* generatedByAsssitant */, MetricsEvent.LOCATION_UNKNOWN);
     }
 
     @Test
@@ -197,7 +199,7 @@
         setSmartReplies(TEST_CHOICES, true);
         mView.getChildAt(2).performClick();
         verify(mLogger).smartReplySent(mEntry, 2, TEST_CHOICES[2],
-                true /* generatedByAsssitant */);
+                true /* generatedByAsssitant */, MetricsEvent.LOCATION_UNKNOWN);
     }
 
     @Test
@@ -1027,4 +1029,66 @@
         // smart actions
         assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(0), mView.getChildAt(1));
     }
+
+    /**
+     * Test that we don't show more than the maximum number of actions declared in {@link
+     * SmartReplyConstants}.
+     */
+    @Test
+    public void testMeasure_maxNumActions() {
+        when(mConstants.getMaxNumActions()).thenReturn(2);
+
+        String[] choices = new String[] {};
+        String[] actions = new String[] {"a1", "a2", "a3", "a4"};
+
+        // All replies should be displayed as single-line smart reply buttons.
+        ViewGroup expectedView = buildExpectedView(new String[] {},
+                1 /* lineCount */, createActions(new String[] {"a1", "a2"}));
+        expectedView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+
+        setSmartRepliesAndActions(choices, actions);
+        mView.measure(
+                MeasureSpec.makeMeasureSpec(expectedView.getMeasuredWidth(), MeasureSpec.AT_MOST),
+                MeasureSpec.UNSPECIFIED);
+
+        assertEqualMeasures(expectedView, mView);
+        assertReplyButtonShownWithEqualMeasures(
+                expectedView.getChildAt(0), mView.getChildAt(0)); // a1
+        assertReplyButtonShownWithEqualMeasures(
+                expectedView.getChildAt(1), mView.getChildAt(1)); // a2
+        assertReplyButtonHidden(mView.getChildAt(2)); // a3
+        assertReplyButtonHidden(mView.getChildAt(3)); // a4
+    }
+
+    /**
+     * Test that setting maximum number of actions to -1 means there's no limit to number of actions
+     * to show.
+     */
+    @Test
+    public void testMeasure_maxNumActions_noLimit() {
+        when(mConstants.getMaxNumActions()).thenReturn(-1);
+
+        String[] choices = new String[] {};
+        String[] actions = new String[] {"a1", "a2", "a3", "a4"};
+
+        // All replies should be displayed as single-line smart reply buttons.
+        ViewGroup expectedView = buildExpectedView(new String[] {},
+                1 /* lineCount */, createActions(new String[] {"a1", "a2", "a3", "a4"}));
+        expectedView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+
+        setSmartRepliesAndActions(choices, actions);
+        mView.measure(
+                MeasureSpec.makeMeasureSpec(expectedView.getMeasuredWidth(), MeasureSpec.AT_MOST),
+                MeasureSpec.UNSPECIFIED);
+
+        assertEqualMeasures(expectedView, mView);
+        assertReplyButtonShownWithEqualMeasures(
+                expectedView.getChildAt(0), mView.getChildAt(0)); // a1
+        assertReplyButtonShownWithEqualMeasures(
+                expectedView.getChildAt(1), mView.getChildAt(1)); // a2
+        assertReplyButtonShownWithEqualMeasures(
+                expectedView.getChildAt(2), mView.getChildAt(2)); // a3
+        assertReplyButtonShownWithEqualMeasures(
+                expectedView.getChildAt(3), mView.getChildAt(3)); // a4
+    }
 }
diff --git a/packages/VpnDialogs/AndroidManifest.xml b/packages/VpnDialogs/AndroidManifest.xml
index 8172e71..1d0b9b6 100644
--- a/packages/VpnDialogs/AndroidManifest.xml
+++ b/packages/VpnDialogs/AndroidManifest.xml
@@ -20,6 +20,7 @@
         package="com.android.vpndialogs">
 
     <uses-permission android:name="android.permission.CONTROL_VPN" />
+    <uses-permission android:name="android.permission.CONTROL_ALWAYS_ON_VPN" />
     <uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" />
 
     <application android:label="VpnDialogs"
diff --git a/packages/overlays/Android.mk b/packages/overlays/Android.mk
new file mode 100644
index 0000000..9fb3306
--- /dev/null
+++ b/packages/overlays/Android.mk
@@ -0,0 +1,31 @@
+# Copyright (C) 2019 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := frameworks-base-overlays
+
+LOCAL_REQUIRED_MODULES := \
+	ExperimentNavigationBarFloatingOverlay \
+	ExperimentNavigationBarDefaultOverlay \
+	ExperimentNavigationBarSlimOverlay32 \
+	ExperimentNavigationBarSlimOverlay40 \
+	ExperimentNavigationBarLargeOverlay56 \
+	ExperimentNavigationBarLargeOverlay64 \
+	IconShapeSquareOverlay \
+
+include $(BUILD_PHONY_PACKAGE)
+
+include $(call first-makefiles-under,$(LOCAL_PATH))
diff --git a/packages/overlays/FontRubikRubikOverlay/Android.mk b/packages/overlays/ExperimentNavigationBarLarge56Overlay/Android.mk
similarity index 88%
rename from packages/overlays/FontRubikRubikOverlay/Android.mk
rename to packages/overlays/ExperimentNavigationBarLarge56Overlay/Android.mk
index 21d617e..3b3beab 100644
--- a/packages/overlays/FontRubikRubikOverlay/Android.mk
+++ b/packages/overlays/ExperimentNavigationBarLarge56Overlay/Android.mk
@@ -17,15 +17,14 @@
 LOCAL_PATH:= $(call my-dir)
 include $(CLEAR_VARS)
 
-LOCAL_RRO_THEME := FontRubikRubik
+LOCAL_RRO_THEME := ExperimentNavigationBarLarge56
 LOCAL_CERTIFICATE := platform
-LOCAL_PRODUCT_MODULE := true
 
 LOCAL_SRC_FILES := $(call all-subdir-java-files)
 
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 
-LOCAL_PACKAGE_NAME := FontRubikRubikOverlay
+LOCAL_PACKAGE_NAME := ExperimentNavigationBarLargeOverlay56
 LOCAL_SDK_VERSION := current
 
-include $(BUILD_RRO_PACKAGE)
+include $(BUILD_RRO_PACKAGE)
\ No newline at end of file
diff --git a/packages/overlays/ExperimentNavigationBarSlim24Overlay/AndroidManifest.xml b/packages/overlays/ExperimentNavigationBarLarge56Overlay/AndroidManifest.xml
similarity index 92%
copy from packages/overlays/ExperimentNavigationBarSlim24Overlay/AndroidManifest.xml
copy to packages/overlays/ExperimentNavigationBarLarge56Overlay/AndroidManifest.xml
index aee543a..f1b64df 100644
--- a/packages/overlays/ExperimentNavigationBarSlim24Overlay/AndroidManifest.xml
+++ b/packages/overlays/ExperimentNavigationBarLarge56Overlay/AndroidManifest.xml
@@ -16,11 +16,11 @@
  */
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-        package="com.android.internal.experiment.navbar.slim24"
+        package="com.android.internal.experiment.navbar.large56"
         android:versionCode="1"
         android:versionName="1.0">
     <overlay android:targetPackage="android"
-        android:category="com.android.internal.experiment_navbar_slim24"
+        android:category="com.android.internal.experiment_navbar_larger56"
         android:priority="1"/>
 
     <application android:label="@string/experiment_navigationbar_overlay" android:hasCode="false"/>
diff --git a/packages/overlays/ExperimentNavigationBarSlim24Overlay/res/values/config.xml b/packages/overlays/ExperimentNavigationBarLarge56Overlay/res/values/config.xml
similarity index 81%
copy from packages/overlays/ExperimentNavigationBarSlim24Overlay/res/values/config.xml
copy to packages/overlays/ExperimentNavigationBarLarge56Overlay/res/values/config.xml
index 58c653d..35b68dd 100644
--- a/packages/overlays/ExperimentNavigationBarSlim24Overlay/res/values/config.xml
+++ b/packages/overlays/ExperimentNavigationBarLarge56Overlay/res/values/config.xml
@@ -18,11 +18,11 @@
 -->
 <resources>
     <!-- Height of the bottom navigation / system bar. -->
-    <dimen name="navigation_bar_height">24dp</dimen>
+    <dimen name="navigation_bar_height">56dp</dimen>
     <!-- Width of the navigation bar when it is placed vertically on the screen -->
-    <dimen name="navigation_bar_width">24dp</dimen>
+    <dimen name="navigation_bar_width">56dp</dimen>
     <!-- Height of the bottom navigation / system bar frame; navigation buttons height. -->
-    <dimen name="navigation_bar_frame_width">24dp</dimen>
+    <dimen name="navigation_bar_frame_width">56dp</dimen>
     <!-- Width of the navigation bar frame when it is placed vertically on the screen -->
-    <dimen name="navigation_bar_frame_height">24dp</dimen>
+    <dimen name="navigation_bar_frame_height">56dp</dimen>
 </resources>
\ No newline at end of file
diff --git a/packages/overlays/ExperimentNavigationBarSlim24Overlay/res/values/strings.xml b/packages/overlays/ExperimentNavigationBarLarge56Overlay/res/values/strings.xml
similarity index 86%
rename from packages/overlays/ExperimentNavigationBarSlim24Overlay/res/values/strings.xml
rename to packages/overlays/ExperimentNavigationBarLarge56Overlay/res/values/strings.xml
index 670bc55..80feb85 100644
--- a/packages/overlays/ExperimentNavigationBarSlim24Overlay/res/values/strings.xml
+++ b/packages/overlays/ExperimentNavigationBarLarge56Overlay/res/values/strings.xml
@@ -18,5 +18,5 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <!-- Name of overlay [CHAR LIMIT=64] -->
-    <string name="experiment_navigationbar_overlay">Slim Navigation Bar Experiment (24dp)</string>
+    <string name="experiment_navigationbar_overlay" translatable="false">Larger Navigation Bar Experiment (56dp)</string>
 </resources>
\ No newline at end of file
diff --git a/packages/overlays/FontRubikRubikOverlay/Android.mk b/packages/overlays/ExperimentNavigationBarLarge64Overlay/Android.mk
similarity index 88%
copy from packages/overlays/FontRubikRubikOverlay/Android.mk
copy to packages/overlays/ExperimentNavigationBarLarge64Overlay/Android.mk
index 21d617e..4898590 100644
--- a/packages/overlays/FontRubikRubikOverlay/Android.mk
+++ b/packages/overlays/ExperimentNavigationBarLarge64Overlay/Android.mk
@@ -17,15 +17,14 @@
 LOCAL_PATH:= $(call my-dir)
 include $(CLEAR_VARS)
 
-LOCAL_RRO_THEME := FontRubikRubik
+LOCAL_RRO_THEME := ExperimentNavigationBarLarge64
 LOCAL_CERTIFICATE := platform
-LOCAL_PRODUCT_MODULE := true
 
 LOCAL_SRC_FILES := $(call all-subdir-java-files)
 
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 
-LOCAL_PACKAGE_NAME := FontRubikRubikOverlay
+LOCAL_PACKAGE_NAME := ExperimentNavigationBarLargeOverlay64
 LOCAL_SDK_VERSION := current
 
-include $(BUILD_RRO_PACKAGE)
+include $(BUILD_RRO_PACKAGE)
\ No newline at end of file
diff --git a/packages/overlays/ExperimentNavigationBarSlim24Overlay/AndroidManifest.xml b/packages/overlays/ExperimentNavigationBarLarge64Overlay/AndroidManifest.xml
similarity index 92%
rename from packages/overlays/ExperimentNavigationBarSlim24Overlay/AndroidManifest.xml
rename to packages/overlays/ExperimentNavigationBarLarge64Overlay/AndroidManifest.xml
index aee543a..5437fe7 100644
--- a/packages/overlays/ExperimentNavigationBarSlim24Overlay/AndroidManifest.xml
+++ b/packages/overlays/ExperimentNavigationBarLarge64Overlay/AndroidManifest.xml
@@ -16,11 +16,11 @@
  */
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-        package="com.android.internal.experiment.navbar.slim24"
+        package="com.android.internal.experiment.navbar.large64"
         android:versionCode="1"
         android:versionName="1.0">
     <overlay android:targetPackage="android"
-        android:category="com.android.internal.experiment_navbar_slim24"
+        android:category="com.android.internal.experiment_navbar_larger64"
         android:priority="1"/>
 
     <application android:label="@string/experiment_navigationbar_overlay" android:hasCode="false"/>
diff --git a/packages/overlays/ExperimentNavigationBarSlim24Overlay/res/values/config.xml b/packages/overlays/ExperimentNavigationBarLarge64Overlay/res/values/config.xml
similarity index 81%
rename from packages/overlays/ExperimentNavigationBarSlim24Overlay/res/values/config.xml
rename to packages/overlays/ExperimentNavigationBarLarge64Overlay/res/values/config.xml
index 58c653d..24f813b 100644
--- a/packages/overlays/ExperimentNavigationBarSlim24Overlay/res/values/config.xml
+++ b/packages/overlays/ExperimentNavigationBarLarge64Overlay/res/values/config.xml
@@ -18,11 +18,11 @@
 -->
 <resources>
     <!-- Height of the bottom navigation / system bar. -->
-    <dimen name="navigation_bar_height">24dp</dimen>
+    <dimen name="navigation_bar_height">64dp</dimen>
     <!-- Width of the navigation bar when it is placed vertically on the screen -->
-    <dimen name="navigation_bar_width">24dp</dimen>
+    <dimen name="navigation_bar_width">64dp</dimen>
     <!-- Height of the bottom navigation / system bar frame; navigation buttons height. -->
-    <dimen name="navigation_bar_frame_width">24dp</dimen>
+    <dimen name="navigation_bar_frame_width">64dp</dimen>
     <!-- Width of the navigation bar frame when it is placed vertically on the screen -->
-    <dimen name="navigation_bar_frame_height">24dp</dimen>
+    <dimen name="navigation_bar_frame_height">64dp</dimen>
 </resources>
\ No newline at end of file
diff --git a/packages/overlays/ExperimentNavigationBarSlim24Overlay/res/values/strings.xml b/packages/overlays/ExperimentNavigationBarLarge64Overlay/res/values/strings.xml
similarity index 86%
copy from packages/overlays/ExperimentNavigationBarSlim24Overlay/res/values/strings.xml
copy to packages/overlays/ExperimentNavigationBarLarge64Overlay/res/values/strings.xml
index 670bc55..0150589 100644
--- a/packages/overlays/ExperimentNavigationBarSlim24Overlay/res/values/strings.xml
+++ b/packages/overlays/ExperimentNavigationBarLarge64Overlay/res/values/strings.xml
@@ -18,5 +18,5 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <!-- Name of overlay [CHAR LIMIT=64] -->
-    <string name="experiment_navigationbar_overlay">Slim Navigation Bar Experiment (24dp)</string>
+    <string name="experiment_navigationbar_overlay" translatable="false">Larger Navigation Bar Experiment (64dp)</string>
 </resources>
\ No newline at end of file
diff --git a/packages/overlays/ExperimentNavigationBarSlim24Overlay/Android.mk b/packages/overlays/ExperimentNavigationBarSlim24Overlay/Android.mk
deleted file mode 100644
index 58cf134..0000000
--- a/packages/overlays/ExperimentNavigationBarSlim24Overlay/Android.mk
+++ /dev/null
@@ -1,30 +0,0 @@
-#
-#  Copyright 2018, The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_RRO_THEME := ExperimentNavigationBarSlim24
-LOCAL_CERTIFICATE := platform
-
-LOCAL_SRC_FILES := $(call all-subdir-java-files)
-
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-
-LOCAL_PACKAGE_NAME := ExperimentNavigationBarSlimOverlay24
-LOCAL_SDK_VERSION := current
-
-include $(BUILD_RRO_PACKAGE)
\ No newline at end of file
diff --git a/packages/overlays/ExperimentNavigationBarSlim24Overlay/res/values-en-rXC/strings.xml b/packages/overlays/ExperimentNavigationBarSlim24Overlay/res/values-en-rXC/strings.xml
deleted file mode 100644
index 40d9fbc..0000000
--- a/packages/overlays/ExperimentNavigationBarSlim24Overlay/res/values-en-rXC/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-/**
- * Copyright (c) 2018, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="experiment_navigationbar_overlay" msgid="9207872199884142345">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‏‎‏‏‏‎‏‏‏‏‏‎‏‎‏‏‏‏‏‎‏‏‎‏‎‎‏‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‎‏‎Slim Navigation Bar Experiment (24dp)‎‏‎‎‏‎"</string>
-</resources>
diff --git a/packages/overlays/FontArbutusSourceOverlay/Android.mk b/packages/overlays/FontArbutusSourceOverlay/Android.mk
deleted file mode 100644
index 23aee55..0000000
--- a/packages/overlays/FontArbutusSourceOverlay/Android.mk
+++ /dev/null
@@ -1,31 +0,0 @@
-#
-#  Copyright 2018, The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_RRO_THEME := FontArbutusSource
-LOCAL_CERTIFICATE := platform
-LOCAL_PRODUCT_MODULE := true
-
-LOCAL_SRC_FILES := $(call all-subdir-java-files)
-
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-
-LOCAL_PACKAGE_NAME := FontArbutusSourceOverlay
-LOCAL_SDK_VERSION := current
-
-include $(BUILD_RRO_PACKAGE)
diff --git a/packages/overlays/FontArbutusSourceOverlay/AndroidManifest.xml b/packages/overlays/FontArbutusSourceOverlay/AndroidManifest.xml
deleted file mode 100644
index 46c06b9..0000000
--- a/packages/overlays/FontArbutusSourceOverlay/AndroidManifest.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<!--
-/**
- * Copyright (c) 2018, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.theme.font.arbutussource"
-    android:versionCode="1"
-    android:versionName="1.0">
-    <overlay android:targetPackage="android"
-        android:category="android.theme.customization.font"
-        android:priority="1"/>
-
-    <application android:label="@string/font_arbutus_source_overlay" android:hasCode="false">
-        <meta-data
-            android:name="android.theme.customization.REQUIRED_SYSTEM_FONTS"
-            android:value="arbutus-slab,source-sans-pro,source-sans-pro-medium" />
-    </application>
-</manifest>
diff --git a/packages/overlays/FontArvoLatoOverlay/AndroidManifest.xml b/packages/overlays/FontArvoLatoOverlay/AndroidManifest.xml
deleted file mode 100644
index 3f2e5de..0000000
--- a/packages/overlays/FontArvoLatoOverlay/AndroidManifest.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<!--
-/**
- * Copyright (c) 2018, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.theme.font.arvolato"
-    android:versionCode="1"
-    android:versionName="1.0">
-    <overlay android:targetPackage="android"
-        android:category="android.theme.customization.font"
-        android:priority="1"/>
-
-    <application android:label="@string/font_arvo_lato_overlay" android:hasCode="false">
-        <meta-data
-            android:name="android.theme.customization.REQUIRED_SYSTEM_FONTS"
-            android:value="arvo,arvo-medium,lato,lato-medium" />
-    </application>
-</manifest>
diff --git a/packages/overlays/FontArvoLatoOverlay/res/values/config.xml b/packages/overlays/FontArvoLatoOverlay/res/values/config.xml
deleted file mode 100644
index 4e70d72..0000000
--- a/packages/overlays/FontArvoLatoOverlay/res/values/config.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<!--
-/**
- * Copyright (c) 2018, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-     <!-- Name of a font family to use for body text. -->
-    <string name="config_bodyFontFamily" translatable="false">lato</string>
-    <!-- Name of a font family to use for medium body text. -->
-    <string name="config_bodyFontFamilyMedium" translatable="false">lato-bold</string>
-    <!-- Name of a font family to use for headlines. If empty, falls back to platform default -->
-    <string name="config_headlineFontFamily" translatable="false">arvo</string>
-    <!-- Name of the font family used for system surfaces where the font should use medium weight -->
-    <string name="config_headlineFontFamilyMedium" translatable="false">arvo-bold</string>
-</resources>
-
diff --git a/packages/overlays/FontArvoLatoOverlay/res/values/strings.xml b/packages/overlays/FontArvoLatoOverlay/res/values/strings.xml
deleted file mode 100644
index 9ea097f..0000000
--- a/packages/overlays/FontArvoLatoOverlay/res/values/strings.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<!--
-/**
- * Copyright (c) 2018, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- Headline / Body font Arvo / Lato overlay -->
-    <string name="font_arvo_lato_overlay" translatable="false">Arvo / Lato</string>
-</resources>
diff --git a/packages/overlays/FontRubikRubikOverlay/Android.mk b/packages/overlays/FontNotoSerifSourceOverlay/Android.mk
similarity index 85%
copy from packages/overlays/FontRubikRubikOverlay/Android.mk
copy to packages/overlays/FontNotoSerifSourceOverlay/Android.mk
index 21d617e..6f3c4f7 100644
--- a/packages/overlays/FontRubikRubikOverlay/Android.mk
+++ b/packages/overlays/FontNotoSerifSourceOverlay/Android.mk
@@ -1,5 +1,5 @@
 #
-#  Copyright 2018, The Android Open Source Project
+#  Copyright 2019, The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -17,7 +17,7 @@
 LOCAL_PATH:= $(call my-dir)
 include $(CLEAR_VARS)
 
-LOCAL_RRO_THEME := FontRubikRubik
+LOCAL_RRO_THEME := FontNotoSerifSource
 LOCAL_CERTIFICATE := platform
 LOCAL_PRODUCT_MODULE := true
 
@@ -25,7 +25,7 @@
 
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 
-LOCAL_PACKAGE_NAME := FontRubikRubikOverlay
+LOCAL_PACKAGE_NAME := FontNotoSerifSourceOverlay
 LOCAL_SDK_VERSION := current
 
 include $(BUILD_RRO_PACKAGE)
diff --git a/packages/overlays/FontRubikRubikOverlay/AndroidManifest.xml b/packages/overlays/FontNotoSerifSourceOverlay/AndroidManifest.xml
similarity index 76%
rename from packages/overlays/FontRubikRubikOverlay/AndroidManifest.xml
rename to packages/overlays/FontNotoSerifSourceOverlay/AndroidManifest.xml
index 1f28d46..54b8dbf 100644
--- a/packages/overlays/FontRubikRubikOverlay/AndroidManifest.xml
+++ b/packages/overlays/FontNotoSerifSourceOverlay/AndroidManifest.xml
@@ -1,6 +1,6 @@
 <!--
 /**
- * Copyright (c) 2018, The Android Open Source Project
+ * Copyright (c) 2019, The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,16 +16,16 @@
  */
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.theme.font.rubikrubik"
+    package="com.android.theme.font.notoserifsource"
     android:versionCode="1"
     android:versionName="1.0">
     <overlay android:targetPackage="android"
         android:category="android.theme.customization.font"
         android:priority="1"/>
 
-    <application android:label="@string/font_rubik_rubik_overlay" android:hasCode="false">
+    <application android:label="@string/font_notoserif_source_overlay" android:hasCode="false">
         <meta-data
             android:name="android.theme.customization.REQUIRED_SYSTEM_FONTS"
-            android:value="rubik,rubik-medium" />
+            android:value="serif,serif-bold,source-sans-pro,source-sans-pro-medium" />
     </application>
 </manifest>
diff --git a/packages/overlays/FontArbutusSourceOverlay/res/values/config.xml b/packages/overlays/FontNotoSerifSourceOverlay/res/values/config.xml
similarity index 91%
rename from packages/overlays/FontArbutusSourceOverlay/res/values/config.xml
rename to packages/overlays/FontNotoSerifSourceOverlay/res/values/config.xml
index a6aa64c..e63bea0 100644
--- a/packages/overlays/FontArbutusSourceOverlay/res/values/config.xml
+++ b/packages/overlays/FontNotoSerifSourceOverlay/res/values/config.xml
@@ -1,6 +1,6 @@
 <!--
 /**
- * Copyright (c) 2018, The Android Open Source Project
+ * Copyright (c) 2019, The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,8 +21,8 @@
     <!-- Name of a font family to use for medium body text. -->
     <string name="config_bodyFontFamilyMedium" translatable="false">source-sans-pro-semi-bold</string>
     <!-- Name of a font family to use for headlines. If empty, falls back to platform default -->
-    <string name="config_headlineFontFamily" translatable="false">arbutus-slab</string>
+    <string name="config_headlineFontFamily" translatable="false">serif</string>
     <!-- Name of the font family used for system surfaces where the font should use medium weight -->
-    <string name="config_headlineFontFamilyMedium" translatable="false">arbutus-slab</string>
+    <string name="config_headlineFontFamilyMedium" translatable="false">serif-bold</string>
 </resources>
 
diff --git a/packages/overlays/FontArbutusSourceOverlay/res/values/strings.xml b/packages/overlays/FontNotoSerifSourceOverlay/res/values/strings.xml
similarity index 73%
rename from packages/overlays/FontArbutusSourceOverlay/res/values/strings.xml
rename to packages/overlays/FontNotoSerifSourceOverlay/res/values/strings.xml
index d80eb20..ab839c2 100644
--- a/packages/overlays/FontArbutusSourceOverlay/res/values/strings.xml
+++ b/packages/overlays/FontNotoSerifSourceOverlay/res/values/strings.xml
@@ -1,6 +1,6 @@
 <!--
 /**
- * Copyright (c) 2018, The Android Open Source Project
+ * Copyright (c) 2019, The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,6 +16,6 @@
  */
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- Headline / Body font Arbutus Slab / Source Sans Pro overlay -->
-    <string name="font_arbutus_source_overlay" translatable="false">Arbutus Slab / Source Sans Pro</string>
+    <!-- Headline / Body font Noto Serif / Source Sans Pro overlay -->
+    <string name="font_notoserif_source_overlay" translatable="false">Noto Serif / Source Sans Pro</string>
 </resources>
diff --git a/packages/overlays/FontRubikRubikOverlay/res/values/config.xml b/packages/overlays/FontRubikRubikOverlay/res/values/config.xml
deleted file mode 100644
index 4f90e29..0000000
--- a/packages/overlays/FontRubikRubikOverlay/res/values/config.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<!--
-/**
- * Copyright (c) 2018, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-     <!-- Name of a font family to use for body text. -->
-    <string name="config_bodyFontFamily" translatable="false">rubik</string>
-    <!-- Name of a font family to use for medium body text. -->
-    <string name="config_bodyFontFamilyMedium" translatable="false">rubik-medium</string>
-    <!-- Name of a font family to use for headlines. If empty, falls back to platform default -->
-    <string name="config_headlineFontFamily" translatable="false">rubik</string>
-    <!-- Name of the font family used for system surfaces where the font should use medium weight -->
-    <string name="config_headlineFontFamilyMedium" translatable="false">rubik-medium</string>
-</resources>
-
diff --git a/packages/overlays/FontRubikRubikOverlay/Android.mk b/packages/overlays/IconPackCircularOverlay/Android.mk
similarity index 85%
copy from packages/overlays/FontRubikRubikOverlay/Android.mk
copy to packages/overlays/IconPackCircularOverlay/Android.mk
index 21d617e..010eb81 100644
--- a/packages/overlays/FontRubikRubikOverlay/Android.mk
+++ b/packages/overlays/IconPackCircularOverlay/Android.mk
@@ -1,5 +1,5 @@
 #
-#  Copyright 2018, The Android Open Source Project
+#  Copyright 2019, The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -17,7 +17,7 @@
 LOCAL_PATH:= $(call my-dir)
 include $(CLEAR_VARS)
 
-LOCAL_RRO_THEME := FontRubikRubik
+LOCAL_RRO_THEME := IconPackCircular
 LOCAL_CERTIFICATE := platform
 LOCAL_PRODUCT_MODULE := true
 
@@ -25,7 +25,7 @@
 
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 
-LOCAL_PACKAGE_NAME := FontRubikRubikOverlay
+LOCAL_PACKAGE_NAME := IconPackCircularOverlay
 LOCAL_SDK_VERSION := current
 
 include $(BUILD_RRO_PACKAGE)
diff --git a/packages/overlays/ExperimentNavigationBarSlim24Overlay/AndroidManifest.xml b/packages/overlays/IconPackCircularOverlay/AndroidManifest.xml
similarity index 60%
copy from packages/overlays/ExperimentNavigationBarSlim24Overlay/AndroidManifest.xml
copy to packages/overlays/IconPackCircularOverlay/AndroidManifest.xml
index aee543a..6f0124d 100644
--- a/packages/overlays/ExperimentNavigationBarSlim24Overlay/AndroidManifest.xml
+++ b/packages/overlays/IconPackCircularOverlay/AndroidManifest.xml
@@ -1,6 +1,6 @@
 <!--
 /**
- * Copyright (c) 2018, The Android Open Source Project
+ * Copyright (c) 2019, The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,12 +16,9 @@
  */
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-        package="com.android.internal.experiment.navbar.slim24"
-        android:versionCode="1"
-        android:versionName="1.0">
-    <overlay android:targetPackage="android"
-        android:category="com.android.internal.experiment_navbar_slim24"
-        android:priority="1"/>
-
-    <application android:label="@string/experiment_navigationbar_overlay" android:hasCode="false"/>
-</manifest>
\ No newline at end of file
+    package="com.android.theme.icon_pack.circular"
+    android:versionCode="1"
+    android:versionName="1.0">
+    <overlay android:targetPackage="android" android:category="android.theme.customization.icon_pack" android:priority="1"/>
+    <application android:label="Circular" android:hasCode="false"/>
+</manifest>
diff --git a/packages/overlays/IconPackCircularOverlay/res/drawable/ic_wifi_signal_0.xml b/packages/overlays/IconPackCircularOverlay/res/drawable/ic_wifi_signal_0.xml
new file mode 100644
index 0000000..e1ca60d
--- /dev/null
+++ b/packages/overlays/IconPackCircularOverlay/res/drawable/ic_wifi_signal_0.xml
@@ -0,0 +1,51 @@
+<!--
+/**
+ * Copyright (c) 2019, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
+    <path
+        android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
+    <path
+        android:fillColor="#000000"
+        android:fillAlpha="0.3"
+        android:strokeAlpha="0.3"
+        android:strokeWidth="1"
+        android:pathData="M 11.99 16.5 C 12.8184271247 16.5 13.49 17.1715728753 13.49 18 C 13.49 18.8284271247 12.8184271247 19.5 11.99 19.5 C 11.1615728753 19.5 10.49 18.8284271247 10.49 18 C 10.49 17.1715728753 11.1615728753 16.5 11.99 16.5 Z" />
+    <path
+        android:fillColor="#000000"
+        android:fillAlpha="0.3"
+        android:strokeAlpha="0.3"
+        android:strokeWidth="1"
+        android:pathData="M18.76,11.8a0.54 0.54 ,0,0,0,0.36-0.14 0.51 0.51,0,0,0,0-0.71A10.08,10.08,0,0,0,4.87,11a0.5 0.5 ,0,0,0,0,0.71 0.51 0.51,0,0,0,0.71,0,9.07,9.07,0,0,1,12.83,0A0.54 0.54 ,0,0,0,18.76,11.8Z" />
+    <path
+        android:fillColor="#000000"
+        android:fillAlpha="0.3"
+        android:strokeAlpha="0.3"
+        android:strokeWidth="1"
+        android:pathData="M2.15,8.85a0.48 0.48 ,0,0,0,0.7,0,12.8,12.8,0,0,1,18.3,0,0.48 0.48 ,0,0,0,0.7,0,0.48 0.48 ,0,0,0,0-0.7,13.77,13.77,0,0,0-19.7,0A0.48 0.48 ,0,0,0,2.15,8.85Z" />
+    <path
+        android:fillColor="#000000"
+        android:fillAlpha="0.3"
+        android:strokeAlpha="0.3"
+        android:strokeWidth="1"
+        android:pathData="M15.93,14.64a0.49 0.49 ,0,0,0,0.35-0.15 0.5 0.5,0,0,0,0-0.71,6.08,6.08,0,0,0-8.58,0,0.51 0.51 ,0,0,0,0,0.71 0.5 0.5,0,0,0,0.71,0,5.08,5.08,0,0,1,7.16,0A0.51 0.51 ,0,0,0,15.93,14.64Z" />
+</vector>
diff --git a/packages/overlays/IconPackCircularOverlay/res/drawable/ic_wifi_signal_1.xml b/packages/overlays/IconPackCircularOverlay/res/drawable/ic_wifi_signal_1.xml
new file mode 100644
index 0000000..06ac16d
--- /dev/null
+++ b/packages/overlays/IconPackCircularOverlay/res/drawable/ic_wifi_signal_1.xml
@@ -0,0 +1,49 @@
+<!--
+/**
+ * Copyright (c) 2019, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
+    <path
+        android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
+    <path
+        android:fillColor="#000000"
+        android:pathData="M 11.99 16.5 C 12.8184271247 16.5 13.49 17.1715728753 13.49 18 C 13.49 18.8284271247 12.8184271247 19.5 11.99 19.5 C 11.1615728753 19.5 10.49 18.8284271247 10.49 18 C 10.49 17.1715728753 11.1615728753 16.5 11.99 16.5 Z" />
+    <path
+        android:fillColor="#000000"
+        android:fillAlpha="0.3"
+        android:strokeAlpha="0.3"
+        android:strokeWidth="1"
+        android:pathData="M18.76,11.8a0.54 0.54 ,0,0,0,0.36-0.14 0.51 0.51,0,0,0,0-0.71A10.08,10.08,0,0,0,4.87,11a0.5 0.5 ,0,0,0,0,0.71 0.51 0.51,0,0,0,0.71,0,9.07,9.07,0,0,1,12.83,0A0.54 0.54 ,0,0,0,18.76,11.8Z" />
+    <path
+        android:fillColor="#000000"
+        android:fillAlpha="0.3"
+        android:strokeAlpha="0.3"
+        android:strokeWidth="1"
+        android:pathData="M21.85,8.15a13.77,13.77,0,0,0-19.7,0,0.49 0.49 ,0,0,0,0.7 0.7 ,12.8,12.8,0,0,1,18.3,0,0.48 0.48 ,0,0,0,0.7,0A0.48 0.48 ,0,0,0,21.85,8.15Z" />
+    <path
+        android:fillColor="#000000"
+        android:fillAlpha="0.3"
+        android:strokeAlpha="0.3"
+        android:strokeWidth="1"
+        android:pathData="M15.93,14.64a0.49 0.49 ,0,0,0,0.35-0.15 0.5 0.5,0,0,0,0-0.71,6.08,6.08,0,0,0-8.58,0,0.51 0.51 ,0,0,0,0,0.71 0.5 0.5,0,0,0,0.71,0,5.08,5.08,0,0,1,7.16,0A0.51 0.51 ,0,0,0,15.93,14.64Z" />
+</vector>
diff --git a/packages/overlays/IconPackCircularOverlay/res/drawable/ic_wifi_signal_2.xml b/packages/overlays/IconPackCircularOverlay/res/drawable/ic_wifi_signal_2.xml
new file mode 100644
index 0000000..844fabf
--- /dev/null
+++ b/packages/overlays/IconPackCircularOverlay/res/drawable/ic_wifi_signal_2.xml
@@ -0,0 +1,46 @@
+<!--
+/**
+ * Copyright (c) 2019, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
+    <path
+        android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
+    <path
+        android:fillColor="#000000"
+        android:pathData="M 11.99 16.5 C 12.8184271247 16.5 13.49 17.1715728753 13.49 18 C 13.49 18.8284271247 12.8184271247 19.5 11.99 19.5 C 11.1615728753 19.5 10.49 18.8284271247 10.49 18 C 10.49 17.1715728753 11.1615728753 16.5 11.99 16.5 Z" />
+    <path
+        android:fillColor="#000000"
+        android:fillAlpha="0.3"
+        android:strokeAlpha="0.3"
+        android:strokeWidth="1"
+        android:pathData="M18.76,11.8a0.54 0.54 ,0,0,0,0.36-0.14 0.51 0.51,0,0,0,0-0.71A10.08,10.08,0,0,0,4.87,11a0.5 0.5 ,0,0,0,0,0.71 0.51 0.51,0,0,0,0.71,0,9.07,9.07,0,0,1,12.83,0A0.54 0.54 ,0,0,0,18.76,11.8Z" />
+    <path
+        android:fillColor="#000000"
+        android:fillAlpha="0.3"
+        android:strokeAlpha="0.3"
+        android:strokeWidth="1"
+        android:pathData="M21.85,8.15a13.77,13.77,0,0,0-19.7,0,0.49 0.49 ,0,0,0,0.7 0.7 ,12.8,12.8,0,0,1,18.3,0,0.48 0.48 ,0,0,0,0.7,0A0.48 0.48 ,0,0,0,21.85,8.15Z" />
+    <path
+        android:fillColor="#000000"
+        android:pathData="M15.93,14.64a0.49 0.49 ,0,0,0,0.35-0.15 0.5 0.5,0,0,0,0-0.71,6.08,6.08,0,0,0-8.58,0,0.51 0.51 ,0,0,0,0,0.71 0.5 0.5,0,0,0,0.71,0,5.07,5.07,0,0,1,7.16,0A0.51 0.51 ,0,0,0,15.93,14.64Z" />
+</vector>
diff --git a/packages/overlays/IconPackCircularOverlay/res/drawable/ic_wifi_signal_3.xml b/packages/overlays/IconPackCircularOverlay/res/drawable/ic_wifi_signal_3.xml
new file mode 100644
index 0000000..3a01032
--- /dev/null
+++ b/packages/overlays/IconPackCircularOverlay/res/drawable/ic_wifi_signal_3.xml
@@ -0,0 +1,43 @@
+<!--
+/**
+ * Copyright (c) 2019, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
+    <path
+        android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
+    <path
+        android:fillColor="#000000"
+        android:pathData="M 11.99 16.5 C 12.8184271247 16.5 13.49 17.1715728753 13.49 18 C 13.49 18.8284271247 12.8184271247 19.5 11.99 19.5 C 11.1615728753 19.5 10.49 18.8284271247 10.49 18 C 10.49 17.1715728753 11.1615728753 16.5 11.99 16.5 Z" />
+    <path
+        android:fillColor="#000000"
+        android:pathData="M18.76,11.8a0.54 0.54 ,0,0,0,0.36-0.14 0.51 0.51,0,0,0,0-0.71A10.08,10.08,0,0,0,4.87,11a0.5 0.5 ,0,0,0,0,0.71 0.51 0.51,0,0,0,0.71,0,9.07,9.07,0,0,1,12.83,0A0.54 0.54 ,0,0,0,18.76,11.8Z" />
+    <path
+        android:fillColor="#000000"
+        android:fillAlpha="0.3"
+        android:strokeAlpha="0.3"
+        android:strokeWidth="1"
+        android:pathData="M21.5,9a0.47 0.47 ,0,0,0,0.35-0.15 0.48 0.48,0,0,0,0-0.7,13.77,13.77,0,0,0-19.7,0,0.49 0.49 ,0,0,0,0.7 0.7 ,12.8,12.8,0,0,1,18.3,0A0.47 0.47 ,0,0,0,21.5,9Z" />
+    <path
+        android:fillColor="#000000"
+        android:pathData="M15.93,14.64a0.49 0.49 ,0,0,0,0.35-0.15 0.5 0.5,0,0,0,0-0.71,6.08,6.08,0,0,0-8.58,0,0.51 0.51 ,0,0,0,0,0.71 0.5 0.5,0,0,0,0.71,0,5.07,5.07,0,0,1,7.16,0A0.51 0.51 ,0,0,0,15.93,14.64Z" />
+</vector>
diff --git a/packages/overlays/IconPackCircularOverlay/res/drawable/ic_wifi_signal_4.xml b/packages/overlays/IconPackCircularOverlay/res/drawable/ic_wifi_signal_4.xml
new file mode 100644
index 0000000..3512d44ad
--- /dev/null
+++ b/packages/overlays/IconPackCircularOverlay/res/drawable/ic_wifi_signal_4.xml
@@ -0,0 +1,40 @@
+<!--
+/**
+ * Copyright (c) 2019, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
+    <path
+        android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
+    <path
+        android:fillColor="#000000"
+        android:pathData="M 11.99 16.5 C 12.8184271247 16.5 13.49 17.1715728753 13.49 18 C 13.49 18.8284271247 12.8184271247 19.5 11.99 19.5 C 11.1615728753 19.5 10.49 18.8284271247 10.49 18 C 10.49 17.1715728753 11.1615728753 16.5 11.99 16.5 Z" />
+    <path
+        android:fillColor="#000000"
+        android:pathData="M18.76,11.8a0.54 0.54 ,0,0,0,0.36-0.14 0.51 0.51,0,0,0,0-0.71A10.08,10.08,0,0,0,4.87,11a0.5 0.5 ,0,0,0,0,0.71 0.51 0.51,0,0,0,0.71,0,9.07,9.07,0,0,1,12.83,0A0.54 0.54 ,0,0,0,18.76,11.8Z" />
+    <path
+        android:fillColor="#000000"
+        android:pathData="M21.5,9a0.47 0.47 ,0,0,0,0.35-0.15 0.48 0.48,0,0,0,0-0.7,13.77,13.77,0,0,0-19.7,0,0.49 0.49 ,0,0,0,0.7 0.7 ,12.8,12.8,0,0,1,18.3,0A0.47 0.47 ,0,0,0,21.5,9Z" />
+    <path
+        android:fillColor="#000000"
+        android:pathData="M15.93,14.64a0.49 0.49 ,0,0,0,0.35-0.15 0.5 0.5,0,0,0,0-0.71,6.08,6.08,0,0,0-8.58,0,0.51 0.51 ,0,0,0,0,0.71 0.5 0.5,0,0,0,0.71,0,5.08,5.08,0,0,1,7.16,0A0.51 0.51 ,0,0,0,15.93,14.64Z" />
+</vector>
diff --git a/packages/overlays/FontArvoLatoOverlay/Android.mk b/packages/overlays/IconPackFilledOverlay/Android.mk
similarity index 86%
rename from packages/overlays/FontArvoLatoOverlay/Android.mk
rename to packages/overlays/IconPackFilledOverlay/Android.mk
index 3433ecf..14bc1d6 100644
--- a/packages/overlays/FontArvoLatoOverlay/Android.mk
+++ b/packages/overlays/IconPackFilledOverlay/Android.mk
@@ -1,5 +1,5 @@
 #
-#  Copyright 2018, The Android Open Source Project
+#  Copyright 2019, The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -13,11 +13,10 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-
 LOCAL_PATH:= $(call my-dir)
 include $(CLEAR_VARS)
 
-LOCAL_RRO_THEME := FontArvoLato
+LOCAL_RRO_THEME := IconPackFilled
 LOCAL_CERTIFICATE := platform
 LOCAL_PRODUCT_MODULE := true
 
@@ -25,7 +24,7 @@
 
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 
-LOCAL_PACKAGE_NAME := FontArvoLatoOverlay
+LOCAL_PACKAGE_NAME := IconPackFilledOverlay
 LOCAL_SDK_VERSION := current
 
 include $(BUILD_RRO_PACKAGE)
diff --git a/packages/overlays/ExperimentNavigationBarSlim24Overlay/AndroidManifest.xml b/packages/overlays/IconPackFilledOverlay/AndroidManifest.xml
similarity index 60%
copy from packages/overlays/ExperimentNavigationBarSlim24Overlay/AndroidManifest.xml
copy to packages/overlays/IconPackFilledOverlay/AndroidManifest.xml
index aee543a..bf507cd 100644
--- a/packages/overlays/ExperimentNavigationBarSlim24Overlay/AndroidManifest.xml
+++ b/packages/overlays/IconPackFilledOverlay/AndroidManifest.xml
@@ -1,6 +1,6 @@
 <!--
 /**
- * Copyright (c) 2018, The Android Open Source Project
+ * Copyright (c) 2019, The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,12 +16,9 @@
  */
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-        package="com.android.internal.experiment.navbar.slim24"
-        android:versionCode="1"
-        android:versionName="1.0">
-    <overlay android:targetPackage="android"
-        android:category="com.android.internal.experiment_navbar_slim24"
-        android:priority="1"/>
-
-    <application android:label="@string/experiment_navigationbar_overlay" android:hasCode="false"/>
-</manifest>
\ No newline at end of file
+    package="com.android.theme.icon_pack.filled"
+    android:versionCode="1"
+    android:versionName="1.0">
+    <overlay android:targetPackage="android" android:category="android.theme.customization.icon_pack" android:priority="1"/>
+    <application android:label="Filled" android:hasCode="false"/>
+</manifest>
diff --git a/packages/overlays/IconPackFilledOverlay/res/drawable/ic_wifi_signal_0.xml b/packages/overlays/IconPackFilledOverlay/res/drawable/ic_wifi_signal_0.xml
new file mode 100644
index 0000000..7ff3d08
--- /dev/null
+++ b/packages/overlays/IconPackFilledOverlay/res/drawable/ic_wifi_signal_0.xml
@@ -0,0 +1,32 @@
+<!--
+/**
+ * Copyright (c) 2019, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
+    <path
+        android:fillColor="#000000"
+        android:fillAlpha="0.3"
+        android:strokeAlpha="0.3"
+        android:strokeWidth="1"
+        android:pathData="M23.66,8.11a1.06,1.06,0,0,0-0.22-1.54A20.58,20.58,0,0,0,12,3,20.55,20.55,0,0,0,0.56,6.57,1.07,1.07,0,0,0,0.33,8.11L11.16,21.6a1.07,1.07,0,0,0,1.66,0Z" />
+</vector>
diff --git a/packages/overlays/IconPackFilledOverlay/res/drawable/ic_wifi_signal_1.xml b/packages/overlays/IconPackFilledOverlay/res/drawable/ic_wifi_signal_1.xml
new file mode 100644
index 0000000..f83e6d5
--- /dev/null
+++ b/packages/overlays/IconPackFilledOverlay/res/drawable/ic_wifi_signal_1.xml
@@ -0,0 +1,35 @@
+<!--
+/**
+ * Copyright (c) 2019, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
+    <path
+        android:fillColor="#000000"
+        android:fillAlpha="0.3"
+        android:strokeAlpha="0.3"
+        android:strokeWidth="1"
+        android:pathData="M23.66,8.11a1.06,1.06,0,0,0-0.22-1.54A20.58,20.58,0,0,0,12,3,20.55,20.55,0,0,0,0.56,6.57,1.07,1.07,0,0,0,0.33,8.11L11.16,21.6a1.07,1.07,0,0,0,1.66,0Z" />
+    <path
+        android:fillColor="#000000"
+        android:pathData="M12.82,21.6l5.11-6.36a9,9,0,0,0-11.87,0l5.1,6.35A1.07,1.07,0,0,0,12.82,21.6Z" />
+</vector>
diff --git a/packages/overlays/IconPackFilledOverlay/res/drawable/ic_wifi_signal_2.xml b/packages/overlays/IconPackFilledOverlay/res/drawable/ic_wifi_signal_2.xml
new file mode 100644
index 0000000..2bcaf2a
--- /dev/null
+++ b/packages/overlays/IconPackFilledOverlay/res/drawable/ic_wifi_signal_2.xml
@@ -0,0 +1,35 @@
+<!--
+/**
+ * Copyright (c) 2019, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
+    <path
+        android:fillColor="#000000"
+        android:fillAlpha="0.3"
+        android:strokeAlpha="0.3"
+        android:strokeWidth="1"
+        android:pathData="M23.66,8.11a1.06,1.06,0,0,0-0.22-1.54A20.58,20.58,0,0,0,12,3,20.55,20.55,0,0,0,0.56,6.57,1.07,1.07,0,0,0,0.33,8.11L11.16,21.6a1.07,1.07,0,0,0,1.66,0Z" />
+    <path
+        android:fillColor="#000000"
+        android:pathData="M12.82,21.6l7-8.7a12,12,0,0,0-15.63,0l7,8.7A1.07,1.07,0,0,0,12.82,21.6Z" />
+</vector>
diff --git a/packages/overlays/IconPackFilledOverlay/res/drawable/ic_wifi_signal_3.xml b/packages/overlays/IconPackFilledOverlay/res/drawable/ic_wifi_signal_3.xml
new file mode 100644
index 0000000..82b4c9d
--- /dev/null
+++ b/packages/overlays/IconPackFilledOverlay/res/drawable/ic_wifi_signal_3.xml
@@ -0,0 +1,35 @@
+<!--
+/**
+ * Copyright (c) 2019, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
+    <path
+        android:fillColor="#000000"
+        android:fillAlpha="0.3"
+        android:strokeAlpha="0.3"
+        android:strokeWidth="1"
+        android:pathData="M23.66,8.11a1.06,1.06,0,0,0-0.22-1.54A20.58,20.58,0,0,0,12,3,20.55,20.55,0,0,0,0.56,6.57,1.07,1.07,0,0,0,0.33,8.11L11.16,21.6a1.07,1.07,0,0,0,1.66,0Z" />
+    <path
+        android:fillColor="#000000"
+        android:pathData="M12.82,21.6l8.25-10.26a14,14,0,0,0-18.14,0l8.23,10.26A1.07,1.07,0,0,0,12.82,21.6Z" />
+</vector>
diff --git a/packages/overlays/IconPackFilledOverlay/res/drawable/ic_wifi_signal_4.xml b/packages/overlays/IconPackFilledOverlay/res/drawable/ic_wifi_signal_4.xml
new file mode 100644
index 0000000..45cf95f
--- /dev/null
+++ b/packages/overlays/IconPackFilledOverlay/res/drawable/ic_wifi_signal_4.xml
@@ -0,0 +1,29 @@
+<!--
+/**
+ * Copyright (c) 2019, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
+    <path
+        android:fillColor="#000000"
+        android:pathData="M12,3A20.55,20.55,0,0,0,0.56,6.57,1.07,1.07,0,0,0,0.33,8.11L11.16,21.6a1.07,1.07,0,0,0,1.66,0L23.66,8.11a1.06,1.06,0,0,0-0.22-1.54A20.58,20.58,0,0,0,12,3Z" />
+</vector>
diff --git a/packages/overlays/FontRubikRubikOverlay/Android.mk b/packages/overlays/IconPackRoundedOverlay/Android.mk
similarity index 85%
copy from packages/overlays/FontRubikRubikOverlay/Android.mk
copy to packages/overlays/IconPackRoundedOverlay/Android.mk
index 21d617e..075ed28 100644
--- a/packages/overlays/FontRubikRubikOverlay/Android.mk
+++ b/packages/overlays/IconPackRoundedOverlay/Android.mk
@@ -1,5 +1,5 @@
 #
-#  Copyright 2018, The Android Open Source Project
+#  Copyright 2019, The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -13,11 +13,10 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-
 LOCAL_PATH:= $(call my-dir)
 include $(CLEAR_VARS)
 
-LOCAL_RRO_THEME := FontRubikRubik
+LOCAL_RRO_THEME := IconPackRounded
 LOCAL_CERTIFICATE := platform
 LOCAL_PRODUCT_MODULE := true
 
@@ -25,7 +24,7 @@
 
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 
-LOCAL_PACKAGE_NAME := FontRubikRubikOverlay
+LOCAL_PACKAGE_NAME := IconPackRoundedOverlay
 LOCAL_SDK_VERSION := current
 
 include $(BUILD_RRO_PACKAGE)
diff --git a/packages/overlays/ExperimentNavigationBarSlim24Overlay/AndroidManifest.xml b/packages/overlays/IconPackRoundedOverlay/AndroidManifest.xml
similarity index 60%
copy from packages/overlays/ExperimentNavigationBarSlim24Overlay/AndroidManifest.xml
copy to packages/overlays/IconPackRoundedOverlay/AndroidManifest.xml
index aee543a..8014733 100644
--- a/packages/overlays/ExperimentNavigationBarSlim24Overlay/AndroidManifest.xml
+++ b/packages/overlays/IconPackRoundedOverlay/AndroidManifest.xml
@@ -1,6 +1,6 @@
 <!--
 /**
- * Copyright (c) 2018, The Android Open Source Project
+ * Copyright (c) 2019, The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,12 +16,9 @@
  */
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-        package="com.android.internal.experiment.navbar.slim24"
-        android:versionCode="1"
-        android:versionName="1.0">
-    <overlay android:targetPackage="android"
-        android:category="com.android.internal.experiment_navbar_slim24"
-        android:priority="1"/>
-
-    <application android:label="@string/experiment_navigationbar_overlay" android:hasCode="false"/>
-</manifest>
\ No newline at end of file
+    package="com.android.theme.icon_pack.rounded"
+    android:versionCode="1"
+    android:versionName="1.0">
+    <overlay android:targetPackage="android" android:category="android.theme.customization.icon_pack" android:priority="1"/>
+    <application android:label="Rounded" android:hasCode="false"/>
+</manifest>
diff --git a/packages/overlays/IconPackRoundedOverlay/res/drawable/ic_wifi_signal_0.xml b/packages/overlays/IconPackRoundedOverlay/res/drawable/ic_wifi_signal_0.xml
new file mode 100644
index 0000000..089974d
--- /dev/null
+++ b/packages/overlays/IconPackRoundedOverlay/res/drawable/ic_wifi_signal_0.xml
@@ -0,0 +1,50 @@
+<!--
+/**
+ * Copyright (c) 2019, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
+    <path
+        android:fillColor="#000000"
+        android:fillAlpha="0.3"
+        android:strokeAlpha="0.3"
+        android:strokeWidth="1"
+        android:pathData="M22.8,7.25a0.73 0.73 ,0,0,1,0,1l0,0a0.83 0.83 ,0,0,1-1.05,0,13.16,13.16,0,0,0-9.7-4,13.34,13.34,0,0,0-9.7,4,0.72 0.72 ,0,0,1-1,0l0,0a0.76 0.76 ,0,0,1,0-1.05A14.77,14.77,0,0,1,12,2.8,14.51,14.51,0,0,1,22.8,7.25Z" />
+    <path
+        android:fillColor="#000000"
+        android:fillAlpha="0.3"
+        android:strokeAlpha="0.3"
+        android:strokeWidth="1"
+        android:pathData="M8.3,14.8a0.73 0.73 ,0,0,1-1,0l0,0a0.76 0.76 ,0,0,1,0-1,6.73,6.73,0,0,1,9.52,0l0,0h0a0.75 0.75 ,0,0,1,0.12,1.05 0.75 0.75,0,0,1-1.05 0.12 l-0.07-0.07a0,0,0,0,1-0.05,0h0A5.28,5.28,0,0,0,8.3,14.8Z" />
+    <path
+        android:fillColor="#000000"
+        android:fillAlpha="0.3"
+        android:strokeAlpha="0.3"
+        android:strokeWidth="1"
+        android:pathData="M20.05,10.75A0.74 0.74 ,0,0,1,19,11.8h0a10.15,10.15,0,0,0-6.95-3,9.93,9.93,0,0,0-7,3,0.74 0.74 ,0,0,1-1-1.05,11.36,11.36,0,0,1,8.05-3.5A11.43,11.43,0,0,1,20.05,10.75Z" />
+    <path
+        android:fillColor="#000000"
+        android:fillAlpha="0.3"
+        android:strokeAlpha="0.3"
+        android:strokeWidth="1"
+        android:pathData="M 12 17 C 12.8284271247 17 13.5 17.6715728753 13.5 18.5 C 13.5 19.3284271247 12.8284271247 20 12 20 C 11.1715728753 20 10.5 19.3284271247 10.5 18.5 C 10.5 17.6715728753 11.1715728753 17 12 17 Z" />
+</vector>
diff --git a/packages/overlays/IconPackRoundedOverlay/res/drawable/ic_wifi_signal_1.xml b/packages/overlays/IconPackRoundedOverlay/res/drawable/ic_wifi_signal_1.xml
new file mode 100644
index 0000000..e51879e
--- /dev/null
+++ b/packages/overlays/IconPackRoundedOverlay/res/drawable/ic_wifi_signal_1.xml
@@ -0,0 +1,47 @@
+<!--
+/**
+ * Copyright (c) 2019, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
+    <path
+        android:fillColor="#000000"
+        android:fillAlpha="0.3"
+        android:strokeAlpha="0.3"
+        android:strokeWidth="1"
+        android:pathData="M16.77,13.71a6.74,6.74,0,0,0-9.54,0,0.75 0.75 ,0,0,0,1.06,1.06h0a5.25,5.25,0,0,1,7.42,0h0a0.08 0.08 ,0,0,1,0,0,0.75 0.75 ,0,0,0,1.17-1,0.8 0.8 ,0,0,0-0.17-0.15Z" />
+    <path
+        android:fillColor="#000000"
+        android:pathData="M 12 17 C 12.8284271247 17 13.5 17.6715728753 13.5 18.5 C 13.5 19.3284271247 12.8284271247 20 12 20 C 11.1715728753 20 10.5 19.3284271247 10.5 18.5 C 10.5 17.6715728753 11.1715728753 17 12 17 Z" />
+    <path
+        android:fillColor="#000000"
+        android:fillAlpha="0.3"
+        android:strokeAlpha="0.3"
+        android:strokeWidth="1"
+        android:pathData="M20,10.73a11.51,11.51,0,0,0-8-3.5,11.55,11.55,0,0,0-8,3.5 0.75 0.75,0,0,0,0.95,1.15A0.38 0.38 ,0,0,0,5,11.77a10.12,10.12,0,0,1,7-3,10.1,10.1,0,0,1,7,3,0.75 0.75 ,0,0,0,1.06,0,0.77 0.77 ,0,0,0,0-1.07Z" />
+    <path
+        android:fillColor="#000000"
+        android:fillAlpha="0.3"
+        android:strokeAlpha="0.3"
+        android:strokeWidth="1"
+        android:pathData="M22.79,7.23A14.76,14.76,0,0,0,12,2.75,14.72,14.72,0,0,0,1.23,7.2a0.75 0.75 ,0,0,0,1.07,1,13.25,13.25,0,0,1,9.7-4,13.27,13.27,0,0,1,9.72,4,0.75 0.75 ,0,0,0,1.07-1Z" />
+</vector>
diff --git a/packages/overlays/IconPackRoundedOverlay/res/drawable/ic_wifi_signal_2.xml b/packages/overlays/IconPackRoundedOverlay/res/drawable/ic_wifi_signal_2.xml
new file mode 100644
index 0000000..77343af
--- /dev/null
+++ b/packages/overlays/IconPackRoundedOverlay/res/drawable/ic_wifi_signal_2.xml
@@ -0,0 +1,44 @@
+<!--
+/**
+ * Copyright (c) 2019, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
+    <path
+        android:fillColor="#000000"
+        android:pathData="M16.77,13.71a6.74,6.74,0,0,0-9.54,0,0.75 0.75 ,0,0,0,1.06,1.06h0a5.25,5.25,0,0,1,7.42,0h0a0.08 0.08 ,0,0,1,0,0,0.75 0.75 ,0,0,0,1.17-1,0.8 0.8 ,0,0,0-0.17-0.15Z" />
+    <path
+        android:fillColor="#000000"
+        android:pathData="M 12 17 C 12.8284271247 17 13.5 17.6715728753 13.5 18.5 C 13.5 19.3284271247 12.8284271247 20 12 20 C 11.1715728753 20 10.5 19.3284271247 10.5 18.5 C 10.5 17.6715728753 11.1715728753 17 12 17 Z" />
+    <path
+        android:fillColor="#000000"
+        android:fillAlpha="0.3"
+        android:strokeAlpha="0.3"
+        android:strokeWidth="1"
+        android:pathData="M20,10.73a11.51,11.51,0,0,0-8-3.5,11.55,11.55,0,0,0-8,3.5 0.75 0.75,0,0,0,0.95,1.15A0.38 0.38 ,0,0,0,5,11.77a10.12,10.12,0,0,1,7-3,10.1,10.1,0,0,1,7,3,0.75 0.75 ,0,0,0,1.06,0,0.77 0.77 ,0,0,0,0-1.07Z" />
+    <path
+        android:fillColor="#000000"
+        android:fillAlpha="0.3"
+        android:strokeAlpha="0.3"
+        android:strokeWidth="1"
+        android:pathData="M22.79,7.23A14.76,14.76,0,0,0,12,2.75,14.72,14.72,0,0,0,1.23,7.2a0.75 0.75 ,0,0,0,1.07,1,13.25,13.25,0,0,1,9.7-4,13.27,13.27,0,0,1,9.72,4,0.75 0.75 ,0,0,0,1.07-1Z" />
+</vector>
diff --git a/packages/overlays/IconPackRoundedOverlay/res/drawable/ic_wifi_signal_3.xml b/packages/overlays/IconPackRoundedOverlay/res/drawable/ic_wifi_signal_3.xml
new file mode 100644
index 0000000..0b89382
--- /dev/null
+++ b/packages/overlays/IconPackRoundedOverlay/res/drawable/ic_wifi_signal_3.xml
@@ -0,0 +1,41 @@
+<!--
+/**
+ * Copyright (c) 2019, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
+    <path
+        android:fillColor="#000000"
+        android:pathData="M16.77,13.71a6.74,6.74,0,0,0-9.54,0,0.75 0.75 ,0,0,0,1.06,1.06h0a5.25,5.25,0,0,1,7.42,0h0a0.08 0.08 ,0,0,1,0,0,0.75 0.75 ,0,0,0,1.17-1,0.8 0.8 ,0,0,0-0.17-0.15Z" />
+    <path
+        android:fillColor="#000000"
+        android:pathData="M 12 17 C 12.8284271247 17 13.5 17.6715728753 13.5 18.5 C 13.5 19.3284271247 12.8284271247 20 12 20 C 11.1715728753 20 10.5 19.3284271247 10.5 18.5 C 10.5 17.6715728753 11.1715728753 17 12 17 Z" />
+    <path
+        android:fillColor="#000000"
+        android:pathData="M20,10.73a11.51,11.51,0,0,0-8-3.5,11.55,11.55,0,0,0-8,3.5 0.75 0.75,0,0,0,0.95,1.15A0.38 0.38 ,0,0,0,5,11.77a10.12,10.12,0,0,1,7-3,10.1,10.1,0,0,1,7,3,0.75 0.75 ,0,0,0,1.06,0,0.77 0.77 ,0,0,0,0-1.07Z" />
+    <path
+        android:fillColor="#000000"
+        android:fillAlpha="0.3"
+        android:strokeAlpha="0.3"
+        android:strokeWidth="1"
+        android:pathData="M22.79,7.23A14.76,14.76,0,0,0,12,2.75,14.72,14.72,0,0,0,1.23,7.2a0.75 0.75 ,0,0,0,1.07,1,13.25,13.25,0,0,1,9.7-4,13.27,13.27,0,0,1,9.72,4,0.75 0.75 ,0,0,0,1.07-1Z" />
+</vector>
diff --git a/packages/overlays/IconPackRoundedOverlay/res/drawable/ic_wifi_signal_4.xml b/packages/overlays/IconPackRoundedOverlay/res/drawable/ic_wifi_signal_4.xml
new file mode 100644
index 0000000..f02bc83
--- /dev/null
+++ b/packages/overlays/IconPackRoundedOverlay/res/drawable/ic_wifi_signal_4.xml
@@ -0,0 +1,38 @@
+<!--
+/**
+ * Copyright (c) 2019, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
+    <path
+        android:fillColor="#000000"
+        android:pathData="M20,11.79a0.77 0.77 ,0,0,0,0-1.07h0a11.59,11.59,0,0,0-8-3.5,11.63,11.63,0,0,0-8,3.5 0.77 0.77,0,0,0,0,1.07 0.76 0.76,0,0,0,1.07,0,10.12,10.12,0,0,1,7-3,10.12,10.12,0,0,1,7,3A0.75 0.75 ,0,0,0,20,11.79Z" />
+    <path
+        android:fillColor="#000000"
+        android:pathData="M15.78,14.82a0.57 0.57 ,0,0,0,0.16 0.15 0.75 0.75 ,0,0,0,1-0.2 0.76 0.76,0,0,0-0.2-1,6.77,6.77,0,0,0-9.55,0,0.76 0.76 ,0,0,0,0,1,0.75 0.75 ,0,0,0,1.06,0h0a5.24,5.24,0,0,1,7.42,0A0.08 0.08 ,0,0,0,15.78,14.82Z" />
+    <path
+        android:fillColor="#000000"
+        android:pathData="M 12 17 C 12.8284271247 17 13.5 17.6715728753 13.5 18.5 C 13.5 19.3284271247 12.8284271247 20 12 20 C 11.1715728753 20 10.5 19.3284271247 10.5 18.5 C 10.5 17.6715728753 11.1715728753 17 12 17 Z" />
+    <path
+        android:fillColor="#000000"
+        android:pathData="M2.3,8.25a13.25,13.25,0,0,1,9.7-4,13.27,13.27,0,0,1,9.72,4,0.73 0.73 ,0,0,0,1,0,0.75 0.75 ,0,0,0,0.05-1.06A14.76,14.76,0,0,0,12,2.75,14.76,14.76,0,0,0,1.22,7.2a0.77 0.77 ,0,0,0,0,1A0.75 0.75 ,0,0,0,2.3,8.25Z" />
+</vector>
diff --git a/proto/Android.bp b/proto/Android.bp
index f3811bd..817a54d 100644
--- a/proto/Android.bp
+++ b/proto/Android.bp
@@ -17,3 +17,24 @@
         },
     },
 }
+
+java_library_static {
+    name: "metrics-constants-protos",
+    host_supported: true,
+    proto: {
+        type: "nano",
+    },
+    srcs: ["src/metrics_constants/metrics_constants.proto"],
+    no_framework_libs: true,
+    sdk_version: "system_current",
+    // Pin java_version until jarjar is certified to support later versions. http://b/72703434
+    java_version: "1.8",
+    target: {
+        android: {
+            jarjar_rules: "jarjar-rules.txt",
+        },
+        host: {
+            static_libs: ["libprotobuf-java-nano"],
+        },
+    },
+}
diff --git a/proto/src/metrics_constants/metrics_constants.proto b/proto/src/metrics_constants/metrics_constants.proto
index 73fcb01..76bb24d 100644
--- a/proto/src/metrics_constants/metrics_constants.proto
+++ b/proto/src/metrics_constants/metrics_constants.proto
@@ -6766,10 +6766,10 @@
     // OS: Q
     ZEN_CUSTOM_SETTINGS_DIALOG = 1612;
 
-    // OPEN: Settings > Developer Options > Game Update Packages
+    // OPEN: Settings > Developer Options > Game Driver Preferences
     // CATEGORY: SETTINGS
     // OS: Q
-    SETTINGS_GUP_DASHBOARD = 1613;
+    SETTINGS_GAME_DRIVER_DASHBOARD = 1613;
 
     // CATEGORY: The category for all actions relating to language detection logging.
     // OS: Q
@@ -6904,6 +6904,38 @@
     // OS: Q
     FIELD_TEXT_CLASSIFIER_WIDGET_VERSION = 1640;
 
+    // Tagged data for NOTIFICATION_ITEM. One of the CATEGORY String constants from
+    // https://developer.android.com/reference/android/app/Notification .
+    // OS: Q
+    // CATEGORY: NOTIFICATION
+    FIELD_NOTIFICATION_CATEGORY = 1641;
+
+    // OPEN: Settings > Settings > Network & internet > Click Mobile network to land on page with
+    // details for a SIM/eSIM mobile network > Click edit icon to bring up a rename dialog.
+    // OS: Q
+    MOBILE_NETWORK_RENAME_DIALOG = 1642;
+
+    // ACTION: Settings > Search Bar > Avatar
+    // CATEGORY: SETTINGS
+    // OS: Q
+    ACTION_CLICK_ACCOUNT_AVATAR = 1643;
+
+    // OPEN: Set new password (action intents android.app.action.SET_NEW_PASSWORD or
+    // android.app.action.SET_NEW_PARENT_PROFILE_PASSWORD)
+    // CATEGORY: SETTINGS
+    // OS: Q
+    SET_NEW_PASSWORD_ACTIVITY = 1644;
+
+    // ACTION: Set new password (action intent android.app.action.SET_NEW_PASSWORD)
+    // CATEGORY: SETTINGS
+    // OS: Q
+    ACTION_SET_NEW_PASSWORD = 1645;
+
+    // ACTION: Set new password (action intent android.app.action.SET_NEW_PARENT_PROFILE_PASSWORD)
+    // CATEGORY: SETTINGS
+    // OS: Q
+    ACTION_SET_NEW_PARENT_PROFILE_PASSWORD = 1646;
+
     // ---- End Q Constants, all Q constants go above this line ----
     // Add new aosp constants above this line.
     // END OF AOSP CONSTANTS
diff --git a/proto/src/wifi.proto b/proto/src/wifi.proto
index c063e82..2b45b49 100644
--- a/proto/src/wifi.proto
+++ b/proto/src/wifi.proto
@@ -33,11 +33,11 @@
   // Number of open networks in the saved networks.
   optional int32 num_open_networks = 3;
 
-  // Number of personal networks.
-  optional int32 num_personal_networks = 4;
+  // Number of legacy personal networks.
+  optional int32 num_legacy_personal_networks = 4;
 
-  // Number of enterprise networks.
-  optional int32 num_enterprise_networks = 5;
+  // Number of legacy enterprise networks.
+  optional int32 num_legacy_enterprise_networks = 5;
 
   // Does the user have location setting enabled.
   optional bool is_location_enabled = 6;
@@ -96,11 +96,11 @@
 
   message ScanReturnEntry {
 
-     // Return code of the scan.
-     optional ScanReturnCode scan_return_code = 1;
+    // Return code of the scan.
+    optional ScanReturnCode scan_return_code = 1;
 
-     // Number of entries that were found in the scan.
-     optional int32 scan_results_count = 2;
+    // Number of entries that were found in the scan.
+    optional int32 scan_results_count = 2;
   }
 
   // State of the Wifi.
@@ -125,14 +125,14 @@
 
   message WifiSystemStateEntry {
 
-     // Current WiFi state.
-     optional WifiState wifi_state = 1;
+    // Current WiFi state.
+    optional WifiState wifi_state = 1;
 
-     // Count of scans in state.
-     optional int32 wifi_state_count = 2;
+    // Count of scans in state.
+    optional int32 wifi_state_count = 2;
 
-     // Is screen on.
-     optional bool is_screen_on = 3;
+    // Is screen on.
+    optional bool is_screen_on = 3;
   }
 
   // Mapping of Error/Success codes to the number of background scans that resulted in it
@@ -206,11 +206,11 @@
   // Total number of scan results for open networks
   optional int32 num_open_network_scan_results = 40;
 
-  // Total number of scan results for personal networks
-  optional int32 num_personal_network_scan_results = 41;
+  // Total number of scan results for legacy personal networks
+  optional int32 num_legacy_personal_network_scan_results = 41;
 
-  // Total number of scan results for enterprise networks
-  optional int32 num_enterprise_network_scan_results = 42;
+  // Total number of scan results for legacy enterprise networks
+  optional int32 num_legacy_enterprise_network_scan_results = 42;
 
   // Total number of scan results for hidden networks
   optional int32 num_hidden_network_scan_results = 43;
@@ -494,6 +494,27 @@
 
   // Wifi p2p statistics
   optional WifiP2pStats wifi_p2p_stats = 129;
+
+  // Easy Connect (DPP) metrics
+  optional WifiDppLog wifi_dpp_log = 130;
+
+  // Number of Enhanced Open (OWE) networks in the saved networks.
+  optional int32 num_enhanced_open_networks = 131;
+
+  // Number of WPA3-Personal networks.
+  optional int32 num_wpa3_personal_networks = 132;
+
+  // Number of WPA3-Enterprise networks.
+  optional int32 num_wpa3_enterprise_networks = 133;
+
+  // Total number of scan results for Enhanced open networks
+  optional int32 num_enhanced_open_network_scan_results = 134;
+
+  // Total number of scan results for WPA3-Personal networks
+  optional int32 num_wpa3_personal_network_scan_results = 135;
+
+  // Total number of scan results for WPA3-Enterprise networks
+  optional int32 num_wpa3_enterprise_network_scan_results = 136;
 }
 
 // Information that gets logged for every WiFi connection.
@@ -587,7 +608,7 @@
     ROAM_UNKNOWN = 0;
 
     // No roaming.
-    ROAM_NONE  = 1;
+    ROAM_NONE = 1;
 
     // DBDC roaming.
     ROAM_DBDC = 2;
@@ -1486,7 +1507,7 @@
     repeated HistogramBucket histogram_request_interval_ms = 8;
   }
 
-    // Histogram bucket for Wi-Fi RTT logs. Range is [start, end)
+  // Histogram bucket for Wi-Fi RTT logs. Range is [start, end)
   message HistogramBucket {
     // lower range of the bucket (inclusive)
     optional int64 start = 1;
@@ -1754,6 +1775,21 @@
 }
 
 message WifiUsabilityStatsEntry {
+  // Status codes for link probe status
+  enum LinkProbeStatus {
+    // Link probe status is unknown
+    PROBE_STATUS_UNKNOWN = 0;
+
+    // Link probe is not triggered
+    PROBE_STATUS_NO_PROBE = 1;
+
+    // Link probe is triggered and the result is success
+    PROBE_STATUS_SUCCESS = 2;
+
+    // Link probe is triggered and the result is failure
+    PROBE_STATUS_FAILURE = 3;
+  }
+
   // Absolute milliseconds from device boot when these stats were sampled
   optional int64 time_stamp_ms = 1;
 
@@ -1826,6 +1862,18 @@
   // Prediction horizon (in second) of Wifi usability score provided by external
   // system app
   optional int32 prediction_horizon_sec = 23;
+
+  // The link probe status since last stats update
+  optional LinkProbeStatus probe_status_since_last_update = 24;
+
+  // The elapsed time of the most recent link probe since last stats update;
+  optional int32 probe_elapsed_time_ms_since_last_update = 25;
+
+  // The MCS rate of the most recent link probe since last stats update
+  optional int32 probe_mcs_rate_since_last_update = 26;
+
+  // Rx link speed at the sample time in Mbps
+  optional int32 rx_link_speed_mbps = 27;
 }
 
 message WifiUsabilityStats {
@@ -1840,11 +1888,31 @@
     LABEL_BAD = 2;
   }
 
+  enum UsabilityStatsTriggerType {
+    // Default/Invalid event
+    TYPE_UNKNOWN = 0;
+
+    // There is a data stall from tx failures
+    TYPE_DATA_STALL_BAD_TX = 1;
+
+    // There is a data stall from rx failures
+    TYPE_DATA_STALL_TX_WITHOUT_RX = 2;
+
+    // There is a data stall from both tx and rx failures
+    TYPE_DATA_STALL_BOTH = 3;
+
+    // Firmware generated an alert
+    TYPE_FIRMWARE_ALERT = 4;
+  }
+
   // The current wifi usability state
   optional Label label = 1;
 
   // The list of timestamped wifi usability stats
   repeated WifiUsabilityStatsEntry stats = 2;
+
+  // What event triggered WifiUsabilityStats.
+  optional UsabilityStatsTriggerType trigger_type = 3;
 }
 
 message DeviceMobilityStatePnoScanStats {
@@ -1872,6 +1940,7 @@
   // The total duration elapsed while in this mobility state, in ms
   optional int64 total_duration_ms = 3;
 
+
   // the total duration elapsed while in this mobility state with PNO scans running, in ms
   optional int64 pno_duration_ms = 4;
 }
@@ -2007,3 +2076,97 @@
   // The idle duration. A group without any client is in idle.
   optional int32 idle_duration_millis = 9;
 }
+
+// Easy Connect (DPP)
+message WifiDppLog {
+  // Number of Configurator-Initiator requests
+  optional int32 num_dpp_configurator_initiator_requests = 1;
+
+  // Number of Enrollee-Initiator requests
+  optional int32 num_dpp_enrollee_initiator_requests = 2;
+
+  // Easy Connect (DPP) Enrollee success
+  optional int32 num_dpp_enrollee_success = 3;
+
+  // Easy Connect (DPP) Configurator success code bucket
+  repeated DppConfiguratorSuccessStatusHistogramBucket dpp_configurator_success_code = 4;
+
+  // Easy Connect (DPP) failure code bucket
+  repeated DppFailureStatusHistogramBucket dpp_failure_code = 5;
+
+  // Easy Connect (DPP) operation time bucket
+  repeated HistogramBucket dpp_operation_time = 6;
+
+  // Histogram bucket for Wi-Fi DPP configurator success
+  message DppConfiguratorSuccessStatusHistogramBucket {
+    // status type defining the bucket
+    optional DppConfiguratorSuccessCode dpp_status_type = 1;
+
+    // number of samples in the bucket
+    optional int32 count = 2;
+  }
+
+  // Histogram bucket for Wi-Fi DPP failures
+  message DppFailureStatusHistogramBucket {
+    // status type defining the bucket
+    optional DppFailureCode dpp_status_type = 1;
+
+    // number of samples in the bucket
+    optional int32 count = 2;
+  }
+
+  // Histogram bucket for Wi-Fi DPP logs. Range is [start, end)
+  message HistogramBucket {
+    // lower range of the bucket (inclusive)
+    optional int32 start = 1;
+
+    // upper range of the bucket (exclusive)
+    optional int32 end = 2;
+
+    // number of samples in the bucket
+    optional int32 count = 3;
+  }
+
+  enum DppConfiguratorSuccessCode {
+    // Unknown success code
+    EASY_CONNECT_EVENT_SUCCESS_UNKNOWN = 0;
+
+    // Easy Connect Configurator success event: Configuration sent to enrollee
+    EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT = 1;
+  }
+
+  enum DppFailureCode {
+    // Unknown failure
+    EASY_CONNECT_EVENT_FAILURE_UNKNOWN = 0;
+
+    // Easy Connect Failure event: Scanned QR code is either not a Easy Connect URI, or the Easy
+    // Connect URI has errors.
+    EASY_CONNECT_EVENT_FAILURE_INVALID_URI = 1;
+
+    // Easy Connect Failure event: Bootstrapping/Authentication initialization process failure.
+    EASY_CONNECT_EVENT_FAILURE_AUTHENTICATION = 2;
+
+    // Easy Connect Failure event: Both devices are implementing the same role and are
+    // incompatible.
+    EASY_CONNECT_EVENT_FAILURE_NOT_COMPATIBLE = 3;
+
+    // Easy Connect Failure event: Configuration process has failed due to malformed message.
+    EASY_CONNECT_EVENT_FAILURE_CONFIGURATION = 4;
+
+    // Easy Connect Failure event: Easy Connect request while in another Easy Connect exchange.
+    EASY_CONNECT_EVENT_FAILURE_BUSY = 5;
+
+    // Easy Connect Failure event: No response from the peer.
+    EASY_CONNECT_EVENT_FAILURE_TIMEOUT = 6;
+
+    // Easy Connect Failure event: General protocol failure.
+    EASY_CONNECT_EVENT_FAILURE_GENERIC = 7;
+
+    // Easy Connect Failure event: Feature or option is not supported.
+    EASY_CONNECT_EVENT_FAILURE_NOT_SUPPORTED = 8;
+
+    // Easy Connect Failure event: Invalid network provided to Easy Connect configurator.
+    // Network must either be WPA3-Personal (SAE) or WPA2-Personal (PSK).
+    EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK = 9;
+  }
+}
diff --git a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
index 2c075dc..fc43882 100644
--- a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
+++ b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
@@ -275,6 +275,9 @@
                 & AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS) == 0) {
             return false;
         }
+        if (!mSecurityPolicy.checkAccessibilityAccess(this)) {
+            return false;
+        }
         try {
             mServiceInterface.onKeyEvent(keyEvent, sequenceNumber);
         } catch (RemoteException e) {
@@ -345,8 +348,8 @@
     }
 
     int getRelevantEventTypes() {
-        return (mUsesAccessibilityCache ? AccessibilityCache.CACHE_CRITICAL_EVENTS_MASK : 0)
-                | mEventTypes;
+        return (mUsesAccessibilityCache ? AccessibilityCache.CACHE_CRITICAL_EVENTS_MASK
+                : AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) | mEventTypes;
     }
 
     @Override
@@ -388,6 +391,9 @@
             if (mSecurityPolicy.mWindows == null) {
                 return null;
             }
+            if (!mSecurityPolicy.checkAccessibilityAccess(this)) {
+                return null;
+            }
             List<AccessibilityWindowInfo> windows = new ArrayList<>();
             final int windowCount = mSecurityPolicy.mWindows.size();
             for (int i = 0; i < windowCount; i++) {
@@ -413,6 +419,9 @@
             if (!permissionGranted) {
                 return null;
             }
+            if (!mSecurityPolicy.checkAccessibilityAccess(this)) {
+                return null;
+            }
             AccessibilityWindowInfo window = mSecurityPolicy.findA11yWindowInfoById(windowId);
             if (window != null) {
                 AccessibilityWindowInfo windowClone = AccessibilityWindowInfo.obtain(window);
@@ -455,6 +464,9 @@
             }
             spec = mSystemSupport.getCompatibleMagnificationSpecLocked(resolvedWindowId);
         }
+        if (!mSecurityPolicy.checkAccessibilityAccess(this)) {
+            return null;
+        }
         final int interrogatingPid = Binder.getCallingPid();
         callback = mSystemSupport.replaceCallbackIfNeeded(callback, resolvedWindowId, interactionId,
                 interrogatingPid, interrogatingTid);
@@ -511,6 +523,9 @@
             }
             spec = mSystemSupport.getCompatibleMagnificationSpecLocked(resolvedWindowId);
         }
+        if (!mSecurityPolicy.checkAccessibilityAccess(this)) {
+            return null;
+        }
         final int interrogatingPid = Binder.getCallingPid();
         callback = mSystemSupport.replaceCallbackIfNeeded(callback, resolvedWindowId, interactionId,
                 interrogatingPid, interrogatingTid);
@@ -567,6 +582,9 @@
             }
             spec = mSystemSupport.getCompatibleMagnificationSpecLocked(resolvedWindowId);
         }
+        if (!mSecurityPolicy.checkAccessibilityAccess(this)) {
+            return null;
+        }
         final int interrogatingPid = Binder.getCallingPid();
         callback = mSystemSupport.replaceCallbackIfNeeded(callback, resolvedWindowId, interactionId,
                 interrogatingPid, interrogatingTid);
@@ -623,6 +641,9 @@
             }
             spec = mSystemSupport.getCompatibleMagnificationSpecLocked(resolvedWindowId);
         }
+        if (!mSecurityPolicy.checkAccessibilityAccess(this)) {
+            return null;
+        }
         final int interrogatingPid = Binder.getCallingPid();
         callback = mSystemSupport.replaceCallbackIfNeeded(callback, resolvedWindowId, interactionId,
                 interrogatingPid, interrogatingTid);
@@ -678,6 +699,9 @@
             }
             spec = mSystemSupport.getCompatibleMagnificationSpecLocked(resolvedWindowId);
         }
+        if (!mSecurityPolicy.checkAccessibilityAccess(this)) {
+            return null;
+        }
         final int interrogatingPid = Binder.getCallingPid();
         callback = mSystemSupport.replaceCallbackIfNeeded(callback, resolvedWindowId, interactionId,
                 interrogatingPid, interrogatingTid);
@@ -722,6 +746,9 @@
                 return false;
             }
         }
+        if (!mSecurityPolicy.checkAccessibilityAccess(this)) {
+            return false;
+        }
         boolean returnValue =
                 mSystemSupport.performAccessibilityAction(resolvedWindowId, accessibilityNodeId,
                 action, arguments, interactionId, callback, mFetchFlags, interrogatingTid);
@@ -974,6 +1001,9 @@
                 return;
             }
 
+            if (!mSecurityPolicy.checkAccessibilityAccess(this)) {
+                return;
+            }
             // Make a copy since during dispatch it is possible the event to
             // be modified to remove its source if the receiving service does
             // not have permission to access the window content.
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index 305c53e..47cd917 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -3024,9 +3024,19 @@
         }
 
         public void clearAccessibilityFocusNotLocked(int windowId) {
-            AccessibilityNodeInfo focus = getAccessibilityFocusNotLocked(windowId);
-            if (focus != null) {
-                focus.performAction(AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS);
+            RemoteAccessibilityConnection connection;
+            synchronized (mLock) {
+                connection = getConnectionLocked(windowId);
+                if (connection == null) {
+                    return;
+                }
+            }
+            try {
+                connection.getRemote().clearAccessibilityFocus();
+            } catch (RemoteException re) {
+                if (DEBUG) {
+                    Slog.e(LOG_TAG, "Error calling clearAccessibilityFocus()");
+                }
             }
         }
 
@@ -3787,6 +3797,31 @@
                 return findWindowIdLocked(token);
             }
         }
+
+        public boolean checkAccessibilityAccess(AbstractAccessibilityServiceConnection service) {
+            final String packageName = service.getComponentName().getPackageName();
+            final ResolveInfo resolveInfo = service.getServiceInfo().getResolveInfo();
+
+            if (resolveInfo == null) {
+                // For InteractionBridge and UiAutomation
+                return true;
+            }
+
+            final int uid = resolveInfo.serviceInfo.applicationInfo.uid;
+            final long identityToken = Binder.clearCallingIdentity();
+            try {
+                // For the caller is system, just block the data to a11y services.
+                if (OWN_PROCESS_ID == Binder.getCallingPid()) {
+                    return mAppOpsManager.noteOpNoThrow(AppOpsManager.OPSTR_ACCESS_ACCESSIBILITY,
+                            uid, packageName) == AppOpsManager.MODE_ALLOWED;
+                }
+
+                return mAppOpsManager.noteOp(AppOpsManager.OPSTR_ACCESS_ACCESSIBILITY,
+                        uid, packageName) == AppOpsManager.MODE_ALLOWED;
+            } finally {
+                Binder.restoreCallingIdentity(identityToken);
+            }
+        }
     }
 
     /**
diff --git a/services/backup/java/com/android/server/backup/FullBackupJob.java b/services/backup/java/com/android/server/backup/FullBackupJob.java
index 33d21cb0..f62a875 100644
--- a/services/backup/java/com/android/server/backup/FullBackupJob.java
+++ b/services/backup/java/com/android/server/backup/FullBackupJob.java
@@ -32,9 +32,9 @@
     private static final String USER_ID_EXTRA_KEY = "userId";
 
     @VisibleForTesting
-    static final int MIN_JOB_ID = 52418896;
+    public static final int MIN_JOB_ID = 52418896;
     @VisibleForTesting
-    static final int MAX_JOB_ID = 52419896;
+    public static final int MAX_JOB_ID = 52419896;
 
     private static ComponentName sIdleService =
             new ComponentName("android", FullBackupJob.class.getName());
diff --git a/services/backup/java/com/android/server/backup/KeyValueBackupJob.java b/services/backup/java/com/android/server/backup/KeyValueBackupJob.java
index d43859e..72d81d3 100644
--- a/services/backup/java/com/android/server/backup/KeyValueBackupJob.java
+++ b/services/backup/java/com/android/server/backup/KeyValueBackupJob.java
@@ -58,8 +58,10 @@
     @GuardedBy("KeyValueBackupJob.class")
     private static final SparseLongArray sNextScheduledForUserId = new SparseLongArray();
 
-    private static final int MIN_JOB_ID = 52417896;
-    private static final int MAX_JOB_ID = 52418896;
+    @VisibleForTesting
+    public static final int MIN_JOB_ID = 52417896;
+    @VisibleForTesting
+    public static final int MAX_JOB_ID = 52418896;
 
     public static void schedule(int userId, Context ctx, BackupManagerConstants constants) {
         schedule(userId, ctx, 0, constants);
diff --git a/services/backup/java/com/android/server/backup/Trampoline.java b/services/backup/java/com/android/server/backup/Trampoline.java
index 303734a..87872e8 100644
--- a/services/backup/java/com/android/server/backup/Trampoline.java
+++ b/services/backup/java/com/android/server/backup/Trampoline.java
@@ -332,7 +332,14 @@
                 // If the user is unlocked, we can start the backup service for it. Otherwise we
                 // will start the service when the user is unlocked as part of its unlock callback.
                 if (getUserManager().isUserUnlocked(userId)) {
-                    startServiceForUser(userId);
+                    // Clear calling identity as initialization enforces the system identity but we
+                    // can be coming from shell.
+                    long oldId = Binder.clearCallingIdentity();
+                    try {
+                        startServiceForUser(userId);
+                    } finally {
+                        Binder.restoreCallingIdentity(oldId);
+                    }
                 }
             } else {
                 try {
diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java
index 115e924..8b2c1b9 100644
--- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java
@@ -1863,7 +1863,7 @@
             // The agent was running with a stub Application object, so shut it down.
             // !!! We hardcode the confirmation UI's package name here rather than use a
             //     manifest flag!  TODO something less direct.
-            if (app.uid >= Process.FIRST_APPLICATION_UID
+            if (!UserHandle.isCore(app.uid)
                     && !app.packageName.equals("com.android.backupconfirm")) {
                 if (MORE_DEBUG) Slog.d(TAG, "Killing agent host process");
                 mActivityManager.killApplicationProcess(app.processName, app.uid);
@@ -1906,13 +1906,7 @@
                 final long interval = mConstants.getFullBackupIntervalMilliseconds();
                 final long appLatency = (timeSinceLast < interval) ? (interval - timeSinceLast) : 0;
                 final long latency = Math.max(transportMinLatency, appLatency);
-                Runnable r = new Runnable() {
-                    @Override
-                    public void run() {
-                        FullBackupJob.schedule(mUserId, mContext, latency, mConstants);
-                    }
-                };
-                mBackupHandler.postDelayed(r, 2500);
+                FullBackupJob.schedule(mUserId, mContext, latency, mConstants);
             } else {
                 if (DEBUG_SCHEDULING) {
                     Slog.i(TAG, "Full backup queue empty; not scheduling");
@@ -2144,12 +2138,7 @@
                     Slog.i(TAG, "Nothing pending full backup; rescheduling +" + latency);
                 }
                 final long deferTime = latency;     // pin for the closure
-                mBackupHandler.post(new Runnable() {
-                    @Override
-                    public void run() {
-                        FullBackupJob.schedule(mUserId, mContext, deferTime, mConstants);
-                    }
-                });
+                FullBackupJob.schedule(mUserId, mContext, deferTime, mConstants);
                 return false;
             }
 
diff --git a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
index 7763d7b..324c2d9 100644
--- a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
+++ b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
@@ -45,9 +45,9 @@
 import android.os.Bundle;
 import android.os.Message;
 import android.os.ParcelFileDescriptor;
-import android.os.Process;
 import android.os.RemoteException;
 import android.os.SystemClock;
+import android.os.UserHandle;
 import android.util.EventLog;
 import android.util.Slog;
 
@@ -1174,7 +1174,7 @@
                 //     b. the app does not state android:killAfterRestore="false" in its manifest
                 final int appFlags = mCurrentPackage.applicationInfo.flags;
                 final boolean killAfterRestore =
-                        (mCurrentPackage.applicationInfo.uid >= Process.FIRST_APPLICATION_UID)
+                        !UserHandle.isCore(mCurrentPackage.applicationInfo.uid)
                                 && ((mRestoreDescription.getDataType()
                                 == RestoreDescription.TYPE_FULL_STREAM)
                                 || ((appFlags & ApplicationInfo.FLAG_KILL_AFTER_RESTORE) != 0));
diff --git a/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java b/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java
index 2db8928..7ee3047 100644
--- a/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java
+++ b/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java
@@ -31,7 +31,6 @@
 import android.content.pm.PackageManagerInternal;
 import android.content.pm.Signature;
 import android.content.pm.SigningInfo;
-import android.os.Process;
 import android.os.RemoteException;
 import android.os.UserHandle;
 import android.util.Slog;
@@ -72,7 +71,7 @@
         }
 
         // 2. they run as a system-level uid
-        if ((app.uid < Process.FIRST_APPLICATION_UID)) {
+        if (UserHandle.isCore(app.uid)) {
             // and the backup is happening for non-system user
             if (userId != UserHandle.USER_SYSTEM && !app.packageName.equals(
                     PACKAGE_MANAGER_SENTINEL)) {
diff --git a/services/backup/java/com/android/server/backup/utils/RestoreUtils.java b/services/backup/java/com/android/server/backup/utils/RestoreUtils.java
index cce5b3b..97bde9c 100644
--- a/services/backup/java/com/android/server/backup/utils/RestoreUtils.java
+++ b/services/backup/java/com/android/server/backup/utils/RestoreUtils.java
@@ -34,7 +34,7 @@
 import android.content.pm.Signature;
 import android.os.Bundle;
 import android.os.IBinder;
-import android.os.Process;
+import android.os.UserHandle;
 import android.util.Slog;
 
 import com.android.internal.annotations.GuardedBy;
@@ -162,7 +162,7 @@
                             if (AppBackupUtils.signaturesMatch(sigs, pkg, pmi)) {
                                 // If this is a system-uid app without a declared backup agent,
                                 // don't restore any of the file data.
-                                if ((pkg.applicationInfo.uid < Process.FIRST_APPLICATION_UID)
+                                if (UserHandle.isCore(pkg.applicationInfo.uid)
                                         && (pkg.applicationInfo.backupAgentName == null)) {
                                     Slog.w(TAG, "Installed app " + info.packageName
                                             + " has restricted uid and no agent");
diff --git a/services/backup/java/com/android/server/backup/utils/TarBackupReader.java b/services/backup/java/com/android/server/backup/utils/TarBackupReader.java
index f4b235a..f3b8098 100644
--- a/services/backup/java/com/android/server/backup/utils/TarBackupReader.java
+++ b/services/backup/java/com/android/server/backup/utils/TarBackupReader.java
@@ -53,7 +53,7 @@
 import android.content.pm.PackageManagerInternal;
 import android.content.pm.Signature;
 import android.os.Bundle;
-import android.os.Process;
+import android.os.UserHandle;
 import android.util.Slog;
 
 import com.android.server.backup.FileMetadata;
@@ -404,8 +404,7 @@
             if ((flags & ApplicationInfo.FLAG_ALLOW_BACKUP) != 0) {
                 // Restore system-uid-space packages only if they have
                 // defined a custom backup agent
-                if ((pkgInfo.applicationInfo.uid
-                        >= Process.FIRST_APPLICATION_UID)
+                if (!UserHandle.isCore(pkgInfo.applicationInfo.uid)
                         || (pkgInfo.applicationInfo.backupAgentName != null)) {
                     // Verify signatures against any installed version; if they
                     // don't match, then we fall though and ignore the data.  The
diff --git a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
index 6108aaa..9249c9c 100644
--- a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
+++ b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
@@ -20,10 +20,17 @@
 import static android.content.Context.CONTENT_CAPTURE_MANAGER_SERVICE;
 
 import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.annotation.UserIdInt;
 import android.app.ActivityManagerInternal;
 import android.content.ComponentName;
+import android.content.ContentResolver;
 import android.content.Context;
+import android.content.pm.ActivityPresentationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.UserInfo;
+import android.database.ContentObserver;
 import android.os.Binder;
 import android.os.Bundle;
 import android.os.IBinder;
@@ -32,8 +39,11 @@
 import android.os.ShellCallback;
 import android.os.UserHandle;
 import android.os.UserManager;
+import android.provider.Settings;
 import android.util.LocalLog;
 import android.util.Slog;
+import android.util.SparseBooleanArray;
+import android.view.contentcapture.ContentCaptureManager;
 import android.view.contentcapture.IContentCaptureManager;
 import android.view.contentcapture.UserDataRemovalRequest;
 
@@ -49,6 +59,7 @@
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
 import java.util.ArrayList;
+import java.util.List;
 
 /**
  * A service used to observe the contents of the screen.
@@ -60,23 +71,43 @@
 public final class ContentCaptureManagerService extends
         AbstractMasterSystemService<ContentCaptureManagerService, ContentCapturePerUserService> {
 
-    private static final String TAG = ContentCaptureManagerService.class.getSimpleName();
-
     static final String RECEIVER_BUNDLE_EXTRA_SESSIONS = "sessions";
 
     private static final int MAX_TEMP_SERVICE_DURATION_MS = 1_000 * 60 * 2; // 2 minutes
 
-    @GuardedBy("mLock")
-    private ActivityManagerInternal mAm;
-
     private final LocalService mLocalService = new LocalService();
 
     private final LocalLog mRequestsHistory = new LocalLog(20);
 
+    @GuardedBy("mLock")
+    private ActivityManagerInternal mAm;
+
+    /**
+     * Users disabled by {@link android.provider.Settings.Secure#CONTENT_CAPTURE_ENABLED}.
+     */
+    @GuardedBy("mLock")
+    @Nullable
+    private SparseBooleanArray mDisabledUsers;
+
+
     public ContentCaptureManagerService(@NonNull Context context) {
         super(context, new FrameworkResourcesServiceNameResolver(context,
                 com.android.internal.R.string.config_defaultContentCaptureService),
                 UserManager.DISALLOW_CONTENT_CAPTURE);
+        // Sets which serviecs are disabled
+        final UserManager um = getContext().getSystemService(UserManager.class);
+        final List<UserInfo> users = um.getUsers();
+        for (int i = 0; i < users.size(); i++) {
+            final int userId = users.get(i).id;
+            final boolean disabled = isDisabledBySettings(userId);
+            if (disabled) {
+                Slog.i(mTag, "user " + userId + " disabled by settings");
+                if (mDisabledUsers == null) {
+                    mDisabledUsers = new SparseBooleanArray(1);
+                }
+                mDisabledUsers.put(userId, true);
+            }
+        }
     }
 
     @Override // from AbstractMasterSystemService
@@ -100,7 +131,7 @@
 
     @Override // from AbstractMasterSystemService
     protected void enforceCallingPermissionForManagement() {
-        getContext().enforceCallingPermission(MANAGE_CONTENT_CAPTURE, TAG);
+        getContext().enforceCallingPermission(MANAGE_CONTENT_CAPTURE, mTag);
     }
 
     @Override // from AbstractMasterSystemService
@@ -108,9 +139,86 @@
         return MAX_TEMP_SERVICE_DURATION_MS;
     }
 
+    @Override // from AbstractMasterSystemService
+    protected void registerForExtraSettingsChanges(@NonNull ContentResolver resolver,
+            @NonNull ContentObserver observer) {
+        resolver.registerContentObserver(Settings.Secure.getUriFor(
+                Settings.Secure.CONTENT_CAPTURE_ENABLED), false, observer,
+                UserHandle.USER_ALL);
+    }
+
+    @Override // from AbstractMasterSystemService
+    protected void onSettingsChanged(@UserIdInt int userId, @NonNull String property) {
+        switch (property) {
+            case Settings.Secure.CONTENT_CAPTURE_ENABLED:
+                setContentCaptureFeatureEnabledFromSettings(userId);
+                return;
+            default:
+                Slog.w(mTag, "Unexpected property (" + property + "); updating cache instead");
+        }
+    }
+
+    @Override // from AbstractMasterSystemService
+    protected boolean isDisabledLocked(@UserIdInt int userId) {
+        return isDisabledBySettingsLocked(userId) || super.isDisabledLocked(userId);
+    }
+
+    private boolean isDisabledBySettingsLocked(@UserIdInt int userId) {
+        return mDisabledUsers != null && mDisabledUsers.get(userId);
+    }
+
+    private void setContentCaptureFeatureEnabledFromSettings(@UserIdInt int userId) {
+        setContentCaptureFeatureEnabledForUser(userId, !isDisabledBySettings(userId));
+    }
+
+    private boolean isDisabledBySettings(@UserIdInt int userId) {
+        final String property = Settings.Secure.CONTENT_CAPTURE_ENABLED;
+        final String value = Settings.Secure.getStringForUser(getContext().getContentResolver(),
+                property, userId);
+        if (value == null) {
+            if (verbose) {
+                Slog.v(mTag, "isDisabledBySettings(): assuming false as '" + property
+                        + "' is not set");
+            }
+            return false;
+        }
+
+        try {
+            return !Boolean.valueOf(value);
+        } catch (Exception e) {
+            Slog.w(mTag, "Invalid value for property " + property + ": " + value);
+        }
+        return false;
+    }
+
+    private void setContentCaptureFeatureEnabledForUser(@UserIdInt int userId, boolean enabled) {
+        synchronized (mLock) {
+            if (mDisabledUsers == null) {
+                mDisabledUsers = new SparseBooleanArray();
+            }
+            final boolean alreadyEnabled = !mDisabledUsers.get(userId);
+            if (!(enabled ^ alreadyEnabled)) {
+                if (debug) {
+                    Slog.d(mTag, "setContentCaptureFeatureEnabledForUser(): already " + enabled);
+                }
+                return;
+            }
+            if (enabled) {
+                Slog.i(mTag, "setContentCaptureFeatureEnabled(): enabling service for user "
+                        + userId);
+                mDisabledUsers.delete(userId);
+            } else {
+                Slog.i(mTag, "setContentCaptureFeatureEnabled(): disabling service for user "
+                        + userId);
+                mDisabledUsers.put(userId, true);
+            }
+            updateCachedServiceLocked(userId, !enabled);
+        }
+    }
+
     // Called by Shell command.
     void destroySessions(@UserIdInt int userId, @NonNull IResultReceiver receiver) {
-        Slog.i(TAG, "destroySessions() for userId " + userId);
+        Slog.i(mTag, "destroySessions() for userId " + userId);
         enforceCallingPermissionForManagement();
 
         synchronized (mLock) {
@@ -133,7 +241,7 @@
 
     // Called by Shell command.
     void listSessions(int userId, IResultReceiver receiver) {
-        Slog.i(TAG, "listSessions() for userId " + userId);
+        Slog.i(mTag, "listSessions() for userId " + userId);
         enforceCallingPermissionForManagement();
 
         final Bundle resultData = new Bundle();
@@ -174,6 +282,64 @@
         return mAm;
     }
 
+    @GuardedBy("mLock")
+    private boolean assertCalledByServiceLocked(@NonNull String methodName, @UserIdInt int userId,
+            int callingUid, @NonNull IResultReceiver result) {
+        final boolean isService = isCalledByServiceLocked(methodName, userId, callingUid);
+        if (isService) return true;
+
+        try {
+            result.send(ContentCaptureManager.RESULT_CODE_NOT_SERVICE,
+                    /* resultData= */ null);
+        } catch (RemoteException e) {
+            Slog.w(mTag, "Unable to send isContentCaptureFeatureEnabled(): " + e);
+        }
+        return false;
+    }
+
+    @GuardedBy("mLock")
+    private boolean isCalledByServiceLocked(@NonNull String methodName, @UserIdInt int userId,
+            int callingUid) {
+
+        final String serviceName = mServiceNameResolver.getServiceName(userId);
+        if (serviceName == null) {
+            Slog.e(mTag, methodName + ": called by UID " + callingUid
+                    + ", but there's no service set for user " + userId);
+            return false;
+        }
+
+        final ComponentName serviceComponent  = ComponentName.unflattenFromString(serviceName);
+        if (serviceComponent == null) {
+            Slog.w(mTag, methodName + ": invalid service name: " + serviceName);
+            return false;
+        }
+
+        final String servicePackageName = serviceComponent.getPackageName();
+
+        final PackageManager pm = getContext().getPackageManager();
+        final int serviceUid;
+        try {
+            serviceUid = pm.getPackageUidAsUser(servicePackageName, UserHandle.getCallingUserId());
+        } catch (NameNotFoundException e) {
+            Slog.w(mTag, methodName + ": could not verify UID for " + serviceName);
+            return false;
+        }
+        if (callingUid != serviceUid) {
+            Slog.e(mTag, methodName + ": called by UID " + callingUid + ", but service UID is "
+                    + serviceUid);
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override // from AbstractMasterSystemService
+    protected void dumpLocked(String prefix, PrintWriter pw) {
+        super.dumpLocked(prefix, pw);
+
+        pw.print(prefix); pw.print("Disabled users: "); pw.println(mDisabledUsers);
+    }
+
     final class ContentCaptureManagerServiceStub extends IContentCaptureManager.Stub {
 
         @Override
@@ -181,21 +347,16 @@
                 @NonNull ComponentName componentName, @NonNull String sessionId, int flags,
                 @NonNull IResultReceiver result) {
             Preconditions.checkNotNull(activityToken);
-            Preconditions.checkNotNull(componentName);
             Preconditions.checkNotNull(sessionId);
             final int userId = UserHandle.getCallingUserId();
 
-            // TODO(b/111276913): refactor getTaskIdForActivity() to also return ComponentName,
-            // so we don't pass it on startSession (same for Autofill)
-            final int taskId = getAmInternal().getTaskIdForActivity(activityToken, false);
-
-            // TODO(b/121260224): get from AM as well
-            final int displayId = 0;
+            final ActivityPresentationInfo activityPresentationInfo = getAmInternal()
+                    .getActivityPresentationInfo(activityToken);
 
             synchronized (mLock) {
                 final ContentCapturePerUserService service = getServiceForUserLocked(userId);
-                service.startSessionLocked(activityToken, componentName, taskId, displayId,
-                        sessionId, Binder.getCallingUid(), flags, result);
+                service.startSessionLocked(activityToken, activityPresentationInfo, sessionId,
+                        Binder.getCallingUid(), flags, result);
             }
         }
 
@@ -222,8 +383,7 @@
                 result.send(/* resultCode= */ 0,
                         SyncResultReceiver.bundleFor(connectedServiceComponentName));
             } catch (RemoteException e) {
-                // Ignore exception as we need to be resilient against app behavior.
-                Slog.w(TAG, "Unable to send service component name: " + e);
+                Slog.w(mTag, "Unable to send service component name: " + e);
             }
         }
 
@@ -238,8 +398,52 @@
         }
 
         @Override
+        public void isContentCaptureFeatureEnabled(@NonNull IResultReceiver result) {
+            final int userId = UserHandle.getCallingUserId();
+            boolean enabled;
+            synchronized (mLock) {
+                final boolean isService = assertCalledByServiceLocked(
+                        "isContentCaptureFeatureEnabled()", userId, Binder.getCallingUid(), result);
+                if (!isService) return;
+
+                enabled = !isDisabledBySettingsLocked(userId);
+            }
+            try {
+                result.send(enabled ? ContentCaptureManager.RESULT_CODE_TRUE
+                        : ContentCaptureManager.RESULT_CODE_FALSE, /* resultData= */null);
+            } catch (RemoteException e) {
+                Slog.w(mTag, "Unable to send isContentCaptureFeatureEnabled(): " + e);
+            }
+        }
+
+        @Override
+        public void setContentCaptureFeatureEnabled(boolean enabled,
+                @NonNull IResultReceiver result) {
+            final int userId = UserHandle.getCallingUserId();
+            final boolean isService;
+            synchronized (mLock) {
+                isService = assertCalledByServiceLocked("setContentCaptureFeatureEnabled()", userId,
+                        Binder.getCallingUid(), result);
+            }
+            if (!isService) return;
+
+            final long token = Binder.clearCallingIdentity();
+            try {
+                Settings.Secure.putStringForUser(getContext().getContentResolver(),
+                        Settings.Secure.CONTENT_CAPTURE_ENABLED, Boolean.toString(enabled), userId);
+            } finally {
+                Binder.restoreCallingIdentity(token);
+            }
+            try {
+                result.send(ContentCaptureManager.RESULT_CODE_TRUE, /* resultData= */null);
+            } catch (RemoteException e) {
+                Slog.w(mTag, "Unable to send setContentCaptureFeatureEnabled(): " + e);
+            }
+        }
+
+        @Override
         public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
-            if (!DumpUtils.checkDumpPermission(getContext(), TAG, pw)) return;
+            if (!DumpUtils.checkDumpPermission(getContext(), mTag, pw)) return;
 
             boolean showHistory = true;
             if (args != null) {
@@ -252,7 +456,7 @@
                             pw.println("Usage: dumpsys content_capture [--no-history]");
                             return;
                         default:
-                            Slog.w(TAG, "Ignoring invalid dump arg: " + arg);
+                            Slog.w(mTag, "Ignoring invalid dump arg: " + arg);
                     }
                 }
             }
diff --git a/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java b/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java
index bc0e19a..c8a27f1 100644
--- a/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java
+++ b/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java
@@ -19,6 +19,7 @@
 import static android.service.contentcapture.ContentCaptureService.setClientState;
 import static android.view.contentcapture.ContentCaptureSession.STATE_DISABLED;
 import static android.view.contentcapture.ContentCaptureSession.STATE_DUPLICATED_ID;
+import static android.view.contentcapture.ContentCaptureSession.STATE_INTERNAL_ERROR;
 import static android.view.contentcapture.ContentCaptureSession.STATE_NO_SERVICE;
 
 import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_CONTENT;
@@ -33,6 +34,7 @@
 import android.app.assist.AssistContent;
 import android.app.assist.AssistStructure;
 import android.content.ComponentName;
+import android.content.pm.ActivityPresentationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.pm.ServiceInfo;
@@ -171,10 +173,18 @@
     // TODO(b/119613670): log metrics
     @GuardedBy("mLock")
     public void startSessionLocked(@NonNull IBinder activityToken,
-            @NonNull ComponentName componentName, int taskId, int displayId,
+            @NonNull ActivityPresentationInfo activityPresentationInfo,
             @NonNull String sessionId, int uid, int flags,
             @NonNull IResultReceiver clientReceiver) {
-
+        if (activityPresentationInfo == null) {
+            Slog.w(TAG, "basic activity info is null");
+            setClientState(clientReceiver, STATE_DISABLED | STATE_INTERNAL_ERROR,
+                    /* binder= */ null);
+            return;
+        }
+        final int taskId = activityPresentationInfo.taskId;
+        final int displayId = activityPresentationInfo.displayId;
+        final ComponentName componentName = activityPresentationInfo.componentName;
         final ComponentName serviceComponentName = getServiceComponentName();
         final boolean enabled = isEnabledLocked();
         final String historyItem =
diff --git a/services/core/Android.bp b/services/core/Android.bp
index 4408db8..f9de554 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -8,6 +8,7 @@
             "frameworks/native/cmds/dumpstate/binder",
             "system/core/storaged/binder",
             "system/vold/binder",
+            "system/gsid/aidl",
         ],
     },
     srcs: [
@@ -17,6 +18,7 @@
         ":installd_aidl",
         ":storaged_aidl",
         ":vold_aidl",
+        ":gsiservice_aidl",
         ":mediaupdateservice_aidl",
         "java/com/android/server/EventLogTags.logtags",
         "java/com/android/server/am/EventLogTags.logtags",
@@ -48,7 +50,7 @@
         "android.hardware.vibrator-V1.0-java",
         "android.hardware.configstore-V1.0-java",
         "android.hardware.contexthub-V1.0-java",
-        "android.hidl.manager-V1.0-java",
+        "android.hidl.manager-V1.2-java",
         "netd_aidl_interface-java",
         "netd_event_listener_interface-java",
     ],
diff --git a/services/core/java/com/android/server/AlarmManagerInternal.java b/services/core/java/com/android/server/AlarmManagerInternal.java
index dbff957..2756610 100644
--- a/services/core/java/com/android/server/AlarmManagerInternal.java
+++ b/services/core/java/com/android/server/AlarmManagerInternal.java
@@ -17,5 +17,15 @@
 package com.android.server;
 
 public interface AlarmManagerInternal {
-    void removeAlarmsForUid(int uid);
+    // Some other components in the system server need to know about
+    // broadcast alarms currently in flight
+    public interface InFlightListener {
+        /** There is now an alarm pending delivery to the given app */
+        void broadcastAlarmPending(int recipientUid);
+        /** A broadcast alarm targeted to the given app has completed delivery */
+        void broadcastAlarmComplete(int recipientUid);
+    }
+
+    public void removeAlarmsForUid(int uid);
+    public void registerInFlightListener(InFlightListener callback);
 }
diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java
index e3dcb7d..10b5327 100644
--- a/services/core/java/com/android/server/AlarmManagerService.java
+++ b/services/core/java/com/android/server/AlarmManagerService.java
@@ -197,6 +197,8 @@
     PowerManager.WakeLock mWakeLock;
     ArrayList<Alarm> mPendingNonWakeupAlarms = new ArrayList<>();
     ArrayList<InFlight> mInFlight = new ArrayList<>();
+    private final ArrayList<AlarmManagerInternal.InFlightListener> mInFlightListeners =
+            new ArrayList<>();
     AlarmHandler mHandler;
     AppWakeupHistory mAppWakeupHistory;
     ClockReceiver mClockReceiver;
@@ -1315,6 +1317,10 @@
             mAlarmType = alarm.type;
         }
 
+        boolean isBroadcast() {
+            return mPendingIntent != null && mPendingIntent.isBroadcast();
+        }
+
         @Override
         public String toString() {
             return "InFlight{"
@@ -1354,6 +1360,20 @@
         }
     }
 
+    private void notifyBroadcastAlarmPendingLocked(int uid) {
+        final int numListeners = mInFlightListeners.size();
+        for (int i = 0; i < numListeners; i++) {
+            mInFlightListeners.get(i).broadcastAlarmPending(uid);
+        }
+    }
+
+    private void notifyBroadcastAlarmCompleteLocked(int uid) {
+        final int numListeners = mInFlightListeners.size();
+        for (int i = 0; i < numListeners; i++) {
+            mInFlightListeners.get(i).broadcastAlarmComplete(uid);
+        }
+    }
+
     static final class FilterStats {
         final BroadcastStats mBroadcastStats;
         final String mTag;
@@ -1976,6 +1996,13 @@
                 removeLocked(uid);
             }
         }
+
+        @Override
+        public void registerInFlightListener(InFlightListener callback) {
+            synchronized (mLock) {
+                mInFlightListeners.add(callback);
+            }
+        }
     }
 
     /**
@@ -4426,7 +4453,11 @@
 
         private InFlight removeLocked(PendingIntent pi, Intent intent) {
             for (int i = 0; i < mInFlight.size(); i++) {
-                if (mInFlight.get(i).mPendingIntent == pi) {
+                final InFlight inflight = mInFlight.get(i);
+                if (inflight.mPendingIntent == pi) {
+                    if (pi.isBroadcast()) {
+                        notifyBroadcastAlarmCompleteLocked(inflight.mUid);
+                    }
                     return mInFlight.remove(i);
                 }
             }
@@ -4649,6 +4680,9 @@
             final InFlight inflight = new InFlight(AlarmManagerService.this, alarm, nowELAPSED);
             mInFlight.add(inflight);
             mBroadcastRefCount++;
+            if (inflight.isBroadcast()) {
+                notifyBroadcastAlarmPendingLocked(alarm.uid);
+            }
             if (allowWhileIdle) {
                 // Record the last time this uid handled an ALLOW_WHILE_IDLE alarm.
                 mLastAllowWhileIdleDispatch.put(alarm.creatorUid, nowELAPSED);
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 14e2354..f807543 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -40,6 +40,7 @@
 import static android.net.NetworkPolicyManager.uidRulesToString;
 import static android.net.NetworkStack.NETWORKSTACK_PACKAGE_NAME;
 import static android.net.shared.NetworkMonitorUtils.isValidationRequired;
+import static android.net.shared.NetworkParcelableUtil.toStableParcelable;
 import static android.os.Process.INVALID_UID;
 import static android.system.OsConstants.IPPROTO_TCP;
 import static android.system.OsConstants.IPPROTO_UDP;
@@ -78,6 +79,7 @@
 import android.net.NetworkAgent;
 import android.net.NetworkCapabilities;
 import android.net.NetworkConfig;
+import android.net.NetworkFactory;
 import android.net.NetworkInfo;
 import android.net.NetworkInfo.DetailedState;
 import android.net.NetworkMisc;
@@ -98,10 +100,10 @@
 import android.net.metrics.IpConnectivityLog;
 import android.net.metrics.NetworkEvent;
 import android.net.netlink.InetDiagMessage;
-import android.net.shared.NetdService;
 import android.net.shared.NetworkMonitorUtils;
 import android.net.shared.PrivateDnsConfig;
 import android.net.util.MultinetworkPolicyTracker;
+import android.net.util.NetdService;
 import android.os.Binder;
 import android.os.Build;
 import android.os.Bundle;
@@ -144,6 +146,7 @@
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.app.IBatteryStats;
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.net.LegacyVpnInfo;
 import com.android.internal.net.VpnConfig;
 import com.android.internal.net.VpnInfo;
@@ -1884,6 +1887,12 @@
                 "ConnectivityService");
     }
 
+    private void enforceControlAlwaysOnVpnPermission() {
+        mContext.enforceCallingOrSelfPermission(
+                android.Manifest.permission.CONTROL_ALWAYS_ON_VPN,
+                "ConnectivityService");
+    }
+
     private void enforceNetworkStackSettingsOrSetup() {
         enforceAnyPermissionOf(
             android.Manifest.permission.NETWORK_SETTINGS,
@@ -1891,6 +1900,12 @@
             android.Manifest.permission.NETWORK_STACK);
     }
 
+    private void enforceNetworkStackPermission() {
+        mContext.enforceCallingOrSelfPermission(
+                android.Manifest.permission.NETWORK_STACK,
+                "ConnectivityService");
+    }
+
     private boolean checkNetworkStackPermission() {
         return PERMISSION_GRANTED == mContext.checkCallingOrSelfPermission(
                 android.Manifest.permission.NETWORK_STACK);
@@ -2671,6 +2686,11 @@
                     EVENT_PROVISIONING_NOTIFICATION, PROVISIONING_NOTIFICATION_HIDE,
                     mNai.network.netId));
         }
+
+        @Override
+        public void logCaptivePortalLoginEvent(int eventId, String packageName) {
+            new MetricsLogger().action(eventId, packageName);
+        }
     }
 
     private boolean networkRequiresValidation(NetworkAgentInfo nai) {
@@ -2760,8 +2780,17 @@
                 for (NetworkRequestInfo nri : mNetworkRequests.values()) {
                     if (nri.request.isListen()) continue;
                     NetworkAgentInfo nai = getNetworkForRequest(nri.request.requestId);
-                    ac.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK,
-                            (nai != null ? nai.getCurrentScore() : 0), 0, nri.request);
+                    final int score;
+                    final int serial;
+                    if (nai != null) {
+                        score = nai.getCurrentScore();
+                        serial = nai.factorySerialNumber;
+                    } else {
+                        score = 0;
+                        serial = NetworkFactory.SerialNumber.NONE;
+                    }
+                    ac.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK, score, serial,
+                            nri.request);
                 }
             } else {
                 loge("Error connecting NetworkFactory");
@@ -2858,7 +2887,7 @@
             NetworkAgentInfo currentNetwork = getNetworkForRequest(request.requestId);
             if (currentNetwork != null && currentNetwork.network.netId == nai.network.netId) {
                 clearNetworkForRequest(request.requestId);
-                sendUpdatedScoreToFactories(request, 0);
+                sendUpdatedScoreToFactories(request, null);
             }
         }
         nai.clearLingerState();
@@ -2934,7 +2963,7 @@
         }
         rematchAllNetworksAndRequests(null, 0);
         if (nri.request.isRequest() && getNetworkForRequest(nri.request.requestId) == null) {
-            sendUpdatedScoreToFactories(nri.request, 0);
+            sendUpdatedScoreToFactories(nri.request, null);
         }
     }
 
@@ -3624,6 +3653,20 @@
         mTethering.stopTethering(type);
     }
 
+    /**
+     * Get the latest value of the tethering entitlement check.
+     *
+     * Note: Allow privileged apps who have TETHER_PRIVILEGED permission to access. If it turns
+     * out some such apps are observed to abuse this API, change to per-UID limits on this API
+     * if it's really needed.
+     */
+    @Override
+    public void getLatestTetheringEntitlementValue(int type, ResultReceiver receiver,
+            boolean showEntitlementUi, String callerPkg) {
+        ConnectivityManager.enforceTetherChangePermission(mContext, callerPkg);
+        mTethering.getLatestTetheringEntitlementValue(type, receiver, showEntitlementUi);
+    }
+
     // Called when we lose the default network and have no replacement yet.
     // This will automatically be cleared after X seconds or a new default network
     // becomes CONNECTED, whichever happens first.  The timer is started by the
@@ -4147,8 +4190,9 @@
     }
 
     @Override
-    public boolean setAlwaysOnVpnPackage(int userId, String packageName, boolean lockdown) {
-        enforceConnectivityInternalPermission();
+    public boolean setAlwaysOnVpnPackage(
+            int userId, String packageName, boolean lockdown, List<String> lockdownWhitelist) {
+        enforceControlAlwaysOnVpnPermission();
         enforceCrossUserPermission(userId);
 
         synchronized (mVpns) {
@@ -4162,11 +4206,11 @@
                 Slog.w(TAG, "User " + userId + " has no Vpn configuration");
                 return false;
             }
-            if (!vpn.setAlwaysOnPackage(packageName, lockdown)) {
+            if (!vpn.setAlwaysOnPackage(packageName, lockdown, lockdownWhitelist)) {
                 return false;
             }
             if (!startAlwaysOnVpn(userId)) {
-                vpn.setAlwaysOnPackage(null, false);
+                vpn.setAlwaysOnPackage(null, false, null);
                 return false;
             }
         }
@@ -4175,7 +4219,7 @@
 
     @Override
     public String getAlwaysOnVpnPackage(int userId) {
-        enforceConnectivityInternalPermission();
+        enforceControlAlwaysOnVpnPermission();
         enforceCrossUserPermission(userId);
 
         synchronized (mVpns) {
@@ -4189,6 +4233,36 @@
     }
 
     @Override
+    public boolean isVpnLockdownEnabled(int userId) {
+        enforceControlAlwaysOnVpnPermission();
+        enforceCrossUserPermission(userId);
+
+        synchronized (mVpns) {
+            Vpn vpn = mVpns.get(userId);
+            if (vpn == null) {
+                Slog.w(TAG, "User " + userId + " has no Vpn configuration");
+                return false;
+            }
+            return vpn.getLockdown();
+        }
+    }
+
+    @Override
+    public List<String> getVpnLockdownWhitelist(int userId) {
+        enforceControlAlwaysOnVpnPermission();
+        enforceCrossUserPermission(userId);
+
+        synchronized (mVpns) {
+            Vpn vpn = mVpns.get(userId);
+            if (vpn == null) {
+                Slog.w(TAG, "User " + userId + " has no Vpn configuration");
+                return null;
+            }
+            return vpn.getLockdownWhitelist();
+        }
+    }
+
+    @Override
     public int checkMobileProvisioning(int suggestedTimeOutMs) {
         // TODO: Remove?  Any reason to trigger a provisioning check?
         return -1;
@@ -4417,7 +4491,7 @@
             if (TextUtils.equals(vpn.getAlwaysOnPackage(), packageName) && !isReplacing) {
                 Slog.d(TAG, "Removing always-on VPN package " + packageName + " for user "
                         + userId);
-                vpn.setAlwaysOnPackage(null, false);
+                vpn.setAlwaysOnPackage(null, false, null);
             }
         }
     }
@@ -4488,11 +4562,14 @@
         public final String name;
         public final Messenger messenger;
         public final AsyncChannel asyncChannel;
+        public final int factorySerialNumber;
 
-        public NetworkFactoryInfo(String name, Messenger messenger, AsyncChannel asyncChannel) {
+        NetworkFactoryInfo(String name, Messenger messenger, AsyncChannel asyncChannel,
+                int factorySerialNumber) {
             this.name = name;
             this.messenger = messenger;
             this.asyncChannel = asyncChannel;
+            this.factorySerialNumber = factorySerialNumber;
         }
     }
 
@@ -4853,10 +4930,12 @@
     }
 
     @Override
-    public void registerNetworkFactory(Messenger messenger, String name) {
+    public int registerNetworkFactory(Messenger messenger, String name) {
         enforceConnectivityInternalPermission();
-        NetworkFactoryInfo nfi = new NetworkFactoryInfo(name, messenger, new AsyncChannel());
+        NetworkFactoryInfo nfi = new NetworkFactoryInfo(name, messenger, new AsyncChannel(),
+                NetworkFactory.SerialNumber.nextSerialNumber());
         mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_FACTORY, nfi));
+        return nfi.factorySerialNumber;
     }
 
     private void handleRegisterNetworkFactory(NetworkFactoryInfo nfi) {
@@ -4948,9 +5027,35 @@
         return nri.request.requestId == mDefaultRequest.requestId;
     }
 
+    // TODO : remove this method. It's a stopgap measure to help sheperding a number of dependent
+    // changes that would conflict throughout the automerger graph. Having this method temporarily
+    // helps with the process of going through with all these dependent changes across the entire
+    // tree.
     public int registerNetworkAgent(Messenger messenger, NetworkInfo networkInfo,
             LinkProperties linkProperties, NetworkCapabilities networkCapabilities,
             int currentScore, NetworkMisc networkMisc) {
+        return registerNetworkAgent(messenger, networkInfo, linkProperties, networkCapabilities,
+                currentScore, networkMisc, NetworkFactory.SerialNumber.NONE);
+    }
+
+    /**
+     * Register a new agent with ConnectivityService to handle a network.
+     *
+     * @param messenger a messenger for ConnectivityService to contact the agent asynchronously.
+     * @param networkInfo the initial info associated with this network. It can be updated later :
+     *         see {@link #updateNetworkInfo}.
+     * @param linkProperties the initial link properties of this network. They can be updated
+     *         later : see {@link #updateLinkProperties}.
+     * @param networkCapabilities the initial capabilites of this network. They can be updated
+     *         later : see {@link #updateNetworkCapabilities}.
+     * @param currentScore the initial score of the network. See
+     *         {@link NetworkAgentInfo#getCurrentScore}.
+     * @param networkMisc metadata about the network. This is never updated.
+     * @param factorySerialNumber the serial number of the factory owning this NetworkAgent.
+     */
+    public int registerNetworkAgent(Messenger messenger, NetworkInfo networkInfo,
+            LinkProperties linkProperties, NetworkCapabilities networkCapabilities,
+            int currentScore, NetworkMisc networkMisc, int factorySerialNumber) {
         enforceConnectivityInternalPermission();
 
         LinkProperties lp = new LinkProperties(linkProperties);
@@ -4960,7 +5065,8 @@
         final NetworkCapabilities nc = new NetworkCapabilities(networkCapabilities);
         final NetworkAgentInfo nai = new NetworkAgentInfo(messenger, new AsyncChannel(),
                 new Network(reserveNetId()), new NetworkInfo(networkInfo), lp, nc, currentScore,
-                mContext, mTrackerHandler, new NetworkMisc(networkMisc), this, mNetd, mNMS);
+                mContext, mTrackerHandler, new NetworkMisc(networkMisc), this, mNetd, mNMS,
+                factorySerialNumber);
         // Make sure the network capabilities reflect what the agent info says.
         nai.networkCapabilities = mixInCapabilities(nai, nc);
         final String extraInfo = networkInfo.getExtraInfo();
@@ -4969,8 +5075,8 @@
         if (DBG) log("registerNetworkAgent " + nai);
         final long token = Binder.clearCallingIdentity();
         try {
-            mContext.getSystemService(NetworkStack.class)
-                    .makeNetworkMonitor(nai.network, name, new NetworkMonitorCallbacks(nai));
+            mContext.getSystemService(NetworkStack.class).makeNetworkMonitor(
+                    toStableParcelable(nai.network), name, new NetworkMonitorCallbacks(nai));
         } finally {
             Binder.restoreCallingIdentity(token);
         }
@@ -5376,17 +5482,23 @@
             NetworkRequest nr = nai.requestAt(i);
             // Don't send listening requests to factories. b/17393458
             if (nr.isListen()) continue;
-            sendUpdatedScoreToFactories(nr, nai.getCurrentScore());
+            sendUpdatedScoreToFactories(nr, nai);
         }
     }
 
-    private void sendUpdatedScoreToFactories(NetworkRequest networkRequest, int score) {
+    private void sendUpdatedScoreToFactories(NetworkRequest networkRequest, NetworkAgentInfo nai) {
+        int score = 0;
+        int serial = 0;
+        if (nai != null) {
+            score = nai.getCurrentScore();
+            serial = nai.factorySerialNumber;
+        }
         if (VDBG || DDBG){
             log("sending new Min Network Score(" + score + "): " + networkRequest.toString());
         }
         for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) {
-            nfi.asyncChannel.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK, score, 0,
-                    networkRequest);
+            nfi.asyncChannel.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK, score,
+                    serial, networkRequest);
         }
     }
 
@@ -5662,7 +5774,7 @@
                     // TODO - this could get expensive if we have a lot of requests for this
                     // network.  Think about if there is a way to reduce this.  Push
                     // netid->request mapping to each factory?
-                    sendUpdatedScoreToFactories(nri.request, score);
+                    sendUpdatedScoreToFactories(nri.request, newNetwork);
                     if (isDefaultRequest(nri)) {
                         isNewDefault = true;
                         oldDefaultNetwork = currentNetwork;
@@ -5686,7 +5798,7 @@
                 newNetwork.removeRequest(nri.request.requestId);
                 if (currentNetwork == newNetwork) {
                     clearNetworkForRequest(nri.request.requestId);
-                    sendUpdatedScoreToFactories(nri.request, 0);
+                    sendUpdatedScoreToFactories(nri.request, null);
                 } else {
                     Slog.wtf(TAG, "BUG: Removing request " + nri.request.requestId + " from " +
                             newNetwork.name() +
@@ -6297,7 +6409,7 @@
             synchronized (mVpns) {
                 final String alwaysOnPackage = getAlwaysOnVpnPackage(userId);
                 if (alwaysOnPackage != null) {
-                    setAlwaysOnVpnPackage(userId, null, false);
+                    setAlwaysOnVpnPackage(userId, null, false, null);
                     setVpnPackageAuthorization(alwaysOnPackage, userId, false);
                 }
 
diff --git a/services/core/java/com/android/server/DynamicAndroidService.java b/services/core/java/com/android/server/DynamicAndroidService.java
new file mode 100644
index 0000000..12a3f02
--- /dev/null
+++ b/services/core/java/com/android/server/DynamicAndroidService.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.gsi.GsiProgress;
+import android.gsi.IGsiService;
+import android.os.IBinder;
+import android.os.IBinder.DeathRecipient;
+import android.os.IDynamicAndroidService;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.util.Slog;
+
+/**
+ * DynamicAndroidService implements IDynamicAndroidService. It provides permission check before
+ * passing requests to gsid
+ */
+public class DynamicAndroidService extends IDynamicAndroidService.Stub implements DeathRecipient {
+    private static final String TAG = "DynamicAndroidService";
+    private static final String NO_SERVICE_ERROR = "no gsiservice";
+
+    private Context mContext;
+    private volatile IGsiService mGsiService;
+
+    DynamicAndroidService(Context context) {
+        mContext = context;
+    }
+
+    private static IGsiService connect(DeathRecipient recipient) throws RemoteException {
+        IBinder binder = ServiceManager.getService("gsiservice");
+        if (binder == null) {
+            throw new RemoteException(NO_SERVICE_ERROR);
+        }
+        /**
+         * The init will restart gsiservice if it crashed and the proxy object will need to be
+         * re-initialized in this case.
+         */
+        binder.linkToDeath(recipient, 0);
+        return IGsiService.Stub.asInterface(binder);
+    }
+
+    /** implements DeathRecipient */
+    @Override
+    public void binderDied() {
+        Slog.w(TAG, "gsiservice died; reconnecting");
+        synchronized (this) {
+            mGsiService = null;
+        }
+    }
+
+    private IGsiService getGsiService() throws RemoteException {
+        checkPermission();
+        synchronized (this) {
+            if (mGsiService == null) {
+                mGsiService = connect(this);
+            }
+            return mGsiService;
+        }
+    }
+
+    private void checkPermission() {
+        if (mContext.checkCallingOrSelfPermission(
+                        android.Manifest.permission.MANAGE_DYNAMIC_ANDROID)
+                != PackageManager.PERMISSION_GRANTED) {
+            throw new SecurityException("Requires MANAGE_DYNAMIC_ANDROID permission");
+        }
+    }
+
+    @Override
+    public boolean startInstallation(long systemSize, long userdataSize) throws RemoteException {
+        return getGsiService().startGsiInstall(systemSize, userdataSize, true) == 0;
+    }
+
+    @Override
+    public GsiProgress getInstallationProgress() throws RemoteException {
+        return getGsiService().getInstallProgress();
+    }
+
+    @Override
+    public boolean abort() throws RemoteException {
+        return getGsiService().cancelGsiInstall();
+    }
+
+    @Override
+    public boolean isInUse() throws RemoteException {
+        return getGsiService().isGsiRunning();
+    }
+
+    @Override
+    public boolean isInstalled() throws RemoteException {
+        return getGsiService().isGsiInstalled();
+    }
+
+    @Override
+    public boolean remove() throws RemoteException {
+        return getGsiService().removeGsiInstall();
+    }
+
+    @Override
+    public boolean toggle() throws RemoteException {
+        IGsiService gsiService = getGsiService();
+        if (gsiService.isGsiRunning()) {
+            return gsiService.disableGsiInstall();
+        } else {
+            return gsiService.setGsiBootable() == 0;
+        }
+    }
+
+    @Override
+    public boolean write(byte[] buf) throws RemoteException {
+        return getGsiService().commitGsiChunkFromMemory(buf);
+    }
+
+    @Override
+    public boolean commit() throws RemoteException {
+        return getGsiService().setGsiBootable() == 0;
+    }
+}
diff --git a/services/core/java/com/android/server/EventLogTags.logtags b/services/core/java/com/android/server/EventLogTags.logtags
index d869734..0ed5beb 100644
--- a/services/core/java/com/android/server/EventLogTags.logtags
+++ b/services/core/java/com/android/server/EventLogTags.logtags
@@ -33,7 +33,7 @@
 # It logs the time remaining before the device would've normally gone to sleep without the request.
 2731 power_soft_sleep_requested (savedwaketimems|2)
 # Power save state has changed. See BatterySaverController.java for the details.
-2739 battery_saver_mode (prevOffOrOn|1|5),(nowOffOrOn|1|5),(interactive|1|5),(features|3|5),(reason|1|5)
+2739 battery_saver_mode (fullPrevOffOrOn|1|5),(adaptivePrevOffOrOn|1|5),(fullNowOffOrOn|1|5),(adaptiveNowOffOrOn|1|5),(interactive|1|5),(features|3|5),(reason|1|5)
 27390 battery_saving_stats (batterySaver|1|5),(interactive|1|5),(doze|1|5),(delta_duration|2|3),(delta_battery_drain|1|1),(delta_battery_drain_percent|1|6),(total_duration|2|3),(total_battery_drain|1|1),(total_battery_drain_percent|1|6)
 # Note when the user activity timeout has been overriden by ActivityManagerService
 27391 user_activity_timeout_override (override|2|3)
diff --git a/services/core/java/com/android/server/IpSecService.java b/services/core/java/com/android/server/IpSecService.java
index 371276f..126bf65 100644
--- a/services/core/java/com/android/server/IpSecService.java
+++ b/services/core/java/com/android/server/IpSecService.java
@@ -44,7 +44,7 @@
 import android.net.Network;
 import android.net.NetworkUtils;
 import android.net.TrafficStats;
-import android.net.shared.NetdService;
+import android.net.util.NetdService;
 import android.os.Binder;
 import android.os.IBinder;
 import android.os.ParcelFileDescriptor;
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index d2c6354..33c6dd2 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -405,6 +405,7 @@
 
         // initialize in-memory settings values
         onBackgroundThrottleWhitelistChangedLocked();
+        onIgnoreSettingsWhitelistChangedLocked();
     }
 
     @GuardedBy("mLock")
@@ -547,17 +548,16 @@
 
     @GuardedBy("mLock")
     private void onBackgroundThrottleWhitelistChangedLocked() {
-        String setting = Settings.Global.getString(
-                mContext.getContentResolver(),
-                Settings.Global.LOCATION_BACKGROUND_THROTTLE_PACKAGE_WHITELIST);
-        if (setting == null) {
-            setting = "";
-        }
-
         mBackgroundThrottlePackageWhitelist.clear();
         mBackgroundThrottlePackageWhitelist.addAll(
                 SystemConfig.getInstance().getAllowUnthrottledLocation());
-        mBackgroundThrottlePackageWhitelist.addAll(Arrays.asList(setting.split(",")));
+
+        String setting = Settings.Global.getString(
+                mContext.getContentResolver(),
+                Settings.Global.LOCATION_BACKGROUND_THROTTLE_PACKAGE_WHITELIST);
+        if (!TextUtils.isEmpty(setting)) {
+            mBackgroundThrottlePackageWhitelist.addAll(Arrays.asList(setting.split(",")));
+        }
 
         for (LocationProvider p : mProviders) {
             applyRequirementsLocked(p);
@@ -566,17 +566,16 @@
 
     @GuardedBy("lock")
     private void onIgnoreSettingsWhitelistChangedLocked() {
-        String setting = Settings.Global.getString(
-                mContext.getContentResolver(),
-                Settings.Global.LOCATION_IGNORE_SETTINGS_PACKAGE_WHITELIST);
-        if (setting == null) {
-            setting = "";
-        }
-
         mIgnoreSettingsPackageWhitelist.clear();
         mIgnoreSettingsPackageWhitelist.addAll(
                 SystemConfig.getInstance().getAllowIgnoreLocationSettings());
-        mIgnoreSettingsPackageWhitelist.addAll(Arrays.asList(setting.split(",")));
+
+        String setting = Settings.Global.getString(
+                mContext.getContentResolver(),
+                Settings.Global.LOCATION_IGNORE_SETTINGS_PACKAGE_WHITELIST);
+        if (!TextUtils.isEmpty(setting)) {
+            mIgnoreSettingsPackageWhitelist.addAll(Arrays.asList(setting.split(",")));
+        }
 
         for (LocationProvider p : mProviders) {
             applyRequirementsLocked(p);
@@ -2200,7 +2199,7 @@
             return false;
         }
 
-        if (mBackgroundThrottlePackageWhitelist.contains(record.mReceiver.mIdentity.mPackageName)) {
+        if (mIgnoreSettingsPackageWhitelist.contains(record.mReceiver.mIdentity.mPackageName)) {
             return true;
         }
 
diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java
index c064453..f505b76 100644
--- a/services/core/java/com/android/server/NetworkManagementService.java
+++ b/services/core/java/com/android/server/NetworkManagementService.java
@@ -47,8 +47,10 @@
 import android.content.Context;
 import android.net.ConnectivityManager;
 import android.net.INetd;
+import android.net.INetdUnsolicitedEventListener;
 import android.net.INetworkManagementEventObserver;
 import android.net.ITetheringStatsProvider;
+import android.net.InetAddresses;
 import android.net.InterfaceConfiguration;
 import android.net.InterfaceConfigurationParcel;
 import android.net.IpPrefix;
@@ -60,8 +62,7 @@
 import android.net.RouteInfo;
 import android.net.TetherStatsParcel;
 import android.net.UidRange;
-import android.net.shared.NetdService;
-import android.net.shared.NetworkObserverRegistry;
+import android.net.util.NetdService;
 import android.os.BatteryStats;
 import android.os.Binder;
 import android.os.Handler;
@@ -206,13 +207,16 @@
 
     private INetd mNetdService;
 
-    private NMSNetworkObserverRegistry mNetworkObserverRegistry;
+    private final NetdUnsolicitedEventListener mNetdUnsolicitedEventListener;
 
     private IBatteryStats mBatteryStats;
 
     private final Thread mThread;
     private CountDownLatch mConnectedSignal = new CountDownLatch(1);
 
+    private final RemoteCallbackList<INetworkManagementEventObserver> mObservers =
+            new RemoteCallbackList<>();
+
     private final NetworkStatsFactory mStatsFactory = new NetworkStatsFactory();
 
     @GuardedBy("mTetheringStatsProviders")
@@ -322,6 +326,8 @@
 
         mDaemonHandler = new Handler(FgThread.get().getLooper());
 
+        mNetdUnsolicitedEventListener = new NetdUnsolicitedEventListener();
+
         // Add ourself to the Watchdog monitors.
         Watchdog.getInstance().addMonitor(this);
 
@@ -340,7 +346,7 @@
         mFgHandler = null;
         mThread = null;
         mServices = null;
-        mNetworkObserverRegistry = null;
+        mNetdUnsolicitedEventListener = null;
     }
 
     static NetworkManagementService create(Context context, String socket, SystemServices services)
@@ -388,12 +394,14 @@
 
     @Override
     public void registerObserver(INetworkManagementEventObserver observer) {
-        mNetworkObserverRegistry.registerObserver(observer);
+        mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
+        mObservers.register(observer);
     }
 
     @Override
     public void unregisterObserver(INetworkManagementEventObserver observer) {
-        mNetworkObserverRegistry.unregisterObserver(observer);
+        mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
+        mObservers.unregister(observer);
     }
 
     @FunctionalInterface
@@ -401,101 +409,127 @@
         public void sendCallback(INetworkManagementEventObserver o) throws RemoteException;
     }
 
-    private class NMSNetworkObserverRegistry extends NetworkObserverRegistry {
-        NMSNetworkObserverRegistry(Context context, Handler handler, INetd netd)
-                throws RemoteException {
-            super(context, handler, netd);
-        }
-
-        /**
-         * Notify our observers of a change in the data activity state of the interface
-         */
-        @Override
-        public void notifyInterfaceClassActivity(int type, boolean isActive, long tsNanos,
-                int uid, boolean fromRadio) {
-            final boolean isMobile = ConnectivityManager.isNetworkTypeMobile(type);
-            int powerState = isActive
-                    ? DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH
-                    : DataConnectionRealTimeInfo.DC_POWER_STATE_LOW;
-
-            if (isMobile) {
-                if (!fromRadio) {
-                    if (mMobileActivityFromRadio) {
-                        // If this call is not coming from a report from the radio itself, but we
-                        // have previously received reports from the radio, then we will take the
-                        // power state to just be whatever the radio last reported.
-                        powerState = mLastPowerStateFromRadio;
-                    }
-                } else {
-                    mMobileActivityFromRadio = true;
+    private void invokeForAllObservers(NetworkManagementEventCallback eventCallback) {
+        final int length = mObservers.beginBroadcast();
+        try {
+            for (int i = 0; i < length; i++) {
+                try {
+                    eventCallback.sendCallback(mObservers.getBroadcastItem(i));
+                } catch (RemoteException | RuntimeException e) {
                 }
-                if (mLastPowerStateFromRadio != powerState) {
-                    mLastPowerStateFromRadio = powerState;
-                    try {
-                        getBatteryStats().noteMobileRadioPowerState(powerState, tsNanos, uid);
-                    } catch (RemoteException e) {
-                    }
+            }
+        } finally {
+            mObservers.finishBroadcast();
+        }
+    }
+
+    /**
+     * Notify our observers of an interface status change
+     */
+    private void notifyInterfaceStatusChanged(String iface, boolean up) {
+        invokeForAllObservers(o -> o.interfaceStatusChanged(iface, up));
+    }
+
+    /**
+     * Notify our observers of an interface link state change
+     * (typically, an Ethernet cable has been plugged-in or unplugged).
+     */
+    private void notifyInterfaceLinkStateChanged(String iface, boolean up) {
+        invokeForAllObservers(o -> o.interfaceLinkStateChanged(iface, up));
+    }
+
+    /**
+     * Notify our observers of an interface addition.
+     */
+    private void notifyInterfaceAdded(String iface) {
+        invokeForAllObservers(o -> o.interfaceAdded(iface));
+    }
+
+    /**
+     * Notify our observers of an interface removal.
+     */
+    private void notifyInterfaceRemoved(String iface) {
+        // netd already clears out quota and alerts for removed ifaces; update
+        // our sanity-checking state.
+        mActiveAlerts.remove(iface);
+        mActiveQuotas.remove(iface);
+        invokeForAllObservers(o -> o.interfaceRemoved(iface));
+    }
+
+    /**
+     * Notify our observers of a limit reached.
+     */
+    private void notifyLimitReached(String limitName, String iface) {
+        invokeForAllObservers(o -> o.limitReached(limitName, iface));
+    }
+
+    /**
+     * Notify our observers of a change in the data activity state of the interface
+     */
+    private void notifyInterfaceClassActivity(int type, boolean isActive, long tsNanos,
+            int uid, boolean fromRadio) {
+        final boolean isMobile = ConnectivityManager.isNetworkTypeMobile(type);
+        int powerState = isActive
+                ? DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH
+                : DataConnectionRealTimeInfo.DC_POWER_STATE_LOW;
+        if (isMobile) {
+            if (!fromRadio) {
+                if (mMobileActivityFromRadio) {
+                    // If this call is not coming from a report from the radio itself, but we
+                    // have previously received reports from the radio, then we will take the
+                    // power state to just be whatever the radio last reported.
+                    powerState = mLastPowerStateFromRadio;
+                }
+            } else {
+                mMobileActivityFromRadio = true;
+            }
+            if (mLastPowerStateFromRadio != powerState) {
+                mLastPowerStateFromRadio = powerState;
+                try {
+                    getBatteryStats().noteMobileRadioPowerState(powerState, tsNanos, uid);
+                } catch (RemoteException e) {
                 }
                 StatsLog.write_non_chained(StatsLog.MOBILE_RADIO_POWER_STATE_CHANGED, uid, null,
                         powerState);
             }
+        }
 
-            if (ConnectivityManager.isNetworkTypeWifi(type)) {
-                if (mLastPowerStateFromWifi != powerState) {
-                    mLastPowerStateFromWifi = powerState;
-                    try {
-                        getBatteryStats().noteWifiRadioPowerState(powerState, tsNanos, uid);
-                    } catch (RemoteException e) {
-                    }
+        if (ConnectivityManager.isNetworkTypeWifi(type)) {
+            if (mLastPowerStateFromWifi != powerState) {
+                mLastPowerStateFromWifi = powerState;
+                try {
+                    getBatteryStats().noteWifiRadioPowerState(powerState, tsNanos, uid);
+                } catch (RemoteException e) {
                 }
                 StatsLog.write_non_chained(StatsLog.WIFI_RADIO_POWER_STATE_CHANGED, uid, null,
                         powerState);
             }
-
-            if (!isMobile || fromRadio || !mMobileActivityFromRadio) {
-                // Report the change in data activity.  We don't do this if this is a change
-                // on the mobile network, that is not coming from the radio itself, and we
-                // have previously seen change reports from the radio.  In that case only
-                // the radio is the authority for the current state.
-                final boolean active = isActive;
-                super.notifyInterfaceClassActivity(type, isActive, tsNanos, uid, fromRadio);
-            }
-
-            boolean report = false;
-            synchronized (mIdleTimerLock) {
-                if (mActiveIdleTimers.isEmpty()) {
-                    // If there are no idle timers, we are not monitoring activity, so we
-                    // are always considered active.
-                    isActive = true;
-                }
-                if (mNetworkActive != isActive) {
-                    mNetworkActive = isActive;
-                    report = isActive;
-                }
-            }
-            if (report) {
-                reportNetworkActive();
-            }
         }
 
-        /**
-         * Notify our observers of an interface removal.
-         */
-        @Override
-        public void notifyInterfaceRemoved(String iface) {
-            // netd already clears out quota and alerts for removed ifaces; update
-            // our sanity-checking state.
-            mActiveAlerts.remove(iface);
-            mActiveQuotas.remove(iface);
-            super.notifyInterfaceRemoved(iface);
+        if (!isMobile || fromRadio || !mMobileActivityFromRadio) {
+            // Report the change in data activity.  We don't do this if this is a change
+            // on the mobile network, that is not coming from the radio itself, and we
+            // have previously seen change reports from the radio.  In that case only
+            // the radio is the authority for the current state.
+            final boolean active = isActive;
+            invokeForAllObservers(o -> o.interfaceClassDataActivityChanged(
+                    Integer.toString(type), active, tsNanos));
         }
 
-        @Override
-        public void onStrictCleartextDetected(int uid, String hex) throws RemoteException {
-            // Don't need to post to mDaemonHandler because the only thing
-            // that notifyCleartextNetwork does is post to a handler
-            ActivityManager.getService().notifyCleartextNetwork(uid,
-                    HexDump.hexStringToByteArray(hex));
+        boolean report = false;
+        synchronized (mIdleTimerLock) {
+            if (mActiveIdleTimers.isEmpty()) {
+                // If there are no idle timers, we are not monitoring activity, so we
+                // are always considered active.
+                isActive = true;
+            }
+            if (mNetworkActive != isActive) {
+                mNetworkActive = isActive;
+                report = isActive;
+            }
+        }
+        if (report) {
+            reportNetworkActive();
         }
     }
 
@@ -524,8 +558,7 @@
                 return;
             }
             // No current code examines the interface parameter in a global alert. Just pass null.
-            mDaemonHandler.post(() -> mNetworkObserverRegistry.notifyLimitReached(
-                    LIMIT_GLOBAL_ALERT, null));
+            mDaemonHandler.post(() -> notifyLimitReached(LIMIT_GLOBAL_ALERT, null));
         }
     }
 
@@ -557,11 +590,10 @@
     private void connectNativeNetdService() {
         mNetdService = mServices.getNetd();
         try {
-            mNetworkObserverRegistry = new NMSNetworkObserverRegistry(
-                    mContext, mDaemonHandler, mNetdService);
-            if (DBG) Slog.d(TAG, "Registered NetworkObserverRegistry");
+            mNetdService.registerUnsolicitedEventListener(mNetdUnsolicitedEventListener);
+            if (DBG) Slog.d(TAG, "Register unsolicited event listener");
         } catch (RemoteException | ServiceSpecificException e) {
-            Slog.wtf(TAG, "Failed to register NetworkObserverRegistry: " + e);
+            Slog.e(TAG, "Failed to set Netd unsolicited event listener " + e);
         }
     }
 
@@ -665,6 +697,118 @@
 
     }
 
+    /**
+     * Notify our observers of a new or updated interface address.
+     */
+    private void notifyAddressUpdated(String iface, LinkAddress address) {
+        invokeForAllObservers(o -> o.addressUpdated(iface, address));
+    }
+
+    /**
+     * Notify our observers of a deleted interface address.
+     */
+    private void notifyAddressRemoved(String iface, LinkAddress address) {
+        invokeForAllObservers(o -> o.addressRemoved(iface, address));
+    }
+
+    /**
+     * Notify our observers of DNS server information received.
+     */
+    private void notifyInterfaceDnsServerInfo(String iface, long lifetime, String[] addresses) {
+        invokeForAllObservers(o -> o.interfaceDnsServerInfo(iface, lifetime, addresses));
+    }
+
+    /**
+     * Notify our observers of a route change.
+     */
+    private void notifyRouteChange(boolean updated, RouteInfo route) {
+        if (updated) {
+            invokeForAllObservers(o -> o.routeUpdated(route));
+        } else {
+            invokeForAllObservers(o -> o.routeRemoved(route));
+        }
+    }
+
+    private class NetdUnsolicitedEventListener extends INetdUnsolicitedEventListener.Stub {
+        @Override
+        public void onInterfaceClassActivityChanged(boolean isActive,
+                int label, long timestamp, int uid) throws RemoteException {
+            final long timestampNanos;
+            if (timestamp <= 0) {
+                timestampNanos = SystemClock.elapsedRealtimeNanos();
+            } else {
+                timestampNanos = timestamp;
+            }
+            mDaemonHandler.post(() ->
+                    notifyInterfaceClassActivity(label, isActive, timestampNanos, uid, false));
+        }
+
+        @Override
+        public void onQuotaLimitReached(String alertName, String ifName)
+                throws RemoteException {
+            mDaemonHandler.post(() -> notifyLimitReached(alertName, ifName));
+        }
+
+        @Override
+        public void onInterfaceDnsServerInfo(String ifName,
+                long lifetime, String[] servers) throws RemoteException {
+            mDaemonHandler.post(() -> notifyInterfaceDnsServerInfo(ifName, lifetime, servers));
+        }
+
+        @Override
+        public void onInterfaceAddressUpdated(String addr,
+                String ifName, int flags, int scope) throws RemoteException {
+            final LinkAddress address = new LinkAddress(addr, flags, scope);
+            mDaemonHandler.post(() -> notifyAddressUpdated(ifName, address));
+        }
+
+        @Override
+        public void onInterfaceAddressRemoved(String addr,
+                String ifName, int flags, int scope) throws RemoteException {
+            final LinkAddress address = new LinkAddress(addr, flags, scope);
+            mDaemonHandler.post(() -> notifyAddressRemoved(ifName, address));
+        }
+
+        @Override
+        public void onInterfaceAdded(String ifName) throws RemoteException {
+            mDaemonHandler.post(() -> notifyInterfaceAdded(ifName));
+        }
+
+        @Override
+        public void onInterfaceRemoved(String ifName) throws RemoteException {
+            mDaemonHandler.post(() -> notifyInterfaceRemoved(ifName));
+        }
+
+        @Override
+        public void onInterfaceChanged(String ifName, boolean up)
+                throws RemoteException {
+            mDaemonHandler.post(() -> notifyInterfaceStatusChanged(ifName, up));
+        }
+
+        @Override
+        public void onInterfaceLinkStateChanged(String ifName, boolean up)
+                throws RemoteException {
+            mDaemonHandler.post(() -> notifyInterfaceLinkStateChanged(ifName, up));
+        }
+
+        @Override
+        public void onRouteChanged(boolean updated,
+                String route, String gateway, String ifName) throws RemoteException {
+            final RouteInfo processRoute = new RouteInfo(new IpPrefix(route),
+                    ("".equals(gateway)) ? null : InetAddresses.parseNumericAddress(gateway),
+                    ifName);
+            mDaemonHandler.post(() -> notifyRouteChange(updated, processRoute));
+        }
+
+        @Override
+        public void onStrictCleartextDetected(int uid, String hex) throws RemoteException {
+            // Don't need to post to mDaemonHandler because the only thing
+            // that notifyCleartextNetwork does is post to a handler
+            ActivityManager.getService().notifyCleartextNetwork(uid,
+                    HexDump.hexStringToByteArray(hex));
+        }
+    }
+
     //
     // Netd Callback handling
     //
@@ -713,18 +857,16 @@
                         throw new IllegalStateException(errorMessage);
                     }
                     if (cooked[2].equals("added")) {
-                        mNetworkObserverRegistry.notifyInterfaceAdded(cooked[3]);
+                        notifyInterfaceAdded(cooked[3]);
                         return true;
                     } else if (cooked[2].equals("removed")) {
-                        mNetworkObserverRegistry.notifyInterfaceRemoved(cooked[3]);
+                        notifyInterfaceRemoved(cooked[3]);
                         return true;
                     } else if (cooked[2].equals("changed") && cooked.length == 5) {
-                        mNetworkObserverRegistry.notifyInterfaceStatusChanged(
-                                cooked[3], cooked[4].equals("up"));
+                        notifyInterfaceStatusChanged(cooked[3], cooked[4].equals("up"));
                         return true;
                     } else if (cooked[2].equals("linkstate") && cooked.length == 5) {
-                        mNetworkObserverRegistry.notifyInterfaceLinkStateChanged(
-                                cooked[3], cooked[4].equals("up"));
+                        notifyInterfaceLinkStateChanged(cooked[3], cooked[4].equals("up"));
                         return true;
                     }
                     throw new IllegalStateException(errorMessage);
@@ -738,7 +880,7 @@
                         throw new IllegalStateException(errorMessage);
                     }
                     if (cooked[2].equals("alert")) {
-                        mNetworkObserverRegistry.notifyLimitReached(cooked[3], cooked[4]);
+                        notifyLimitReached(cooked[3], cooked[4]);
                         return true;
                     }
                     throw new IllegalStateException(errorMessage);
@@ -764,9 +906,8 @@
                         timestampNanos = SystemClock.elapsedRealtimeNanos();
                     }
                     boolean isActive = cooked[2].equals("active");
-                    mNetworkObserverRegistry.notifyInterfaceClassActivity(
-                            Integer.parseInt(cooked[3]), isActive,
-                            timestampNanos, processUid, false);
+                    notifyInterfaceClassActivity(Integer.parseInt(cooked[3]),
+                            isActive, timestampNanos, processUid, false);
                     return true;
                     // break;
             case NetdResponseCode.InterfaceAddressChange:
@@ -792,9 +933,9 @@
                     }
 
                     if (cooked[2].equals("updated")) {
-                        mNetworkObserverRegistry.notifyAddressUpdated(iface, address);
+                        notifyAddressUpdated(iface, address);
                     } else {
-                        mNetworkObserverRegistry.notifyAddressRemoved(iface, address);
+                        notifyAddressRemoved(iface, address);
                     }
                     return true;
                     // break;
@@ -814,8 +955,7 @@
                             throw new IllegalStateException(errorMessage);
                         }
                         String[] servers = cooked[5].split(",");
-                        mNetworkObserverRegistry.notifyInterfaceDnsServerInfo(
-                                cooked[3], lifetime, servers);
+                        notifyInterfaceDnsServerInfo(cooked[3], lifetime, servers);
                     }
                     return true;
                     // break;
@@ -854,8 +994,7 @@
                             InetAddress gateway = null;
                             if (via != null) gateway = InetAddress.parseNumericAddress(via);
                             RouteInfo route = new RouteInfo(new IpPrefix(cooked[3]), gateway, dev);
-                            mNetworkObserverRegistry.notifyRouteChange(
-                                    cooked[2].equals("updated"), route);
+                            notifyRouteChange(cooked[2].equals("updated"), route);
                             return true;
                         } catch (IllegalArgumentException e) {}
                     }
@@ -1318,8 +1457,8 @@
             if (ConnectivityManager.isNetworkTypeMobile(type)) {
                 mNetworkActive = false;
             }
-            mDaemonHandler.post(() -> mNetworkObserverRegistry.notifyInterfaceClassActivity(
-                    type, true /* isActive */, SystemClock.elapsedRealtimeNanos(), -1, false));
+            mDaemonHandler.post(() -> notifyInterfaceClassActivity(type, true,
+                    SystemClock.elapsedRealtimeNanos(), -1, false));
         }
     }
 
@@ -1342,9 +1481,8 @@
                 throw new IllegalStateException(e);
             }
             mActiveIdleTimers.remove(iface);
-            mDaemonHandler.post(() -> mNetworkObserverRegistry.notifyInterfaceClassActivity(
-                    params.type, false /* isActive */, SystemClock.elapsedRealtimeNanos(), -1,
-                    false));
+            mDaemonHandler.post(() -> notifyInterfaceClassActivity(params.type, false,
+                    SystemClock.elapsedRealtimeNanos(), -1, false));
         }
     }
 
diff --git a/services/core/java/com/android/server/PackageWatchdog.java b/services/core/java/com/android/server/PackageWatchdog.java
index 84577f1..ec40971 100644
--- a/services/core/java/com/android/server/PackageWatchdog.java
+++ b/services/core/java/com/android/server/PackageWatchdog.java
@@ -21,6 +21,7 @@
 import android.annotation.IntDef;
 import android.annotation.Nullable;
 import android.content.Context;
+import android.content.pm.VersionedPackage;
 import android.os.Environment;
 import android.os.Handler;
 import android.os.Looper;
@@ -230,7 +231,6 @@
         return null;
     }
 
-    // TODO(zezeozue:) Accept current versionCodes of failing packages?
     /**
      * Called when a process fails either due to a crash or ANR.
      *
@@ -239,16 +239,16 @@
      *
      * <p>This method could be called frequently if there is a severe problem on the device.
      */
-    public void onPackageFailure(String[] packages) {
+    public void onPackageFailure(List<VersionedPackage> packages) {
         mWorkerHandler.post(() -> {
             synchronized (mLock) {
                 if (mAllObservers.isEmpty()) {
                     return;
                 }
 
-                for (int pIndex = 0; pIndex < packages.length; pIndex++) {
-                    String packageToReport = packages[pIndex];
-                    // Observer that will receive failure for packageToReport
+                for (int pIndex = 0; pIndex < packages.size(); pIndex++) {
+                    VersionedPackage versionedPackage = packages.get(pIndex);
+                    // Observer that will receive failure for versionedPackage
                     PackageHealthObserver currentObserverToNotify = null;
                     int currentObserverImpact = Integer.MAX_VALUE;
 
@@ -257,8 +257,8 @@
                         ObserverInternal observer = mAllObservers.valueAt(oIndex);
                         PackageHealthObserver registeredObserver = observer.mRegisteredObserver;
                         if (registeredObserver != null
-                                && observer.onPackageFailure(packageToReport)) {
-                            int impact = registeredObserver.onHealthCheckFailed(packageToReport);
+                                && observer.onPackageFailure(versionedPackage.getPackageName())) {
+                            int impact = registeredObserver.onHealthCheckFailed(versionedPackage);
                             if (impact != PackageHealthObserverImpact.USER_IMPACT_NONE
                                     && impact < currentObserverImpact) {
                                 currentObserverToNotify = registeredObserver;
@@ -269,7 +269,7 @@
 
                     // Execute action with least user impact
                     if (currentObserverToNotify != null) {
-                        currentObserverToNotify.execute(packageToReport);
+                        currentObserverToNotify.execute(versionedPackage);
                     }
                 }
             }
@@ -308,19 +308,19 @@
     /** Register instances of this interface to receive notifications on package failure. */
     public interface PackageHealthObserver {
         /**
-         * Called when health check fails for the {@code packageName}.
+         * Called when health check fails for the {@code versionedPackage}.
          *
          * @return any one of {@link PackageHealthObserverImpact} to express the impact
          * to the user on {@link #execute}
          */
-        @PackageHealthObserverImpact int onHealthCheckFailed(String packageName);
+        @PackageHealthObserverImpact int onHealthCheckFailed(VersionedPackage versionedPackage);
 
         /**
          * Executes mitigation for {@link #onHealthCheckFailed}.
          *
          * @return {@code true} if action was executed successfully, {@code false} otherwise
          */
-        boolean execute(String packageName);
+        boolean execute(VersionedPackage versionedPackage);
 
         // TODO(zezeozue): Ensure uniqueness?
         /**
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index cec825f..f2329d3 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -802,10 +802,7 @@
         // For now, simply clone property when it changes
         DeviceConfig.addOnPropertyChangedListener(DeviceConfig.Storage.NAMESPACE,
                 mContext.getMainExecutor(), (namespace, name, value) -> {
-                    if (DeviceConfig.Storage.ISOLATED_STORAGE_ENABLED.equals(name)) {
-                        Settings.Global.putString(mResolver,
-                                Settings.Global.ISOLATED_STORAGE_REMOTE, value);
-                    }
+                    refreshIsolatedStorageSettings();
                 });
         refreshIsolatedStorageSettings();
     }
@@ -840,6 +837,12 @@
     }
 
     private void refreshIsolatedStorageSettings() {
+        // Always copy value from newer DeviceConfig location
+        Settings.Global.putString(mResolver,
+                Settings.Global.ISOLATED_STORAGE_REMOTE,
+                DeviceConfig.getProperty(DeviceConfig.Storage.NAMESPACE,
+                        DeviceConfig.Storage.ISOLATED_STORAGE_ENABLED));
+
         final int local = Settings.Global.getInt(mContext.getContentResolver(),
                 Settings.Global.ISOLATED_STORAGE_LOCAL, 0);
         final int remote = Settings.Global.getInt(mContext.getContentResolver(),
@@ -1538,10 +1541,6 @@
         mCallbacks = new Callbacks(FgThread.get().getLooper());
         mLockPatternUtils = new LockPatternUtils(mContext);
 
-        mPmInternal = LocalServices.getService(PackageManagerInternal.class);
-        mUmInternal = LocalServices.getService(UserManagerInternal.class);
-        mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
-
         HandlerThread hthread = new HandlerThread(TAG);
         hthread.start();
         mHandler = new StorageManagerServiceHandler(hthread.getLooper());
@@ -1659,6 +1658,19 @@
     }
 
     private void servicesReady() {
+        mPmInternal = LocalServices.getService(PackageManagerInternal.class);
+        mUmInternal = LocalServices.getService(UserManagerInternal.class);
+        mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
+
+        mIPackageManager = IPackageManager.Stub.asInterface(
+                ServiceManager.getService("package"));
+        mIAppOpsService = IAppOpsService.Stub.asInterface(
+                ServiceManager.getService(Context.APP_OPS_SERVICE));
+        try {
+            mIAppOpsService.startWatchingMode(OP_REQUEST_INSTALL_PACKAGES, null, mAppOpsCallback);
+        } catch (RemoteException e) {
+        }
+
         synchronized (mLock) {
             final boolean thisIsolatedStorage = StorageManager.hasIsolatedStorage();
             if (mLastIsolatedStorage == thisIsolatedStorage) {
@@ -1731,14 +1743,6 @@
                 .registerScreenObserver(this);
 
         mSystemReady = true;
-        mIPackageManager = IPackageManager.Stub.asInterface(
-                ServiceManager.getService("package"));
-        mIAppOpsService = IAppOpsService.Stub.asInterface(
-                ServiceManager.getService(Context.APP_OPS_SERVICE));
-        try {
-            mIAppOpsService.startWatchingMode(OP_REQUEST_INSTALL_PACKAGES, null, mAppOpsCallback);
-        } catch (RemoteException e) {
-        }
         mHandler.obtainMessage(H_SYSTEM_READY).sendToTarget();
     }
 
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java
index e543617..2f1510e 100644
--- a/services/core/java/com/android/server/TelephonyRegistry.java
+++ b/services/core/java/com/android/server/TelephonyRegistry.java
@@ -52,6 +52,7 @@
 import android.telephony.TelephonyManager;
 import android.telephony.data.ApnSetting;
 import android.telephony.emergency.EmergencyNumber;
+import android.telephony.ims.ImsReasonInfo;
 import android.util.LocalLog;
 import android.util.StatsLog;
 
@@ -206,9 +207,10 @@
 
     private Map<Integer, List<EmergencyNumber>> mEmergencyNumberList;
 
-    private CallQuality mCallQuality;
+    private CallQuality mCallQuality = new CallQuality();
 
-    private CallAttributes mCallAttributes;
+    private CallAttributes mCallAttributes = new CallAttributes(new PreciseCallState(),
+            TelephonyManager.NETWORK_TYPE_UNKNOWN, new CallQuality());
 
     private int[] mSrvccState;
 
@@ -226,6 +228,8 @@
 
     private int mCallDisconnectCause = DisconnectCause.NOT_VALID;
 
+    private List<ImsReasonInfo> mImsReasonInfo = null;
+
     private int mCallPreciseDisconnectCause = PreciseDisconnectCause.NOT_VALID;
 
     private boolean mCarrierNetworkChangeState = false;
@@ -376,6 +380,7 @@
         mCellLocation = new Bundle[numPhones];
         mCellInfo = new ArrayList<List<CellInfo>>();
         mSrvccState = new int[numPhones];
+        mImsReasonInfo = new ArrayList<ImsReasonInfo>();
         mPhysicalChannelConfigs = new ArrayList<List<PhysicalChannelConfig>>();
         mEmergencyNumberList = new HashMap<>();
         for (int i = 0; i < numPhones; i++) {
@@ -393,6 +398,7 @@
             mCallForwarding[i] =  false;
             mCellLocation[i] = new Bundle();
             mCellInfo.add(i, null);
+            mImsReasonInfo.add(i, null);
             mSrvccState[i] = TelephonyManager.SRVCC_STATE_HANDOVER_NONE;
             mPhysicalChannelConfigs.add(i, new ArrayList<PhysicalChannelConfig>());
         }
@@ -738,6 +744,13 @@
                             remove(r.binder);
                         }
                     }
+                    if ((events & PhoneStateListener.LISTEN_IMS_CALL_DISCONNECT_CAUSES) != 0) {
+                        try {
+                            r.callback.onImsCallDisconnectCauseChanged(mImsReasonInfo.get(phoneId));
+                        } catch (RemoteException ex) {
+                            remove(r.binder);
+                        }
+                    }
                     if ((events & PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE) != 0) {
                         try {
                             r.callback.onPreciseDataConnectionStateChanged(
@@ -1590,6 +1603,34 @@
         }
     }
 
+    public void notifyImsDisconnectCause(int subId, ImsReasonInfo imsReasonInfo) {
+        if (!checkNotifyPermission("notifyImsCallDisconnectCause()")) {
+            return;
+        }
+        int phoneId = SubscriptionManager.getPhoneId(subId);
+        synchronized (mRecords) {
+            if (validatePhoneId(phoneId)) {
+                mImsReasonInfo.set(phoneId, imsReasonInfo);
+                for (Record r : mRecords) {
+                    if (r.matchPhoneStateListenerEvent(
+                            PhoneStateListener.LISTEN_IMS_CALL_DISCONNECT_CAUSES)
+                            && idMatch(r.subId, subId, phoneId)) {
+                        try {
+                            if (DBG_LOC) {
+                                log("notifyImsCallDisconnectCause: mImsReasonInfo="
+                                        + imsReasonInfo + " r=" + r);
+                            }
+                            r.callback.onImsCallDisconnectCauseChanged(mImsReasonInfo.get(phoneId));
+                        } catch (RemoteException ex) {
+                            mRemoveList.add(r.binder);
+                        }
+                    }
+                }
+            }
+            handleRemoveListLocked();
+        }
+    }
+
     public void notifyPreciseDataConnectionFailed(String apnType,
             String apn, @DataFailCause.FailCause int failCause) {
         if (!checkNotifyPermission("notifyPreciseDataConnectionFailed()")) {
@@ -1626,7 +1667,7 @@
         int phoneId = SubscriptionManager.getPhoneId(subId);
         synchronized (mRecords) {
             if (validatePhoneId(phoneId)) {
-                mSrvccState[phoneId]  = state;
+                mSrvccState[phoneId] = state;
                 for (Record r : mRecords) {
                     if (r.matchPhoneStateListenerEvent(
                             PhoneStateListener.LISTEN_SRVCC_STATE_CHANGED) &&
@@ -1836,6 +1877,7 @@
                 pw.println("mDataConnectionState=" + mDataConnectionState[i]);
                 pw.println("mCellLocation=" + mCellLocation[i]);
                 pw.println("mCellInfo=" + mCellInfo.get(i));
+                pw.println("mImsCallDisconnectCause=" + mImsReasonInfo.get(i).toString());
                 pw.decreaseIndent();
             }
             pw.println("mPreciseDataConnectionState=" + mPreciseDataConnectionState);
@@ -2125,6 +2167,11 @@
                     android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, null);
         }
 
+        if ((events & PhoneStateListener.LISTEN_IMS_CALL_DISCONNECT_CAUSES) != 0) {
+            mContext.enforceCallingOrSelfPermission(
+                    android.Manifest.permission.READ_PRECISE_PHONE_STATE, null);
+        }
+
         return true;
     }
 
diff --git a/services/core/java/com/android/server/ThreadPriorityBooster.java b/services/core/java/com/android/server/ThreadPriorityBooster.java
index 53e8ce4..f74a4385 100644
--- a/services/core/java/com/android/server/ThreadPriorityBooster.java
+++ b/services/core/java/com/android/server/ThreadPriorityBooster.java
@@ -43,9 +43,9 @@
 
     public void boost() {
         final int tid = myTid();
-        final int prevPriority = getThreadPriority(tid);
         final PriorityState state = mThreadState.get();
         if (state.regionCounter == 0) {
+            final int prevPriority = getThreadPriority(tid);
             state.prevPriority = prevPriority;
             if (prevPriority > mBoostToPriority) {
                 setThreadPriority(tid, mBoostToPriority);
@@ -60,9 +60,11 @@
     public void reset() {
         final PriorityState state = mThreadState.get();
         state.regionCounter--;
-        final int currentPriority = getThreadPriority(myTid());
-        if (state.regionCounter == 0 && state.prevPriority != currentPriority) {
-            setThreadPriority(myTid(), state.prevPriority);
+        if (state.regionCounter == 0) {
+            final int currentPriority = getThreadPriority(myTid());
+            if (state.prevPriority != currentPriority) {
+                setThreadPriority(myTid(), state.prevPriority);
+            }
         }
     }
 
@@ -77,9 +79,11 @@
         mBoostToPriority = priority;
         final PriorityState state = mThreadState.get();
         final int tid = myTid();
-        final int prevPriority = getThreadPriority(tid);
-        if (state.regionCounter != 0 && prevPriority != priority) {
-            setThreadPriority(tid, priority);
+        if (state.regionCounter != 0) {
+            final int prevPriority = getThreadPriority(tid);
+            if (prevPriority != priority) {
+                setThreadPriority(tid, priority);
+            }
         }
     }
 
diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java
index f6e698f..545baa0 100644
--- a/services/core/java/com/android/server/VibratorService.java
+++ b/services/core/java/com/android/server/VibratorService.java
@@ -593,7 +593,7 @@
                 Vibration vib = new Vibration(token, effect, usageHint, uid, opPkg, reason);
                 if (mProcStatesCache.get(uid, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND)
                         > ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
-                        && vib.isHapticFeedback()) {
+                        && !vib.isNotification() && !vib.isRingtone()) {
                     Slog.e(TAG, "Ignoring incoming vibration as process with uid = "
                             + uid + " is background");
                     return;
@@ -1454,6 +1454,17 @@
 
         private final IBinder mToken;
 
+        private final class CommonOptions {
+            public boolean force = false;
+            public void check(String opt) {
+                switch (opt) {
+                    case "-f":
+                        force = true;
+                        break;
+                }
+            }
+        }
+
         private VibratorShellCommand(IBinder token) {
             mToken = token;
         }
@@ -1473,11 +1484,11 @@
             return handleDefaultCommands(cmd);
         }
 
-        private boolean checkDoNotDisturb() {
+        private boolean checkDoNotDisturb(CommonOptions opts) {
             try {
                 final int zenMode = Settings.Global.getInt(mContext.getContentResolver(),
                         Settings.Global.ZEN_MODE);
-                if (zenMode != Settings.Global.ZEN_MODE_OFF) {
+                if (zenMode != Settings.Global.ZEN_MODE_OFF && !opts.force) {
                     try (PrintWriter pw = getOutPrintWriter();) {
                         pw.print("Ignoring because device is on DND mode ");
                         pw.println(DebugUtils.flagsToString(Settings.Global.class, "ZEN_MODE_",
@@ -1495,7 +1506,14 @@
         private int runVibrate() {
             Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "runVibrate");
             try {
-                if (checkDoNotDisturb()) {
+                CommonOptions commonOptions = new CommonOptions();
+
+                String opt;
+                while ((opt = getNextOption()) != null) {
+                    commonOptions.check(opt);
+                }
+
+                if (checkDoNotDisturb(commonOptions)) {
                     return 0;
                 }
 
@@ -1518,13 +1536,10 @@
         private int runWaveform() {
             Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "runWaveform");
             try {
-                if (checkDoNotDisturb()) {
-                    return 0;
-                }
-
                 String description = "Shell command";
                 int repeat = -1;
                 ArrayList<Integer> amplitudesList = null;
+                CommonOptions commonOptions = new CommonOptions();
 
                 String opt;
                 while ((opt = getNextOption()) != null) {
@@ -1540,9 +1555,16 @@
                                 amplitudesList = new ArrayList<Integer>();
                             }
                             break;
+                        default:
+                            commonOptions.check(opt);
+                            break;
                     }
                 }
 
+                if (checkDoNotDisturb(commonOptions)) {
+                    return 0;
+                }
+
                 ArrayList<Long> timingsList = new ArrayList<Long>();
 
                 String arg;
@@ -1574,7 +1596,14 @@
         private int runPrebaked() {
             Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "runPrebaked");
             try {
-                if (checkDoNotDisturb()) {
+                CommonOptions commonOptions = new CommonOptions();
+
+                String opt;
+                while ((opt = getNextOption()) != null) {
+                    commonOptions.check(opt);
+                }
+
+                if (checkDoNotDisturb(commonOptions)) {
                     return 0;
                 }
 
@@ -1618,6 +1647,8 @@
                 pw.println("    (Do Not Disturb) mode.");
                 pw.println("  cancel");
                 pw.println("    Cancels any active vibration");
+                pw.println("Common Options:");
+                pw.println("  -f - Force. Ignore Do Not Disturb setting.");
                 pw.println("");
             }
         }
diff --git a/services/core/java/com/android/server/am/ActiveInstrumentation.java b/services/core/java/com/android/server/am/ActiveInstrumentation.java
index 15de3de..9510f59 100644
--- a/services/core/java/com/android/server/am/ActiveInstrumentation.java
+++ b/services/core/java/com/android/server/am/ActiveInstrumentation.java
@@ -49,6 +49,9 @@
     // Connection to use the UI introspection APIs.
     IUiAutomationConnection mUiAutomationConnection;
 
+    // Whether the caller holds START_ACTIVITIES_FROM_BACKGROUND permission
+    boolean mHasBackgroundActivityStartsPermission;
+
     // As given to us
     Bundle mArguments;
 
@@ -117,6 +120,8 @@
             pw.print(prefix); pw.print("mUiAutomationConnection=");
             pw.println(mUiAutomationConnection);
         }
+        pw.print("mHasBackgroundActivityStartsPermission=");
+        pw.println(mHasBackgroundActivityStartsPermission);
         pw.print(prefix); pw.print("mArguments=");
         pw.println(mArguments);
     }
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index 5d6c2f0..2f1f91e 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -17,6 +17,7 @@
 package com.android.server.am;
 
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_MANIFEST;
 
 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BACKGROUND_CHECK;
 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_FOREGROUND_SERVICE;
@@ -218,7 +219,7 @@
                     if (DEBUG_FOREGROUND_SERVICE) {
                         Slog.i(TAG, "  Stopping fg for service " + r);
                     }
-                    setServiceForegroundInnerLocked(r, 0, null, 0);
+                    setServiceForegroundInnerLocked(r, 0, null, 0, 0);
                 }
             }
         }
@@ -914,13 +915,13 @@
     }
 
     public void setServiceForegroundLocked(ComponentName className, IBinder token,
-            int id, Notification notification, int flags) {
+            int id, Notification notification, int flags, int foregroundServiceType) {
         final int userId = UserHandle.getCallingUserId();
         final long origId = Binder.clearCallingIdentity();
         try {
             ServiceRecord r = findServiceLocked(className, token, userId);
             if (r != null) {
-                setServiceForegroundInnerLocked(r, id, notification, flags);
+                setServiceForegroundInnerLocked(r, id, notification, flags, foregroundServiceType);
             }
         } finally {
             Binder.restoreCallingIdentity(origId);
@@ -1211,7 +1212,7 @@
      * @param id Notification ID.  Zero === exit foreground state for the given service.
      */
     private void setServiceForegroundInnerLocked(final ServiceRecord r, int id,
-            Notification notification, int flags) {
+            Notification notification, int flags, int foregroundServiceType) {
         if (id != 0) {
             if (notification == null) {
                 throw new IllegalArgumentException("null notification");
@@ -1244,13 +1245,20 @@
                             android.Manifest.permission.FOREGROUND_SERVICE,
                             r.app.pid, r.appInfo.uid, "startForeground");
                 }
-                if (r.appInfo.targetSdkVersion >= Build.VERSION_CODES.Q) {
-                    if (r.serviceInfo.getForegroundServiceType()
-                            == ServiceInfo.FOREGROUND_SERVICE_TYPE_UNSPECIFIED) {
-                        // STOPSHIP(b/120611119): replace log message with SecurityException.
-                        Slog.w(TAG, "missing foregroundServiceType attribute in "
-                                + "service element of manifest file");
-                    }
+
+                int manifestType = r.serviceInfo.getForegroundServiceType();
+                // If passed in foreground service type is FOREGROUND_SERVICE_TYPE_MANIFEST,
+                // consider it is the same as manifest foreground service type.
+                if (foregroundServiceType == FOREGROUND_SERVICE_TYPE_MANIFEST) {
+                    foregroundServiceType = manifestType;
+                }
+                // Check the passed in foreground service type flags is a subset of manifest
+                // foreground service type flags.
+                if ((foregroundServiceType & manifestType) != foregroundServiceType) {
+                    // STOPSHIP(b/120611119): replace log message with IllegalArgumentException.
+                    Slog.w(TAG, "foregroundServiceType must be a subset of "
+                            + "foregroundServiceType attribute in "
+                            + "service element of manifest file");
                 }
             }
             boolean alreadyStartedOp = false;
@@ -1307,6 +1315,7 @@
                     }
                     notification.flags |= Notification.FLAG_FOREGROUND_SERVICE;
                     r.foregroundNoti = notification;
+                    r.foregroundServiceType = foregroundServiceType;
                     if (!r.isForeground) {
                         final ServiceMap smap = getServiceMapLocked(r.userId);
                         if (smap != null) {
@@ -1438,14 +1447,16 @@
 
     private void updateServiceForegroundLocked(ProcessRecord proc, boolean oomAdj) {
         boolean anyForeground = false;
-        for (int i=proc.services.size()-1; i>=0; i--) {
+        int fgServiceTypes = 0;
+        for (int i = proc.services.size() - 1; i >= 0; i--) {
             ServiceRecord sr = proc.services.valueAt(i);
             if (sr.isForeground || sr.fgRequired) {
                 anyForeground = true;
+                fgServiceTypes |= sr.foregroundServiceType;
                 break;
             }
         }
-        mAm.updateProcessForegroundLocked(proc, anyForeground, oomAdj);
+        mAm.updateProcessForegroundLocked(proc, anyForeground, fgServiceTypes, oomAdj);
     }
 
     private void updateWhitelistManagerLocked(ProcessRecord proc) {
@@ -3316,8 +3327,7 @@
     }
 
     private boolean collectPackageServicesLocked(String packageName, Set<String> filterByClasses,
-            boolean evenPersistent, boolean doit, boolean killProcess,
-            ArrayMap<ComponentName, ServiceRecord> services) {
+            boolean evenPersistent, boolean doit, ArrayMap<ComponentName, ServiceRecord> services) {
         boolean didSomething = false;
         for (int i = services.size() - 1; i >= 0; i--) {
             ServiceRecord service = services.valueAt(i);
@@ -3332,13 +3342,10 @@
                 }
                 didSomething = true;
                 Slog.i(TAG, "  Force stopping service " + service);
-                if (service.app != null) {
-                    service.app.removed = killProcess;
-                    if (!service.app.isPersistent()) {
-                        service.app.services.remove(service);
-                        if (service.whitelistManager) {
-                            updateWhitelistManagerLocked(service.app);
-                        }
+                if (service.app != null && !service.app.isPersistent()) {
+                    service.app.services.remove(service);
+                    if (service.whitelistManager) {
+                        updateWhitelistManagerLocked(service.app);
                     }
                 }
                 service.setProcess(null);
@@ -3353,7 +3360,7 @@
     }
 
     boolean bringDownDisabledPackageServicesLocked(String packageName, Set<String> filterByClasses,
-            int userId, boolean evenPersistent, boolean killProcess, boolean doit) {
+            int userId, boolean evenPersistent, boolean doit) {
         boolean didSomething = false;
 
         if (mTmpCollectionResults != null) {
@@ -3363,8 +3370,7 @@
         if (userId == UserHandle.USER_ALL) {
             for (int i = mServiceMap.size() - 1; i >= 0; i--) {
                 didSomething |= collectPackageServicesLocked(packageName, filterByClasses,
-                        evenPersistent, doit, killProcess,
-                        mServiceMap.valueAt(i).mServicesByInstanceName);
+                        evenPersistent, doit, mServiceMap.valueAt(i).mServicesByInstanceName);
                 if (!doit && didSomething) {
                     return true;
                 }
@@ -3377,7 +3383,7 @@
             if (smap != null) {
                 ArrayMap<ComponentName, ServiceRecord> items = smap.mServicesByInstanceName;
                 didSomething = collectPackageServicesLocked(packageName, filterByClasses,
-                        evenPersistent, doit, killProcess, items);
+                        evenPersistent, doit, items);
             }
             if (doit && filterByClasses == null) {
                 forceStopPackageLocked(packageName, userId);
diff --git a/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java b/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java
index 0aaea2f..e42666c 100644
--- a/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java
+++ b/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java
@@ -48,6 +48,7 @@
     static final boolean DEBUG_BROADCAST = DEBUG_ALL || false;
     static final boolean DEBUG_BROADCAST_BACKGROUND = DEBUG_BROADCAST || false;
     static final boolean DEBUG_BROADCAST_LIGHT = DEBUG_BROADCAST || false;
+    static final boolean DEBUG_BROADCAST_DEFERRAL = DEBUG_BROADCAST || false;
     static final boolean DEBUG_LRU = DEBUG_ALL || false;
     static final boolean DEBUG_MU = DEBUG_ALL || false;
     static final boolean DEBUG_NETWORK = DEBUG_ALL || false;
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index eb643b6..5538e49 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -22,6 +22,7 @@
 import static android.Manifest.permission.INTERACT_ACROSS_USERS;
 import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL;
 import static android.Manifest.permission.REMOVE_TASKS;
+import static android.Manifest.permission.START_ACTIVITIES_FROM_BACKGROUND;
 import static android.app.ActivityManager.INSTR_FLAG_DISABLE_HIDDEN_API_CHECKS;
 import static android.app.ActivityManager.INSTR_FLAG_MOUNT_EXTERNAL_STORAGE_FULL;
 import static android.app.ActivityManager.PROCESS_STATE_LAST_ACTIVITY;
@@ -120,6 +121,7 @@
 import static com.android.server.am.MemoryStatUtil.hasMemcg;
 import static com.android.server.am.MemoryStatUtil.readMemoryStatFromFilesystem;
 import static com.android.server.am.MemoryStatUtil.readRssHighWaterMarkFromProcfs;
+import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
 import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_CLEANUP;
 import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_CONFIGURATION;
 import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_SWITCH;
@@ -197,6 +199,7 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.ActivityInfo;
+import android.content.pm.ActivityPresentationInfo;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.ApplicationInfo.HiddenApiEnforcementPolicy;
 import android.content.pm.IPackageDataObserver;
@@ -224,7 +227,6 @@
 import android.location.LocationManager;
 import android.media.audiofx.AudioEffect;
 import android.net.Proxy;
-import android.net.ProxyInfo;
 import android.net.Uri;
 import android.os.AppZygote;
 import android.os.BatteryStats;
@@ -284,6 +286,7 @@
 import android.util.TimingsTraceLog;
 import android.util.proto.ProtoOutputStream;
 import android.util.proto.ProtoUtils;
+import android.view.Display;
 import android.view.Gravity;
 import android.view.IRecentsAnimationRunner;
 import android.view.LayoutInflater;
@@ -549,6 +552,11 @@
     // Whether we should use SCHED_FIFO for UI and RenderThreads.
     boolean mUseFifoUiScheduling = false;
 
+    // Use an offload queue for long broadcasts, e.g. BOOT_COMPLETED.
+    // For simplicity, since we statically declare the size of the array of BroadcastQueues,
+    // we still create this new offload queue, but never ever put anything on it.
+    boolean mEnableOffloadQueue;
+
     BroadcastQueue mFgBroadcastQueue;
     BroadcastQueue mBgBroadcastQueue;
     BroadcastQueue mOffloadBroadcastQueue;
@@ -2090,6 +2098,8 @@
             if (phase == PHASE_SYSTEM_SERVICES_READY) {
                 mService.mBatteryStatsService.systemServicesReady();
                 mService.mServices.systemServicesReady();
+            } else if (phase == PHASE_ACTIVITY_MANAGER_READY) {
+                mService.startBroadcastObservers();
             }
         }
 
@@ -2216,7 +2226,7 @@
         mConstants = hasHandlerThread ? new ActivityManagerConstants(this, mHandler) : null;
         final ActiveUids activeUids = new ActiveUids(this, false /* postChangesToAtm */);
         mProcessList.init(this, activeUids);
-        mOomAdjuster = new OomAdjuster(this, mProcessList, activeUids);
+        mOomAdjuster = new OomAdjuster(this, mProcessList, activeUids, new Object());
 
         mIntentFirewall = hasHandlerThread
                 ? new IntentFirewall(new IntentFirewallInterface(), mHandler) : null;
@@ -2264,14 +2274,32 @@
         mConstants = new ActivityManagerConstants(this, mHandler);
         final ActiveUids activeUids = new ActiveUids(this, true /* postChangesToAtm */);
         mProcessList.init(this, activeUids);
-        mOomAdjuster = new OomAdjuster(this, mProcessList, activeUids);
+        mOomAdjuster = new OomAdjuster(this, mProcessList, activeUids, atm.getGlobalLock());
+
+        // Broadcast policy parameters
+        final BroadcastConstants foreConstants = new BroadcastConstants(
+                Settings.Global.BROADCAST_FG_CONSTANTS);
+        foreConstants.TIMEOUT = BROADCAST_FG_TIMEOUT;
+
+        final BroadcastConstants backConstants = new BroadcastConstants(
+                Settings.Global.BROADCAST_BG_CONSTANTS);
+        backConstants.TIMEOUT = BROADCAST_BG_TIMEOUT;
+
+        final BroadcastConstants offloadConstants = new BroadcastConstants(
+                Settings.Global.BROADCAST_OFFLOAD_CONSTANTS);
+        offloadConstants.TIMEOUT = BROADCAST_BG_TIMEOUT;
+        // by default, no "slow" policy in this queue
+        offloadConstants.SLOW_TIME = Integer.MAX_VALUE;
+
+        mEnableOffloadQueue = SystemProperties.getBoolean(
+                "persist.device_config.activity_manager_native_boot.offload_queue_enabled", false);
 
         mFgBroadcastQueue = new BroadcastQueue(this, mHandler,
-                "foreground", BROADCAST_FG_TIMEOUT, false);
+                "foreground", foreConstants, false);
         mBgBroadcastQueue = new BroadcastQueue(this, mHandler,
-                "background", BROADCAST_BG_TIMEOUT, true);
+                "background", backConstants, true);
         mOffloadBroadcastQueue = new BroadcastQueue(this, mHandler,
-                "offload", BROADCAST_BG_TIMEOUT, true);
+                "offload", offloadConstants, true);
         mBroadcastQueues[0] = mFgBroadcastQueue;
         mBroadcastQueues[1] = mBgBroadcastQueue;
         mBroadcastQueues[2] = mOffloadBroadcastQueue;
@@ -3075,7 +3103,7 @@
                 } else {
                     UidRecord validateUid = mValidateUids.get(item.uid);
                     if (validateUid == null) {
-                        validateUid = new UidRecord(item.uid, mAtmInternal);
+                        validateUid = new UidRecord(item.uid);
                         mValidateUids.put(item.uid, validateUid);
                     }
                     if ((item.change & UidRecord.CHANGE_IDLE) != 0) {
@@ -3560,6 +3588,9 @@
         if (tracesFile == null) {
             return null;
         }
+        if (DEBUG_ANR) {
+            Slog.d(TAG, "Dumping to " + tracesFile.getAbsolutePath());
+        }
 
         dumpStackTraces(tracesFile.getAbsolutePath(), firstPids, nativePids, extraPids);
         return tracesFile;
@@ -3875,7 +3906,7 @@
                 }
                 synchronized (this) {
                     mProcessList.killPackageProcessesLocked(packageName, appId, targetUserId,
-                            ProcessList.SERVICE_ADJ, false, true, true, false, "kill background");
+                            ProcessList.SERVICE_ADJ, "kill background");
                 }
             }
         } finally {
@@ -4236,7 +4267,7 @@
     }
 
     private void cleanupDisabledPackageComponentsLocked(
-            String packageName, int userId, boolean killProcess, String[] changedClasses) {
+            String packageName, int userId, String[] changedClasses) {
 
         Set<String> disabledClasses = null;
         boolean packageDisabled = false;
@@ -4299,7 +4330,7 @@
 
         // Clean-up disabled services.
         mServices.bringDownDisabledPackageServicesLocked(
-                packageName, disabledClasses, userId, false, killProcess, true);
+                packageName, disabledClasses, userId, false /* evenPersistent */, true /* doIt */);
 
         // Clean-up disabled providers.
         ArrayList<ContentProviderRecord> providers = new ArrayList<>();
@@ -4356,14 +4387,15 @@
         }
 
         boolean didSomething = mProcessList.killPackageProcessesLocked(packageName, appId, userId,
-                ProcessList.INVALID_ADJ, callerWillRestart, true, doit, evenPersistent,
+                ProcessList.INVALID_ADJ, callerWillRestart, true /* allowRestart */, doit,
+                evenPersistent, true /* setRemoved */,
                 packageName == null ? ("stop user " + userId) : ("stop " + packageName));
 
         didSomething |=
                 mAtmInternal.onForceStopPackage(packageName, doit, evenPersistent, userId);
 
         if (mServices.bringDownDisabledPackageServicesLocked(
-                packageName, null, userId, evenPersistent, true, doit)) {
+                packageName, null /* filterByClasses */, userId, evenPersistent, doit)) {
             if (!doit) {
                 return true;
             }
@@ -4478,6 +4510,7 @@
         // next app record if we are emulating process with anonymous threads.
         ProcessRecord app;
         long startTime = SystemClock.uptimeMillis();
+        long bindApplicationTimeMillis;
         if (pid != MY_PID && pid >= 0) {
             synchronized (mPidsSelfLocked) {
                 app = mPidsSelfLocked.get(pid);
@@ -4543,7 +4576,7 @@
         app.curAdj = app.setAdj = app.verifiedAdj = ProcessList.INVALID_ADJ;
         app.setCurrentSchedulingGroup(app.setSchedGroup = ProcessList.SCHED_GROUP_DEFAULT);
         app.forcingToImportant = null;
-        updateProcessForegroundLocked(app, false, false);
+        updateProcessForegroundLocked(app, false, 0, false);
         app.hasShownUi = false;
         app.setDebugging(false);
         app.cached = false;
@@ -4715,6 +4748,7 @@
             }
 
             checkTime(startTime, "attachApplicationLocked: immediately before bindApplication");
+            bindApplicationTimeMillis = SystemClock.elapsedRealtime();
             mAtmInternal.preBindApplication(app.getWindowProcessController());
             final ActiveInstrumentation instr2 = app.getActiveInstrumentation();
             if (app.isolatedEntryPoint != null) {
@@ -4818,7 +4852,7 @@
             try {
                 thread.scheduleCreateBackupAgent(backupTarget.appInfo,
                         compatibilityInfoForPackage(backupTarget.appInfo),
-                        backupTarget.backupMode);
+                        backupTarget.backupMode, backupTarget.userId);
             } catch (Exception e) {
                 Slog.wtf(TAG, "Exception thrown creating backup agent in " + app, e);
                 badApp = true;
@@ -4836,6 +4870,17 @@
             checkTime(startTime, "attachApplicationLocked: after updateOomAdjLocked");
         }
 
+        StatsLog.write(
+                StatsLog.PROCESS_START_TIME,
+                app.info.uid,
+                app.pid,
+                app.info.packageName,
+                StatsLog.PROCESS_START_TIME__TYPE__COLD,
+                app.startTime,
+                (int) (bindApplicationTimeMillis - app.startTime),
+                (int) (SystemClock.elapsedRealtime() - app.startTime),
+                app.hostingType,
+                (app.hostingNameStr != null ? app.hostingNameStr : ""));
         return true;
     }
 
@@ -5226,6 +5271,15 @@
     }
 
     @Override
+    public boolean isIntentSenderABroadcast(IIntentSender pendingResult) {
+        if (pendingResult instanceof PendingIntentRecord) {
+            final PendingIntentRecord res = (PendingIntentRecord) pendingResult;
+            return res.key.type == ActivityManager.INTENT_SENDER_BROADCAST;
+        }
+        return false;
+    }
+
+    @Override
     public Intent getIntentForIntentSender(IIntentSender pendingResult) {
         enforceCallingPermission(Manifest.permission.GET_INTENT_SENDER_INTENT,
                 "getIntentForIntentSender()");
@@ -5310,7 +5364,7 @@
                     return;
                 }
                 pr.forcingToImportant = null;
-                updateProcessForegroundLocked(pr, false, false);
+                updateProcessForegroundLocked(pr, false, 0, false);
             }
             updateOomAdjLocked();
         }
@@ -7211,7 +7265,6 @@
         synchronized (this) {
             mSystemProvidersInstalled = true;
         }
-
         mConstants.start(mContext.getContentResolver());
         mCoreSettingsObserver = new CoreSettingsObserver(this);
         mActivityTaskManager.installSystemProviders();
@@ -8312,9 +8365,10 @@
         synchronized (this) {
             final long identity = Binder.clearCallingIdentity();
             try {
-                mProcessList.killPackageProcessesLocked(null, appId, userId,
-                        ProcessList.PERSISTENT_PROC_ADJ, false, true, true, true,
-                        reason != null ? reason : "kill uid");
+                mProcessList.killPackageProcessesLocked(null /* packageName */, appId, userId,
+                        ProcessList.PERSISTENT_PROC_ADJ, false /* callerWillRestart */,
+                        true /* callerWillRestart */, true /* doit */, true /* evenPersistent */,
+                        false /* setRemoved */, reason != null ? reason : "kill uid");
             } finally {
                 Binder.restoreCallingIdentity(identity);
             }
@@ -8711,6 +8765,12 @@
         }
     }
 
+    private void startBroadcastObservers() {
+        for (BroadcastQueue queue : mBroadcastQueues) {
+            queue.start(mContext.getContentResolver());
+        }
+    }
+
     private void updateForceBackgroundCheck(boolean enabled) {
         synchronized (this) {
             if (mForceBackgroundCheck != enabled) {
@@ -13219,7 +13279,7 @@
         app.makeInactive(mProcessStats);
         app.waitingToKill = null;
         app.forcingToImportant = null;
-        updateProcessForegroundLocked(app, false, false);
+        updateProcessForegroundLocked(app, false, 0, false);
         app.setHasForegroundActivities(false);
         app.hasShownUi = false;
         app.treatLikeActivity = false;
@@ -13497,9 +13557,10 @@
 
     @Override
     public void setServiceForeground(ComponentName className, IBinder token,
-            int id, Notification notification, int flags) {
+            int id, Notification notification, int flags, int foregroundServiceType) {
         synchronized(this) {
-            mServices.setServiceForegroundLocked(className, token, id, notification, flags);
+            mServices.setServiceForegroundLocked(className, token, id, notification, flags,
+                    foregroundServiceType);
         }
     }
 
@@ -13638,18 +13699,26 @@
     // Cause the target app to be launched if necessary and its backup agent
     // instantiated.  The backup agent will invoke backupAgentCreated() on the
     // activity manager to announce its creation.
-    public boolean bindBackupAgent(String packageName, int backupMode, int userId) {
+    public boolean bindBackupAgent(String packageName, int backupMode, int targetUserId) {
         if (DEBUG_BACKUP) {
-            Slog.v(TAG, "bindBackupAgent: app=" + packageName + " mode="
-                    + backupMode + " userId=" + userId + " callingUid = " + Binder.getCallingUid()
+            Slog.v(TAG, "bindBackupAgent: app=" + packageName + " mode=" + backupMode
+                    + " targetUserId=" + targetUserId + " callingUid = " + Binder.getCallingUid()
                     + " uid = " + Process.myUid());
         }
         enforceCallingPermission("android.permission.CONFIRM_FULL_BACKUP", "bindBackupAgent");
 
+        // The instantiatedUserId is the user of the process the backup agent is started in. This is
+        // different from the targetUserId which is the user whose data is to be backed up or
+        // restored. This distinction is important for system-process packages that live in the
+        // system user's process but backup/restore data for non-system users.
+        // TODO (b/123688746): Handle all system-process packages with singleton check.
+        final int instantiatedUserId =
+                PLATFORM_PACKAGE_NAME.equals(packageName) ? UserHandle.USER_SYSTEM : targetUserId;
+
         IPackageManager pm = AppGlobals.getPackageManager();
         ApplicationInfo app = null;
         try {
-            app = pm.getApplicationInfo(packageName, STOCK_PM_FLAGS, userId);
+            app = pm.getApplicationInfo(packageName, STOCK_PM_FLAGS, instantiatedUserId);
         } catch (RemoteException e) {
             // can't happen; package manager is process-local
         }
@@ -13673,7 +13742,7 @@
                         + app.packageName + ": " + e);
             }
 
-            BackupRecord r = new BackupRecord(app, backupMode);
+            BackupRecord r = new BackupRecord(app, backupMode, targetUserId);
             ComponentName hostingName =
                     (backupMode == ApplicationThreadConstants.BACKUP_MODE_INCREMENTAL)
                             ? new ComponentName(app.packageName, app.backupAgentName)
@@ -13695,10 +13764,10 @@
                 proc.inFullBackup = true;
             }
             r.app = proc;
-            final BackupRecord backupTarget = mBackupTargets.get(userId);
+            final BackupRecord backupTarget = mBackupTargets.get(targetUserId);
             oldBackupUid = backupTarget != null ? backupTarget.appInfo.uid : -1;
             newBackupUid = proc.inFullBackup ? r.appInfo.uid : -1;
-            mBackupTargets.put(userId, r);
+            mBackupTargets.put(targetUserId, r);
 
             // Try not to kill the process during backup
             updateOomAdjLocked(proc, true);
@@ -13709,7 +13778,7 @@
                 if (DEBUG_BACKUP) Slog.v(TAG_BACKUP, "Agent proc already running: " + proc);
                 try {
                     proc.thread.scheduleCreateBackupAgent(app,
-                            compatibilityInfoForPackage(app), backupMode);
+                            compatibilityInfoForPackage(app), backupMode, targetUserId);
                 } catch (RemoteException e) {
                     // Will time out on the backup manager side
                 }
@@ -13749,16 +13818,18 @@
 
     // A backup agent has just come up
     @Override
-    public void backupAgentCreated(String agentPackageName, IBinder agent) {
-        final int callingUserId = UserHandle.getCallingUserId();
+    public void backupAgentCreated(String agentPackageName, IBinder agent, int userId) {
+        // Resolve the target user id and enforce permissions.
+        userId = mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
+                userId, /* allowAll */ false, ALLOW_FULL_ONLY, "backupAgentCreated", null);
         if (DEBUG_BACKUP) {
             Slog.v(TAG_BACKUP, "backupAgentCreated: " + agentPackageName + " = " + agent
-                    + " callingUserId = " + callingUserId + " callingUid = "
-                    + Binder.getCallingUid() + " uid = " + Process.myUid());
+                    + " callingUserId = " + UserHandle.getCallingUserId() + " userId = " + userId
+                    + " callingUid = " + Binder.getCallingUid() + " uid = " + Process.myUid());
         }
 
         synchronized(this) {
-            final BackupRecord backupTarget = mBackupTargets.get(callingUserId);
+            final BackupRecord backupTarget = mBackupTargets.get(userId);
             String backupAppName = backupTarget == null ? null : backupTarget.appInfo.packageName;
             if (!agentPackageName.equals(backupAppName)) {
                 Slog.e(TAG, "Backup agent created for " + agentPackageName + " but not requested!");
@@ -13770,7 +13841,7 @@
         try {
             IBackupManager bm = IBackupManager.Stub.asInterface(
                     ServiceManager.getService(Context.BACKUP_SERVICE));
-            bm.agentConnectedForUser(callingUserId, agentPackageName, agent);
+            bm.agentConnectedForUser(userId, agentPackageName, agent);
         } catch (RemoteException e) {
             // can't happen; the backup manager service is local
         } catch (Exception e) {
@@ -13823,7 +13894,7 @@
                 if (proc.thread != null) {
                     try {
                         proc.thread.scheduleDestroyBackupAgent(appInfo,
-                                compatibilityInfoForPackage(appInfo));
+                                compatibilityInfoForPackage(appInfo), userId);
                     } catch (Exception e) {
                         Slog.e(TAG, "Exception when unbinding backup agent:");
                         e.printStackTrace();
@@ -14057,7 +14128,8 @@
                     BroadcastQueue queue = broadcastQueueForIntent(intent);
                     BroadcastRecord r = new BroadcastRecord(queue, intent, null,
                             null, -1, -1, false, null, null, OP_NONE, null, receivers,
-                            null, 0, null, null, false, true, true, -1, false);
+                            null, 0, null, null, false, true, true, -1, false,
+                            false /* only PRE_BOOT_COMPLETED should be exempt, no stickies */);
                     queue.enqueueParallelBroadcastLocked(r);
                     queue.scheduleBroadcastsLocked();
                 }
@@ -14442,6 +14514,8 @@
             }
         }
 
+        boolean timeoutExempt = false;
+
         if (action != null) {
             if (getBackgroundLaunchBroadcasts().contains(action)) {
                 if (DEBUG_BACKGROUND_CHECK) {
@@ -14543,10 +14617,9 @@
                                                 -1);
                                         mProcessList.killPackageProcessesLocked(ssp,
                                                 UserHandle.getAppId(extraUid),
-                                                userId, ProcessList.INVALID_ADJ,
-                                                false, true, true, false, "change " + ssp);
+                                                userId, ProcessList.INVALID_ADJ, "change " + ssp);
                                     }
-                                    cleanupDisabledPackageComponentsLocked(ssp, userId, killProcess,
+                                    cleanupDisabledPackageComponentsLocked(ssp, userId,
                                             intent.getStringArrayExtra(
                                                     Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST));
                                 }
@@ -14668,6 +14741,9 @@
                     Log.w(TAG, "Broadcast " + action
                             + " no longer supported. It will not be delivered.");
                     return ActivityManager.BROADCAST_SUCCESS;
+                case Intent.ACTION_PRE_BOOT_COMPLETED:
+                    timeoutExempt = true;
+                    break;
             }
 
             if (Intent.ACTION_PACKAGE_ADDED.equals(action) ||
@@ -14810,7 +14886,7 @@
                     callerPackage, callingPid, callingUid, callerInstantApp, resolvedType,
                     requiredPermissions, appOp, brOptions, registeredReceivers, resultTo,
                     resultCode, resultData, resultExtras, ordered, sticky, false, userId,
-                    allowBackgroundActivityStarts);
+                    allowBackgroundActivityStarts, timeoutExempt);
             if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST, "Enqueueing parallel broadcast " + r);
             final boolean replaced = replacePending
                     && (queue.replaceParallelBroadcastLocked(r) != null);
@@ -14907,12 +14983,9 @@
                     callerPackage, callingPid, callingUid, callerInstantApp, resolvedType,
                     requiredPermissions, appOp, brOptions, receivers, resultTo, resultCode,
                     resultData, resultExtras, ordered, sticky, false, userId,
-                    allowBackgroundActivityStarts);
+                    allowBackgroundActivityStarts, timeoutExempt);
 
-            if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST, "Enqueueing ordered broadcast " + r
-                    + ": prev had " + queue.mOrderedBroadcasts.size());
-            if (DEBUG_BROADCAST) Slog.i(TAG_BROADCAST,
-                    "Enqueueing broadcast " + r.intent.getAction());
+            if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST, "Enqueueing ordered broadcast " + r);
 
             final BroadcastRecord oldRecord =
                     replacePending ? queue.replaceOrderedBroadcastLocked(r) : null;
@@ -15167,7 +15240,9 @@
             IInstrumentationWatcher watcher, IUiAutomationConnection uiAutomationConnection,
             int userId, String abiOverride) {
         enforceNotIsolatedCaller("startInstrumentation");
-        userId = mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
+        final int callingUid = Binder.getCallingUid();
+        final int callingPid = Binder.getCallingPid();
+        userId = mUserController.handleIncomingUser(callingPid, callingUid,
                 userId, false, ALLOW_FULL_ONLY, "startInstrumentation", null);
         // Refuse possible leaked file descriptors
         if (arguments != null && arguments.hasFileDescriptors()) {
@@ -15232,6 +15307,9 @@
             activeInstr.mWatcher = watcher;
             activeInstr.mUiAutomationConnection = uiAutomationConnection;
             activeInstr.mResultClass = className;
+            activeInstr.mHasBackgroundActivityStartsPermission = checkPermission(
+                    START_ACTIVITIES_FROM_BACKGROUND, callingPid, callingUid)
+                            == PackageManager.PERMISSION_GRANTED;
 
             boolean disableHiddenApiChecks = ai.usesNonSdkApi()
                     || (flags & INSTR_FLAG_DISABLE_HIDDEN_API_CHECKS) != 0;
@@ -15788,13 +15866,12 @@
      * Returns true if things are idle enough to perform GCs.
      */
     private final boolean canGcNowLocked() {
-        boolean processingBroadcasts = false;
         for (BroadcastQueue q : mBroadcastQueues) {
-            if (q.mParallelBroadcasts.size() != 0 || q.mOrderedBroadcasts.size() != 0) {
-                processingBroadcasts = true;
+            if (!q.mParallelBroadcasts.isEmpty() || !q.mDispatcher.isEmpty()) {
+                return false;
             }
         }
-        return !processingBroadcasts && mAtmInternal.canGcNow();
+        return mAtmInternal.canGcNow();
     }
 
     /**
@@ -16092,9 +16169,12 @@
 
     @GuardedBy("this")
     final void updateProcessForegroundLocked(ProcessRecord proc, boolean isForeground,
-            boolean oomAdj) {
-        if (isForeground != proc.hasForegroundServices()) {
-            proc.setHasForegroundServices(isForeground);
+            int fgServiceTypes, boolean oomAdj) {
+        final boolean hasFgServiceLocationType =
+                (fgServiceTypes & ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION) != 0;
+        if (isForeground != proc.hasForegroundServices()
+                || proc.hasLocationForegroundServices() != hasFgServiceLocationType) {
+            proc.setHasForegroundServices(isForeground, fgServiceTypes);
             ArrayList<ProcessRecord> curProcs = mForegroundPackages.get(proc.info.packageName,
                     proc.info.uid);
             if (isForeground) {
@@ -17203,10 +17283,8 @@
                             // We don't kill persistent processes.
                             continue;
                         }
-                        if (app.removed) {
-                            procs.add(app);
-                        } else if (app.userId == userHandle && app.hasForegroundActivities()) {
-                            app.removed = true;
+                        if (app.removed
+                                || (app.userId == userHandle && app.hasForegroundActivities())) {
                             procs.add(app);
                         }
                     }
@@ -17594,6 +17672,19 @@
         }
 
         @Override
+        public ActivityPresentationInfo getActivityPresentationInfo(IBinder token) {
+            int displayId = Display.INVALID_DISPLAY;
+            try {
+                displayId = mActivityTaskManager.getActivityDisplayId(token);
+            } catch (RemoteException e) {
+            }
+
+            return new ActivityPresentationInfo(mActivityTaskManager.getTaskForActivity(token,
+                    /*onlyRoot=*/ false), displayId,
+                    mActivityTaskManager.getActivityClassForToken(token));
+        }
+
+        @Override
         public void setBooting(boolean booting) {
             mBooting = booting;
         }
@@ -18051,8 +18142,7 @@
         try {
             synchronized(this) {
                 mProcessList.killPackageProcessesLocked(packageName, UserHandle.getAppId(pkgUid),
-                        userId, ProcessList.FOREGROUND_APP_ADJ, false, true, true, false,
-                        "dep: " + packageName);
+                        userId, ProcessList.FOREGROUND_APP_ADJ, "dep: " + packageName);
             }
         } finally {
             Binder.restoreCallingIdentity(callingId);
@@ -18356,6 +18446,6 @@
     }
 
     private boolean isOnOffloadQueue(int flags) {
-        return ((flags & Intent.FLAG_RECEIVER_OFFLOAD) != 0);
+        return (mEnableOffloadQueue && ((flags & Intent.FLAG_RECEIVER_OFFLOAD) != 0));
     }
 }
diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
index 740c0da..4f6f9fd 100644
--- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
+++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
@@ -1815,7 +1815,7 @@
 
     int runTrackAssociations(PrintWriter pw) {
         mInternal.enforceCallingPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER,
-                "registerUidObserver()");
+                "runTrackAssociations()");
         synchronized (mInternal) {
             if (!mInternal.mTrackingAssociations) {
                 mInternal.mTrackingAssociations = true;
@@ -1829,7 +1829,7 @@
 
     int runUntrackAssociations(PrintWriter pw) {
         mInternal.enforceCallingPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER,
-                "registerUidObserver()");
+                "runUntrackAssociations()");
         synchronized (mInternal) {
             if (mInternal.mTrackingAssociations) {
                 mInternal.mTrackingAssociations = false;
diff --git a/services/core/java/com/android/server/am/AppCompactor.java b/services/core/java/com/android/server/am/AppCompactor.java
index bb55ec31..1118014 100644
--- a/services/core/java/com/android/server/am/AppCompactor.java
+++ b/services/core/java/com/android/server/am/AppCompactor.java
@@ -19,6 +19,7 @@
 import static android.os.Process.THREAD_PRIORITY_FOREGROUND;
 import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_ACTION_1;
 import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_ACTION_2;
+import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_STATSD_SAMPLE_RATE;
 import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_1;
 import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_2;
 import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_3;
@@ -45,6 +46,7 @@
 import java.io.FileOutputStream;
 import java.io.PrintWriter;
 import java.util.ArrayList;
+import java.util.Random;
 
 public final class AppCompactor {
 
@@ -65,6 +67,8 @@
     @VisibleForTesting static final long DEFAULT_COMPACT_THROTTLE_2 = 10_000;
     @VisibleForTesting static final long DEFAULT_COMPACT_THROTTLE_3 = 500;
     @VisibleForTesting static final long DEFAULT_COMPACT_THROTTLE_4 = 10_000;
+    // The sampling rate to push app compaction events into statsd for upload.
+    @VisibleForTesting static final float DEFAULT_STATSD_SAMPLE_RATE = 0.1f;
 
     @VisibleForTesting
     interface PropertyChangedCallbackForTest {
@@ -104,6 +108,8 @@
                                 || KEY_COMPACT_THROTTLE_3.equals(name)
                                 || KEY_COMPACT_THROTTLE_4.equals(name)) {
                             updateCompactionThrottles();
+                        } else if (KEY_COMPACT_STATSD_SAMPLE_RATE.equals(name)) {
+                            updateStatsdSampleRate();
                         }
                     }
                     if (mTestCallback != null) {
@@ -116,21 +122,25 @@
 
     // Configured by phenotype. Updates from the server take effect immediately.
     @GuardedBy("mPhenotypeFlagLock")
-    @VisibleForTesting String mCompactActionSome =
+    @VisibleForTesting volatile String mCompactActionSome =
             compactActionIntToString(DEFAULT_COMPACT_ACTION_1);
     @GuardedBy("mPhenotypeFlagLock")
-    @VisibleForTesting String mCompactActionFull =
+    @VisibleForTesting volatile String mCompactActionFull =
             compactActionIntToString(DEFAULT_COMPACT_ACTION_2);
     @GuardedBy("mPhenotypeFlagLock")
-    @VisibleForTesting long mCompactThrottleSomeSome = DEFAULT_COMPACT_THROTTLE_1;
+    @VisibleForTesting volatile long mCompactThrottleSomeSome = DEFAULT_COMPACT_THROTTLE_1;
     @GuardedBy("mPhenotypeFlagLock")
-    @VisibleForTesting long mCompactThrottleSomeFull = DEFAULT_COMPACT_THROTTLE_2;
+    @VisibleForTesting volatile long mCompactThrottleSomeFull = DEFAULT_COMPACT_THROTTLE_2;
     @GuardedBy("mPhenotypeFlagLock")
-    @VisibleForTesting long mCompactThrottleFullSome = DEFAULT_COMPACT_THROTTLE_3;
+    @VisibleForTesting volatile long mCompactThrottleFullSome = DEFAULT_COMPACT_THROTTLE_3;
     @GuardedBy("mPhenotypeFlagLock")
-    @VisibleForTesting long mCompactThrottleFullFull = DEFAULT_COMPACT_THROTTLE_4;
+    @VisibleForTesting volatile long mCompactThrottleFullFull = DEFAULT_COMPACT_THROTTLE_4;
     @GuardedBy("mPhenotypeFlagLock")
-    private boolean mUseCompaction = DEFAULT_USE_COMPACTION;
+    private volatile boolean mUseCompaction = DEFAULT_USE_COMPACTION;
+
+    private final Random mRandom = new Random();
+    @GuardedBy("mPhenotypeFlagLock")
+    @VisibleForTesting volatile float mStatsdSampleRate = DEFAULT_STATSD_SAMPLE_RATE;
 
     // Handler on which compaction runs.
     private Handler mCompactionHandler;
@@ -158,6 +168,7 @@
             updateUseCompaction();
             updateCompactionActions();
             updateCompactionThrottles();
+            updateStatsdSampleRate();
         }
     }
 
@@ -181,6 +192,7 @@
             pw.println("  " + KEY_COMPACT_THROTTLE_2 + "=" + mCompactThrottleSomeFull);
             pw.println("  " + KEY_COMPACT_THROTTLE_3 + "=" + mCompactThrottleFullSome);
             pw.println("  " + KEY_COMPACT_THROTTLE_4 + "=" + mCompactThrottleFullFull);
+            pw.println("  " + KEY_COMPACT_STATSD_SAMPLE_RATE + "=" + mStatsdSampleRate);
         }
     }
 
@@ -289,6 +301,19 @@
         }
     }
 
+    @GuardedBy("mPhenotypeFlagLock")
+    private void updateStatsdSampleRate() {
+        String sampleRateFlag = DeviceConfig.getProperty(DeviceConfig.ActivityManager.NAMESPACE,
+                KEY_COMPACT_STATSD_SAMPLE_RATE);
+        try {
+            mStatsdSampleRate = TextUtils.isEmpty(sampleRateFlag)
+                    ? DEFAULT_STATSD_SAMPLE_RATE : Float.parseFloat(sampleRateFlag);
+        } catch (NumberFormatException e) {
+            mStatsdSampleRate = DEFAULT_STATSD_SAMPLE_RATE;
+        }
+        mStatsdSampleRate = Math.min(1.0f, Math.max(0.0f, mStatsdSampleRate));
+    }
+
     @VisibleForTesting
     static String compactActionIntToString(int action) {
         switch(action) {
@@ -385,11 +410,16 @@
                                 rssBefore[0], rssBefore[1], rssBefore[2], rssBefore[3],
                                 rssAfter[0], rssAfter[1], rssAfter[2], rssAfter[3], time,
                                 lastCompactAction, lastCompactTime, msg.arg1, msg.arg2);
-                        StatsLog.write(StatsLog.APP_COMPACTED, pid, name, pendingAction,
-                                rssBefore[0], rssBefore[1], rssBefore[2], rssBefore[3],
-                                rssAfter[0], rssAfter[1], rssAfter[2], rssAfter[3], time,
-                                lastCompactAction, lastCompactTime, msg.arg1,
-                                ActivityManager.processStateAmToProto(msg.arg2));
+                        // Note that as above not taking mPhenoTypeFlagLock here to avoid locking
+                        // on every single compaction for a flag that will seldom change and the
+                        // impact of reading the wrong value here is low.
+                        if (mRandom.nextFloat() < mStatsdSampleRate) {
+                            StatsLog.write(StatsLog.APP_COMPACTED, pid, name, pendingAction,
+                                    rssBefore[0], rssBefore[1], rssBefore[2], rssBefore[3],
+                                    rssAfter[0], rssAfter[1], rssAfter[2], rssAfter[3], time,
+                                    lastCompactAction, lastCompactTime, msg.arg1,
+                                    ActivityManager.processStateAmToProto(msg.arg2));
+                        }
                         synchronized (mAm) {
                             proc.lastCompactTime = end;
                             proc.lastCompactAction = pendingAction;
diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java
index a634b57..f153ab9 100644
--- a/services/core/java/com/android/server/am/AppErrors.java
+++ b/services/core/java/com/android/server/am/AppErrors.java
@@ -34,6 +34,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ApplicationInfo;
+import android.content.pm.VersionedPackage;
 import android.net.Uri;
 import android.os.Binder;
 import android.os.Message;
@@ -60,6 +61,7 @@
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
 import java.util.Collections;
+import java.util.List;
 
 /**
  * Controls error conditions in applications.
@@ -411,7 +413,7 @@
             } else {
                 // If a non-persistent app is stuck in crash loop, we want to inform
                 // the package watchdog, maybe an update or experiment can be rolled back.
-                mPackageWatchdog.onPackageFailure(r.getPackageList());
+                mPackageWatchdog.onPackageFailure(r.getPackageListWithVersionCode());
             }
         }
 
@@ -830,7 +832,7 @@
 
     void handleShowAnrUi(Message msg) {
         Dialog dialogToShow = null;
-        String[] packageList = null;
+        List<VersionedPackage> packageList = null;
         synchronized (mService) {
             AppNotRespondingDialog.Data data = (AppNotRespondingDialog.Data) msg.obj;
             final ProcessRecord proc = data.proc;
@@ -839,7 +841,7 @@
                 return;
             }
             if (!proc.isPersistent()) {
-                packageList = proc.getPackageList();
+                packageList = proc.getPackageListWithVersionCode();
             }
             if (proc.anrDialog != null) {
                 Slog.e(TAG, "App already has anr dialog: " + proc);
diff --git a/services/core/java/com/android/server/am/BackupRecord.java b/services/core/java/com/android/server/am/BackupRecord.java
index 40ad383..37b4be4 100644
--- a/services/core/java/com/android/server/am/BackupRecord.java
+++ b/services/core/java/com/android/server/am/BackupRecord.java
@@ -28,14 +28,16 @@
     
     String stringName;                     // cached toString() output
     final ApplicationInfo appInfo;         // information about BackupAgent's app
+    final int userId;                      // user for which backup is performed
     final int backupMode;                  // full backup / incremental / restore
     ProcessRecord app;                     // where this agent is running or null
 
     // ----- Implementation -----
 
-    BackupRecord(ApplicationInfo _appInfo, int _backupMode) {
+    BackupRecord(ApplicationInfo _appInfo, int _backupMode, int _userId) {
         appInfo = _appInfo;
         backupMode = _backupMode;
+        userId = _userId;
     }
 
     public String toString() {
diff --git a/services/core/java/com/android/server/am/BroadcastConstants.java b/services/core/java/com/android/server/am/BroadcastConstants.java
new file mode 100644
index 0000000..820caf1
--- /dev/null
+++ b/services/core/java/com/android/server/am/BroadcastConstants.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.am;
+
+import android.content.ContentResolver;
+import android.database.ContentObserver;
+import android.os.Handler;
+import android.provider.Settings;
+import android.util.KeyValueListParser;
+import android.util.Slog;
+import android.util.TimeUtils;
+
+import java.io.PrintWriter;
+
+/**
+ * Tunable parameters for broadcast dispatch policy
+ */
+public class BroadcastConstants {
+    private static final String TAG = "BroadcastConstants";
+
+    // Value element names within the Settings record
+    static final String KEY_TIMEOUT = "bcast_timeout";
+    static final String KEY_SLOW_TIME = "bcast_slow_time";
+    static final String KEY_DEFERRAL = "bcast_deferral";
+    static final String KEY_DEFERRAL_DECAY_FACTOR = "bcast_deferral_decay_factor";
+    static final String KEY_DEFERRAL_FLOOR = "bcast_deferral_floor";
+
+    // All time intervals are in milliseconds
+    private static final long DEFAULT_TIMEOUT = 10_000;
+    private static final long DEFAULT_SLOW_TIME = 5_000;
+    private static final long DEFAULT_DEFERRAL = 5_000;
+    private static final float DEFAULT_DEFERRAL_DECAY_FACTOR = 0.75f;
+    private static final long DEFAULT_DEFERRAL_FLOOR = 0;
+
+    // All time constants are in milliseconds
+
+    // Timeout period for this broadcast queue
+    public long TIMEOUT = DEFAULT_TIMEOUT;
+    // Handling time above which we declare that a broadcast recipient was "slow".  Any
+    // value <= zero is interpreted as disabling broadcast deferral policy entirely.
+    public long SLOW_TIME = DEFAULT_SLOW_TIME;
+    // How long to initially defer broadcasts, if an app is slow to handle one
+    public long DEFERRAL = DEFAULT_DEFERRAL;
+    // Decay factor for successive broadcasts' deferral time
+    public float DEFERRAL_DECAY_FACTOR = DEFAULT_DEFERRAL_DECAY_FACTOR;
+    // Minimum that the deferral time can decay to until the backlog fully clears
+    public long DEFERRAL_FLOOR = DEFAULT_DEFERRAL_FLOOR;
+
+    // Settings override tracking for this instance
+    private String mSettingsKey;
+    private SettingsObserver mSettingsObserver;
+    private ContentResolver mResolver;
+    private final KeyValueListParser mParser = new KeyValueListParser(',');
+
+    class SettingsObserver extends ContentObserver {
+        SettingsObserver(Handler handler) {
+            super(handler);
+        }
+
+        @Override
+        public void onChange(boolean selfChange) {
+            updateConstants();
+        }
+    }
+
+    // A given constants instance is configured to observe specific keys from which
+    // that instance's values are drawn.
+    public BroadcastConstants(String settingsKey) {
+        mSettingsKey = settingsKey;
+    }
+
+    /**
+     * Spin up the observer lazily, since it can only happen once the settings provider
+     * has been brought into service
+     */
+    public void startObserving(Handler handler, ContentResolver resolver) {
+        mResolver = resolver;
+
+        mSettingsObserver = new SettingsObserver(handler);
+        mResolver.registerContentObserver(Settings.Global.getUriFor(mSettingsKey),
+                false, mSettingsObserver);
+
+        updateConstants();
+    }
+
+    private void updateConstants() {
+        synchronized (mParser) {
+            try {
+                mParser.setString(Settings.Global.getString(mResolver, mSettingsKey));
+            } catch (IllegalArgumentException e) {
+                Slog.e(TAG, "Bad broadcast settings in key '" + mSettingsKey + "'", e);
+                return;
+            }
+
+            // Unspecified fields retain their current value rather than revert to default
+            TIMEOUT = mParser.getLong(KEY_TIMEOUT, TIMEOUT);
+            SLOW_TIME = mParser.getLong(KEY_SLOW_TIME, SLOW_TIME);
+            DEFERRAL = mParser.getLong(KEY_DEFERRAL, DEFERRAL);
+            DEFERRAL_DECAY_FACTOR = mParser.getFloat(KEY_DEFERRAL_DECAY_FACTOR,
+                    DEFERRAL_DECAY_FACTOR);
+            DEFERRAL_FLOOR = mParser.getLong(KEY_DEFERRAL_FLOOR, DEFERRAL_FLOOR);
+        }
+    }
+
+    /**
+     * Standard dumpsys support; invoked from BroadcastQueue dump
+     */
+    public void dump(PrintWriter pw) {
+        synchronized (mParser) {
+            pw.println();
+            pw.print("  Broadcast parameters (key=");
+            pw.print(mSettingsKey);
+            pw.print(", observing=");
+            pw.print(mSettingsObserver != null);
+            pw.println("):");
+
+            pw.print("    "); pw.print(KEY_TIMEOUT); pw.print(" = ");
+            TimeUtils.formatDuration(TIMEOUT, pw);
+            pw.println();
+
+            pw.print("    "); pw.print(KEY_SLOW_TIME); pw.print(" = ");
+            TimeUtils.formatDuration(SLOW_TIME, pw);
+            pw.println();
+
+            pw.print("    "); pw.print(KEY_DEFERRAL); pw.print(" = ");
+            TimeUtils.formatDuration(DEFERRAL, pw);
+            pw.println();
+
+            pw.print("    "); pw.print(KEY_DEFERRAL_DECAY_FACTOR); pw.print(" = ");
+            pw.println(DEFERRAL_DECAY_FACTOR);
+
+            pw.print("    "); pw.print(KEY_DEFERRAL_FLOOR); pw.print(" = ");
+            TimeUtils.formatDuration(DEFERRAL_FLOOR, pw);
+            pw.println();
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/am/BroadcastDispatcher.java b/services/core/java/com/android/server/am/BroadcastDispatcher.java
new file mode 100644
index 0000000..6371cd3
--- /dev/null
+++ b/services/core/java/com/android/server/am/BroadcastDispatcher.java
@@ -0,0 +1,687 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.am;
+
+import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BROADCAST;
+import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BROADCAST_DEFERRAL;
+
+import android.content.Intent;
+import android.os.Handler;
+import android.os.SystemClock;
+import android.util.Slog;
+import android.util.SparseIntArray;
+import android.util.proto.ProtoOutputStream;
+
+import com.android.server.AlarmManagerInternal;
+import com.android.server.LocalServices;
+
+import java.io.PrintWriter;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Set;
+
+/**
+ * Manages ordered broadcast delivery, applying policy to mitigate the effects of
+ * slow receivers.
+ */
+public class BroadcastDispatcher {
+    private static final String TAG = "BroadcastDispatcher";
+
+    // Deferred broadcasts to one app; times are all uptime time base like
+    // other broadcast-related timekeeping
+    static class Deferrals {
+        final int uid;
+        long deferredAt;    // when we started deferring
+        long deferredBy;    // how long did we defer by last time?
+        long deferUntil;    // when does the next element become deliverable?
+        int alarmCount;
+
+        final ArrayList<BroadcastRecord> broadcasts;
+
+        Deferrals(int uid, long now, long backoff, int count) {
+            this.uid = uid;
+            this.deferredAt = now;
+            this.deferredBy = backoff;
+            this.deferUntil = now + backoff;
+            this.alarmCount = count;
+            broadcasts = new ArrayList<>();
+        }
+
+        void add(BroadcastRecord br) {
+            broadcasts.add(br);
+        }
+
+        void writeToProto(ProtoOutputStream proto, long fieldId) {
+            for (BroadcastRecord br : broadcasts) {
+                br.writeToProto(proto, fieldId);
+            }
+        }
+
+        void dumpLocked(Dumper d) {
+            for (BroadcastRecord br : broadcasts) {
+                d.dump(br);
+            }
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder sb = new StringBuilder(128);
+            sb.append("Deferrals{uid=");
+            sb.append(uid);
+            sb.append(", deferUntil=");
+            sb.append(deferUntil);
+            sb.append(", #broadcasts=");
+            sb.append(broadcasts.size());
+            sb.append("}");
+            return sb.toString();
+        }
+    }
+
+    // Carrying dump formatting state across multiple concatenated datasets
+    class Dumper {
+        final PrintWriter mPw;
+        final String mQueueName;
+        final String mDumpPackage;
+        final SimpleDateFormat mSdf;
+        boolean mPrinted;
+        boolean mNeedSep;
+        String mHeading;
+        String mLabel;
+        int mOrdinal;
+
+        Dumper(PrintWriter pw, String queueName, String dumpPackage, SimpleDateFormat sdf) {
+            mPw = pw;
+            mQueueName = queueName;
+            mDumpPackage = dumpPackage;
+            mSdf = sdf;
+
+            mPrinted = false;
+            mNeedSep = true;
+        }
+
+        void setHeading(String heading) {
+            mHeading = heading;
+            mPrinted = false;
+        }
+
+        void setLabel(String label) {
+            //"  Active Ordered Broadcast " + mQueueName + " #" + i + ":"
+            mLabel = "  " + label + " " + mQueueName + " #";
+            mOrdinal = 0;
+        }
+
+        boolean didPrint() {
+            return mPrinted;
+        }
+
+        void dump(BroadcastRecord br) {
+            if (mDumpPackage == null || mDumpPackage.equals(br.callerPackage)) {
+                if (!mPrinted) {
+                    if (mNeedSep) {
+                        mPw.println();
+                    }
+                    mPrinted = true;
+                    mNeedSep = true;
+                    mPw.println("  " + mHeading + " [" + mQueueName + "]:");
+                }
+                mPw.println(mLabel + mOrdinal + ":");
+                mOrdinal++;
+
+                br.dump(mPw, "    ", mSdf);
+            }
+        }
+    }
+
+    private final Object mLock;
+    private final BroadcastQueue mQueue;
+    private final BroadcastConstants mConstants;
+    private final Handler mHandler;
+    private AlarmManagerInternal mAlarm;
+
+    // Current alarm targets; mapping uid -> in-flight alarm count
+    final SparseIntArray mAlarmUids = new SparseIntArray();
+    final AlarmManagerInternal.InFlightListener mAlarmListener =
+            new AlarmManagerInternal.InFlightListener() {
+        @Override
+        public void broadcastAlarmPending(final int recipientUid) {
+            synchronized (mLock) {
+                final int newCount = mAlarmUids.get(recipientUid, 0) + 1;
+                mAlarmUids.put(recipientUid, newCount);
+                // any deferred broadcasts to this app now get fast-tracked
+                final int numEntries = mDeferredBroadcasts.size();
+                for (int i = 0; i < numEntries; i++) {
+                    if (recipientUid == mDeferredBroadcasts.get(i).uid) {
+                        Deferrals d = mDeferredBroadcasts.remove(i);
+                        mAlarmBroadcasts.add(d);
+                        break;
+                    }
+                }
+            }
+        }
+
+        @Override
+        public void broadcastAlarmComplete(final int recipientUid) {
+            synchronized (mLock) {
+                final int newCount = mAlarmUids.get(recipientUid, 0) - 1;
+                if (newCount >= 0) {
+                    mAlarmUids.put(recipientUid, newCount);
+                } else {
+                    Slog.wtf(TAG, "Undercount of broadcast alarms in flight for " + recipientUid);
+                    mAlarmUids.put(recipientUid, 0);
+                }
+
+                // No longer an alarm target, so resume ordinary deferral policy
+                if (newCount <= 0) {
+                    final int numEntries = mAlarmBroadcasts.size();
+                    for (int i = 0; i < numEntries; i++) {
+                        if (recipientUid == mAlarmBroadcasts.get(i).uid) {
+                            Deferrals d = mAlarmBroadcasts.remove(i);
+                            insertLocked(mDeferredBroadcasts, d);
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+    };
+
+    // Queue recheck operation used to tickle broadcast delivery when appropriate
+    final Runnable mScheduleRunnable = new Runnable() {
+        @Override
+        public void run() {
+            synchronized (mLock) {
+                if (DEBUG_BROADCAST_DEFERRAL) {
+                    Slog.v(TAG, "Deferral recheck of pending broadcasts");
+                }
+                mQueue.scheduleBroadcastsLocked();
+                mRecheckScheduled = false;
+            }
+        }
+    };
+    private boolean mRecheckScheduled = false;
+
+    // Usual issuance-order outbound queue
+    private final ArrayList<BroadcastRecord> mOrderedBroadcasts = new ArrayList<>();
+    // General deferrals not holding up alarms
+    private final ArrayList<Deferrals> mDeferredBroadcasts = new ArrayList<>();
+    // Deferrals that *are* holding up alarms; ordered by alarm dispatch time
+    private final ArrayList<Deferrals> mAlarmBroadcasts = new ArrayList<>();
+
+    // Next outbound broadcast, established by getNextBroadcastLocked()
+    private BroadcastRecord mCurrentBroadcast;
+
+    /**
+     * Constructed & sharing a lock with its associated BroadcastQueue instance
+     */
+    public BroadcastDispatcher(BroadcastQueue queue, BroadcastConstants constants,
+            Handler handler, Object lock) {
+        mQueue = queue;
+        mConstants = constants;
+        mHandler = handler;
+        mLock = lock;
+    }
+
+    /**
+     * Spin up the integration with the alarm manager service; done lazily to manage
+     * service availability ordering during boot.
+     */
+    public void start() {
+        // Set up broadcast alarm tracking
+        mAlarm = LocalServices.getService(AlarmManagerInternal.class);
+        mAlarm.registerInFlightListener(mAlarmListener);
+    }
+
+    /**
+     * Standard contents-are-empty check
+     */
+    public boolean isEmpty() {
+        synchronized (mLock) {
+            return mCurrentBroadcast == null
+                    && mOrderedBroadcasts.isEmpty()
+                    && mDeferredBroadcasts.isEmpty()
+                    && mAlarmBroadcasts.isEmpty();
+        }
+    }
+
+    /**
+     * Not quite the traditional size() measurement; includes any in-process but
+     * not yet retired active outbound broadcast.
+     */
+    public int totalUndelivered() {
+        synchronized (mLock) {
+            return mAlarmBroadcasts.size()
+                    + mDeferredBroadcasts.size()
+                    + mOrderedBroadcasts.size()
+                    + (mCurrentBroadcast == null ? 0 : 1);
+        }
+    }
+
+    // ----------------------------------
+    // BroadcastQueue operation support
+
+    void enqueueOrderedBroadcastLocked(BroadcastRecord r) {
+        mOrderedBroadcasts.add(r);
+    }
+
+    // Returns the now-replaced broadcast record, or null if none
+    BroadcastRecord replaceBroadcastLocked(BroadcastRecord r, String typeForLogging) {
+        // Simple case, in the ordinary queue.
+        BroadcastRecord old = replaceBroadcastLocked(mOrderedBroadcasts, r, typeForLogging);
+
+        // If we didn't find it, less-simple:  in a deferral queue?
+        if (old == null) {
+            old = replaceDeferredBroadcastLocked(mAlarmBroadcasts, r, typeForLogging);
+        }
+        if (old == null) {
+            old = replaceDeferredBroadcastLocked(mDeferredBroadcasts, r, typeForLogging);
+        }
+        return old;
+    }
+
+    private BroadcastRecord replaceDeferredBroadcastLocked(ArrayList<Deferrals> list,
+            BroadcastRecord r, String typeForLogging) {
+        BroadcastRecord old;
+        final int numEntries = list.size();
+        for (int i = 0; i < numEntries; i++) {
+            final Deferrals d = list.get(i);
+            old = replaceBroadcastLocked(d.broadcasts, r, typeForLogging);
+            if (old != null) {
+                return old;
+            }
+        }
+        return null;
+    }
+
+    private BroadcastRecord replaceBroadcastLocked(ArrayList<BroadcastRecord> list,
+            BroadcastRecord r, String typeForLogging) {
+        BroadcastRecord old;
+        final Intent intent = r.intent;
+        // Any in-flight broadcast has already been popped, and cannot be replaced.
+        // (This preserves existing behavior of the replacement API)
+        for (int i = list.size() - 1; i >= 0; i--) {
+            old = list.get(i);
+            if (old.userId == r.userId && intent.filterEquals(old.intent)) {
+                if (DEBUG_BROADCAST) {
+                    Slog.v(TAG, "***** Replacing " + typeForLogging
+                            + " [" + mQueue.mQueueName + "]: " + intent);
+                }
+                // Clone deferral state too if any
+                r.deferred = old.deferred;
+                list.set(i, r);
+                return old;
+            }
+        }
+        return null;
+    }
+
+    boolean cleanupDisabledPackageReceiversLocked(final String packageName,
+            Set<String> filterByClasses, final int userId, final boolean doit) {
+        // Note: fast short circuits when 'doit' is false, as soon as we hit any
+        // "yes we would do something" circumstance
+        boolean didSomething = cleanupBroadcastListDisabledReceiversLocked(mOrderedBroadcasts,
+                packageName, filterByClasses, userId, doit);
+        if (doit || !didSomething) {
+            didSomething |= cleanupDeferralsListDisabledReceiversLocked(mAlarmBroadcasts,
+                    packageName, filterByClasses, userId, doit);
+        }
+        if (doit || !didSomething) {
+            didSomething |= cleanupDeferralsListDisabledReceiversLocked(mDeferredBroadcasts,
+                    packageName, filterByClasses, userId, doit);
+        }
+        if ((doit || !didSomething) && mCurrentBroadcast != null) {
+            didSomething |= mCurrentBroadcast.cleanupDisabledPackageReceiversLocked(
+                    packageName, filterByClasses, userId, doit);
+        }
+
+        return didSomething;
+    }
+
+    private boolean cleanupDeferralsListDisabledReceiversLocked(ArrayList<Deferrals> list,
+            final String packageName, Set<String> filterByClasses, final int userId,
+            final boolean doit) {
+        boolean didSomething = false;
+        for (Deferrals d : list) {
+            didSomething = cleanupBroadcastListDisabledReceiversLocked(d.broadcasts,
+                    packageName, filterByClasses, userId, doit);
+            if (!doit && didSomething) {
+                return true;
+            }
+        }
+        return didSomething;
+    }
+
+    private boolean cleanupBroadcastListDisabledReceiversLocked(ArrayList<BroadcastRecord> list,
+            final String packageName, Set<String> filterByClasses, final int userId,
+            final boolean doit) {
+        boolean didSomething = false;
+        for (BroadcastRecord br : list) {
+            didSomething |= br.cleanupDisabledPackageReceiversLocked(packageName,
+                    filterByClasses, userId, doit);
+            if (!doit && didSomething) {
+                return true;
+            }
+        }
+        return didSomething;
+    }
+
+    /**
+     * Standard proto dump entry point
+     */
+    public void writeToProto(ProtoOutputStream proto, long fieldId) {
+        if (mCurrentBroadcast != null) {
+            mCurrentBroadcast.writeToProto(proto, fieldId);
+        }
+        for (Deferrals d : mAlarmBroadcasts) {
+            d.writeToProto(proto, fieldId);
+        }
+        for (BroadcastRecord br : mOrderedBroadcasts) {
+            br.writeToProto(proto, fieldId);
+        }
+        for (Deferrals d : mDeferredBroadcasts) {
+            d.writeToProto(proto, fieldId);
+        }
+    }
+
+    // ----------------------------------
+    // Dispatch & deferral management
+
+    public BroadcastRecord getActiveBroadcastLocked() {
+        return mCurrentBroadcast;
+    }
+
+    /**
+     * If there is a deferred broadcast that is being sent to an alarm target, return
+     * that one.  If there's no deferred alarm target broadcast but there is one
+     * that has reached the end of its deferral, return that.
+     *
+     * This stages the broadcast internally until it is retired, and returns that
+     * staged record if this is called repeatedly, until retireBroadcast(r) is called.
+     */
+    public BroadcastRecord getNextBroadcastLocked(final long now) {
+        if (mCurrentBroadcast != null) {
+            return mCurrentBroadcast;
+        }
+
+        BroadcastRecord next = null;
+        if (!mAlarmBroadcasts.isEmpty()) {
+            next = popLocked(mAlarmBroadcasts);
+            if (DEBUG_BROADCAST_DEFERRAL && next != null) {
+                Slog.i(TAG, "Next broadcast from alarm targets: " + next);
+            }
+        }
+
+        if (next == null && !mDeferredBroadcasts.isEmpty()) {
+            for (int i = 0; i < mDeferredBroadcasts.size(); i++) {
+                Deferrals d = mDeferredBroadcasts.get(i);
+                if (now < d.deferUntil) {
+                    // No more deferrals due
+                    break;
+                }
+
+                if (d.broadcasts.size() > 0) {
+                    next = d.broadcasts.remove(0);
+                    // apply deferral-interval decay policy and move this uid's
+                    // deferred broadcasts down in the delivery queue accordingly
+                    mDeferredBroadcasts.remove(i); // already 'd'
+                    d.deferredBy = calculateDeferral(d.deferredBy);
+                    d.deferUntil += d.deferredBy;
+                    insertLocked(mDeferredBroadcasts, d);
+                    if (DEBUG_BROADCAST_DEFERRAL) {
+                        Slog.i(TAG, "Next broadcast from deferrals " + next
+                                + ", deferUntil now " + d.deferUntil);
+                    }
+                    break;
+                }
+            }
+        }
+
+        if (next == null && !mOrderedBroadcasts.isEmpty()) {
+            next = mOrderedBroadcasts.remove(0);
+            if (DEBUG_BROADCAST_DEFERRAL) {
+                Slog.i(TAG, "Next broadcast from main queue: " + next);
+            }
+        }
+
+        mCurrentBroadcast = next;
+        return next;
+    }
+
+    /**
+     * Called after the broadcast queue finishes processing the currently
+     * active broadcast (obtained by calling getNextBroadcastLocked()).
+     */
+    public void retireBroadcastLocked(final BroadcastRecord r) {
+        // ERROR if 'r' is not the active broadcast
+        if (r != mCurrentBroadcast) {
+            Slog.wtf(TAG, "Retiring broadcast " + r
+                    + " doesn't match current outgoing " + mCurrentBroadcast);
+        }
+        mCurrentBroadcast = null;
+    }
+
+    /**
+     * Called prior to broadcast dispatch to check whether the intended
+     * recipient is currently subject to deferral policy.
+     */
+    public boolean isDeferringLocked(final int uid) {
+        Deferrals d = findUidLocked(uid);
+        if (d != null && d.broadcasts.isEmpty()) {
+            // once we've caught up with deferred broadcasts to this uid
+            // and time has advanced sufficiently that we wouldn't be
+            // deferring newly-enqueued ones, we're back to normal policy.
+            if (SystemClock.uptimeMillis() >= d.deferUntil) {
+                if (DEBUG_BROADCAST_DEFERRAL) {
+                    Slog.i(TAG, "No longer deferring broadcasts to uid " + d.uid);
+                }
+                removeDeferral(d);
+                return false;
+            }
+        }
+        return (d != null);
+    }
+
+    /**
+     * Defer broadcasts for the given app.  If 'br' is non-null, this also makes
+     * sure that broadcast record is enqueued as the next upcoming broadcast for
+     * the app.
+     */
+    public void startDeferring(final int uid) {
+        synchronized (mLock) {
+            Deferrals d = findUidLocked(uid);
+
+            // If we're not yet tracking this app, set up that bookkeeping
+            if (d == null) {
+                // Start a new deferral
+                final long now = SystemClock.uptimeMillis();
+                d = new Deferrals(uid,
+                        now,
+                        mConstants.DEFERRAL,
+                        mAlarmUids.get(uid, 0));
+                if (DEBUG_BROADCAST_DEFERRAL) {
+                    Slog.i(TAG, "Now deferring broadcasts to " + uid
+                            + " until " + d.deferUntil);
+                }
+                // where it goes depends on whether it is coming into an alarm-related situation
+                if (d.alarmCount == 0) {
+                    // common case, put it in the ordinary priority queue
+                    insertLocked(mDeferredBroadcasts, d);
+                    scheduleDeferralCheckLocked(true);
+                } else {
+                    // alarm-related: strict order-encountered
+                    mAlarmBroadcasts.add(d);
+                }
+            } else {
+                // We're already deferring, but something was slow again.  Reset the
+                // deferral decay progression.
+                d.deferredBy = mConstants.DEFERRAL;
+                if (DEBUG_BROADCAST_DEFERRAL) {
+                    Slog.i(TAG, "Uid " + uid + " slow again, deferral interval reset to "
+                            + d.deferredBy);
+                }
+            }
+        }
+    }
+
+    /**
+     * Key entry point when a broadcast about to be delivered is instead
+     * set aside for deferred delivery
+     */
+    public void addDeferredBroadcast(final int uid, BroadcastRecord br) {
+        if (DEBUG_BROADCAST_DEFERRAL) {
+            Slog.i(TAG, "Enqueuing deferred broadcast " + br);
+        }
+        synchronized (mLock) {
+            Deferrals d = findUidLocked(uid);
+            if (d == null) {
+                Slog.wtf(TAG, "Adding deferred broadcast but not tracking " + uid);
+            } else {
+                if (br == null) {
+                    Slog.wtf(TAG, "Deferring null broadcast to " + uid);
+                } else {
+                    br.deferred = true;
+                    d.add(br);
+                }
+            }
+        }
+    }
+
+    /**
+     * When there are deferred broadcasts, we need to make sure to recheck the
+     * dispatch queue when they come due.  Alarm-sensitive deferrals get dispatched
+     * aggressively, so we only need to use the ordinary deferrals timing to figure
+     * out when to recheck.
+     */
+    public void scheduleDeferralCheckLocked(boolean force) {
+        if ((force || !mRecheckScheduled) && !mDeferredBroadcasts.isEmpty()) {
+            final Deferrals d = mDeferredBroadcasts.get(0);
+            if (!d.broadcasts.isEmpty()) {
+                mHandler.removeCallbacks(mScheduleRunnable);
+                mHandler.postAtTime(mScheduleRunnable, d.deferUntil);
+                mRecheckScheduled = true;
+                if (DEBUG_BROADCAST_DEFERRAL) {
+                    Slog.i(TAG, "Scheduling deferred broadcast recheck at " + d.deferUntil);
+                }
+            }
+        }
+    }
+
+    // ----------------------------------
+
+    /**
+     * If broadcasts to this uid are being deferred, find the deferrals record about it.
+     * @return null if this uid's broadcasts are not being deferred
+     */
+    private Deferrals findUidLocked(final int uid) {
+        // The common case is that they it isn't also an alarm target...
+        Deferrals d = findUidLocked(uid, mDeferredBroadcasts);
+        // ...but if not there, also check alarm-prioritized deferrals
+        if (d == null) {
+            d = findUidLocked(uid, mAlarmBroadcasts);
+        }
+        return d;
+    }
+
+    /**
+     * Remove the given deferral record from whichever queue it might be in at present
+     * @return true if the deferral was in fact found, false if this made no changes
+     */
+    private boolean removeDeferral(Deferrals d) {
+        boolean didRemove = mDeferredBroadcasts.remove(d);
+        if (!didRemove) {
+            didRemove = mAlarmBroadcasts.remove(d);
+        }
+        return didRemove;
+    }
+
+    /**
+     * Find the deferrals record for the given uid in the given list
+     */
+    private static Deferrals findUidLocked(final int uid, ArrayList<Deferrals> list) {
+        final int numElements = list.size();
+        for (int i = 0; i < numElements; i++) {
+            Deferrals d = list.get(i);
+            if (uid == d.uid) {
+                return d;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Pop the next broadcast record from the head of the given deferrals list,
+     * if one exists.
+     */
+    private static BroadcastRecord popLocked(ArrayList<Deferrals> list) {
+        final Deferrals d = list.get(0);
+        return d.broadcasts.isEmpty() ? null : d.broadcasts.remove(0);
+    }
+
+    /**
+     * Insert the given Deferrals into the priority queue, sorted by defer-until milestone
+     */
+    private static void insertLocked(ArrayList<Deferrals> list, Deferrals d) {
+        // Simple linear search is appropriate here because we expect to
+        // have very few entries in the deferral lists (i.e. very few badly-
+        // behaving apps currently facing deferral)
+        int i;
+        final int numElements = list.size();
+        for (i = 0; i < numElements; i++) {
+            if (d.deferUntil < list.get(i).deferUntil) {
+                break;
+            }
+        }
+        list.add(i, d);
+    }
+
+    /**
+     * Calculate a new deferral time based on the previous time.  This should decay
+     * toward zero, though a small nonzero floor is an option.
+     */
+    private long calculateDeferral(long previous) {
+        return Math.max(mConstants.DEFERRAL_FLOOR,
+                (long) (previous * mConstants.DEFERRAL_DECAY_FACTOR));
+    }
+
+    // ----------------------------------
+
+    boolean dumpLocked(PrintWriter pw, String dumpPackage, String queueName,
+            SimpleDateFormat sdf) {
+        final Dumper dumper = new Dumper(pw, queueName, dumpPackage, sdf);
+        boolean printed = false;
+
+        dumper.setHeading("Active ordered broadcasts");
+        dumper.setLabel("Active Ordered Broadcast");
+        for (Deferrals d : mAlarmBroadcasts) {
+            d.dumpLocked(dumper);
+        }
+        printed |= dumper.didPrint();
+
+        for (BroadcastRecord br : mOrderedBroadcasts) {
+            dumper.dump(br);
+        }
+        printed |= dumper.didPrint();
+
+        dumper.setHeading("Deferred ordered broadcasts");
+        dumper.setLabel("Deferred Ordered Broadcast");
+        for (Deferrals d : mDeferredBroadcasts) {
+            d.dumpLocked(dumper);
+        }
+        printed |= dumper.didPrint();
+
+        return printed;
+    }
+}
diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java
index cdf6e0e..a11ebfd 100644
--- a/services/core/java/com/android/server/am/BroadcastQueue.java
+++ b/services/core/java/com/android/server/am/BroadcastQueue.java
@@ -24,6 +24,7 @@
 import android.app.BroadcastOptions;
 import android.app.PendingIntent;
 import android.content.ComponentName;
+import android.content.ContentResolver;
 import android.content.IIntentReceiver;
 import android.content.IIntentSender;
 import android.content.Intent;
@@ -45,6 +46,7 @@
 import android.os.UserHandle;
 import android.util.EventLog;
 import android.util.Slog;
+import android.util.SparseIntArray;
 import android.util.StatsLog;
 import android.util.TimeUtils;
 import android.util.proto.ProtoOutputStream;
@@ -75,16 +77,17 @@
     final ActivityManagerService mService;
 
     /**
+     * Behavioral parameters such as timeouts and deferral policy, tracking Settings
+     * for runtime configurability
+     */
+    final BroadcastConstants mConstants;
+
+    /**
      * Recognizable moniker for this queue
      */
     final String mQueueName;
 
     /**
-     * Timeout period for this queue's broadcasts
-     */
-    final long mTimeoutPeriod;
-
-    /**
      * If true, we can delay broadcasts while waiting services to finish in the previous
      * receiver's process.
      */
@@ -100,13 +103,18 @@
     final ArrayList<BroadcastRecord> mParallelBroadcasts = new ArrayList<>();
 
     /**
-     * List of all active broadcasts that are to be executed one at a time.
-     * The object at the top of the list is the currently activity broadcasts;
-     * those after it are waiting for the top to finish.  As with parallel
-     * broadcasts, separate background- and foreground-priority queues are
-     * maintained.
+     * Tracking of the ordered broadcast queue, including deferral policy and alarm
+     * prioritization.
      */
-    final ArrayList<BroadcastRecord> mOrderedBroadcasts = new ArrayList<>();
+    final BroadcastDispatcher mDispatcher;
+
+    /**
+     * Refcounting for completion callbacks of split/deferred broadcasts.  The key
+     * is an opaque integer token assigned lazily when a broadcast is first split
+     * into multiple BroadcastRecord objects.
+     */
+    final SparseIntArray mSplitRefcounts = new SparseIntArray();
+    private int mNextToken = 0;
 
     /**
      * Historical data of past broadcasts, for debugging.  This is a ring buffer
@@ -173,7 +181,8 @@
             switch (msg.what) {
                 case BROADCAST_INTENT_MSG: {
                     if (DEBUG_BROADCAST) Slog.v(
-                            TAG_BROADCAST, "Received BROADCAST_INTENT_MSG");
+                            TAG_BROADCAST, "Received BROADCAST_INTENT_MSG ["
+                            + mQueueName + "]");
                     processNextBroadcast(true);
                 } break;
                 case BROADCAST_TIMEOUT_MSG: {
@@ -201,12 +210,19 @@
     }
 
     BroadcastQueue(ActivityManagerService service, Handler handler,
-            String name, long timeoutPeriod, boolean allowDelayBehindServices) {
+            String name, BroadcastConstants constants, boolean allowDelayBehindServices) {
         mService = service;
         mHandler = new BroadcastHandler(handler.getLooper());
         mQueueName = name;
-        mTimeoutPeriod = timeoutPeriod;
         mDelayBehindServices = allowDelayBehindServices;
+
+        mConstants = constants;
+        mDispatcher = new BroadcastDispatcher(this, mConstants, mHandler, mService);
+    }
+
+    void start(ContentResolver resolver) {
+        mDispatcher.start();
+        mConstants.startObserving(mHandler, resolver);
     }
 
     @Override
@@ -224,7 +240,7 @@
     }
 
     public void enqueueOrderedBroadcastLocked(BroadcastRecord r) {
-        mOrderedBroadcasts.add(r);
+        mDispatcher.enqueueOrderedBroadcastLocked(r);
         enqueueBroadcastHelper(r);
     }
 
@@ -255,7 +271,7 @@
      * the old one.
      */
     public final BroadcastRecord replaceOrderedBroadcastLocked(BroadcastRecord r) {
-        return replaceBroadcastLocked(mOrderedBroadcasts, r, "ORDERED");
+        return mDispatcher.replaceBroadcastLocked(r, "ORDERED");
     }
 
     private BroadcastRecord replaceBroadcastLocked(ArrayList<BroadcastRecord> queue,
@@ -365,14 +381,17 @@
         }
     }
 
+    // Skip the current receiver, if any, that is in flight to the given process
     public void skipCurrentReceiverLocked(ProcessRecord app) {
         BroadcastRecord r = null;
-        if (mOrderedBroadcasts.size() > 0) {
-            BroadcastRecord br = mOrderedBroadcasts.get(0);
-            if (br.curApp == app) {
-                r = br;
-            }
+        final BroadcastRecord curActive = mDispatcher.getActiveBroadcastLocked();
+        if (curActive != null && curActive.curApp == app) {
+            // confirmed: the current active broadcast is to the given app
+            r = curActive;
         }
+
+        // If the current active broadcast isn't this BUT we're waiting for
+        // mPendingBroadcast to spin up the target app, that's what we use.
         if (r == null && mPendingBroadcast != null && mPendingBroadcast.curApp == app) {
             if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST,
                     "[" + mQueueName + "] skip & discard pending app " + r);
@@ -404,32 +423,62 @@
     }
 
     public BroadcastRecord getMatchingOrderedReceiver(IBinder receiver) {
-        if (mOrderedBroadcasts.size() > 0) {
-            final BroadcastRecord r = mOrderedBroadcasts.get(0);
-            if (r != null && r.receiver == receiver) {
-                return r;
-            }
+        BroadcastRecord br = mDispatcher.getActiveBroadcastLocked();
+        if (br != null && br.receiver == receiver) {
+            return br;
         }
         return null;
     }
 
+    // > 0 only, no worry about "eventual" recycling
+    private int nextSplitTokenLocked() {
+        int next = mNextToken + 1;
+        if (next <= 0) {
+            next = 1;
+        }
+        mNextToken = next;
+        return next;
+    }
+
     public boolean finishReceiverLocked(BroadcastRecord r, int resultCode,
             String resultData, Bundle resultExtras, boolean resultAbort, boolean waitForServices) {
         final int state = r.state;
         final ActivityInfo receiver = r.curReceiver;
         final long finishTime = SystemClock.uptimeMillis();
+        final long elapsed = finishTime - r.receiverTime;
         r.state = BroadcastRecord.IDLE;
         if (state == BroadcastRecord.IDLE) {
             Slog.w(TAG, "finishReceiver [" + mQueueName + "] called but state is IDLE");
         }
-        if (r.allowBackgroundActivityStarts) {
+        if (r.allowBackgroundActivityStarts && r.curApp != null) {
             r.curApp.removeAllowBackgroundActivityStartsToken(r);
          }
         // If we're abandoning this broadcast before any receivers were actually spun up,
         // nextReceiver is zero; in which case time-to-process bookkeeping doesn't apply.
         if (r.nextReceiver > 0) {
-            r.duration[r.nextReceiver - 1] = finishTime - r.receiverTime;
+            r.duration[r.nextReceiver - 1] = elapsed;
         }
+
+        // if this receiver was slow, impose deferral policy on the app.  This will kick in
+        // when processNextBroadcastLocked() next finds this uid as a receiver identity.
+        if (!r.timeoutExempt) {
+            if (mConstants.SLOW_TIME > 0 && elapsed > mConstants.SLOW_TIME) {
+                if (DEBUG_BROADCAST_DEFERRAL) {
+                    Slog.i(TAG, "Broadcast receiver was slow: " + receiver + " br=" + r);
+                }
+                if (r.curApp != null) {
+                    mDispatcher.startDeferring(r.curApp.uid);
+                } else {
+                    Slog.d(TAG, "finish receiver curApp is null? " + r);
+                }
+            }
+        } else {
+            if (DEBUG_BROADCAST_DEFERRAL) {
+                Slog.i(TAG_BROADCAST, "Finished broadcast " + r.intent.getAction()
+                        + " is exempt from deferral policy");
+            }
+        }
+
         r.receiver = null;
         r.intent.setComponent(null);
         if (r.curApp != null && r.curApp.curReceivers.contains(r)) {
@@ -452,9 +501,10 @@
             r.resultAbort = false;
         }
 
+        // If we want to wait behind services *AND* we're finishing the head/
+        // active broadcast on its queue
         if (waitForServices && r.curComponent != null && r.queue.mDelayBehindServices
-                && r.queue.mOrderedBroadcasts.size() > 0
-                && r.queue.mOrderedBroadcasts.get(0) == r) {
+                && r.queue.mDispatcher.getActiveBroadcastLocked() == r) {
             ActivityInfo nextReceiver;
             if (r.nextReceiver < r.receivers.size()) {
                 Object obj = r.receivers.get(r.nextReceiver);
@@ -488,8 +538,8 @@
     }
 
     public void backgroundServicesFinishedLocked(int userId) {
-        if (mOrderedBroadcasts.size() > 0) {
-            BroadcastRecord br = mOrderedBroadcasts.get(0);
+        BroadcastRecord br = mDispatcher.getActiveBroadcastLocked();
+        if (br != null) {
             if (br.userId == userId && br.state == BroadcastRecord.WAITING_SERVICES) {
                 Slog.i(TAG, "Resuming delayed broadcast");
                 br.curComponent = null;
@@ -861,7 +911,7 @@
         if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST, "processNextBroadcast ["
                 + mQueueName + "]: "
                 + mParallelBroadcasts.size() + " parallel broadcasts, "
-                + mOrderedBroadcasts.size() + " ordered broadcasts");
+                + mDispatcher.totalUndelivered() + " ordered broadcasts");
 
         mService.updateCpuStats();
 
@@ -937,8 +987,12 @@
         boolean looped = false;
 
         do {
-            if (mOrderedBroadcasts.size() == 0) {
-                // No more broadcasts pending, so all done!
+            final long now = SystemClock.uptimeMillis();
+            r = mDispatcher.getNextBroadcastLocked(now);
+
+            if (r == null) {
+                // No more broadcasts are deliverable right now, so all done!
+                mDispatcher.scheduleDeferralCheckLocked(false);
                 mService.scheduleAppGcsLocked();
                 if (looped) {
                     // If we had finished the last ordered broadcast, then
@@ -954,22 +1008,20 @@
 
                 return;
             }
-            r = mOrderedBroadcasts.get(0);
+
             boolean forceReceive = false;
 
             // Ensure that even if something goes awry with the timeout
             // detection, we catch "hung" broadcasts here, discard them,
             // and continue to make progress.
             //
-            // This is only done if the system is ready so that PRE_BOOT_COMPLETED
-            // receivers don't get executed with timeouts. They're intended for
-            // one time heavy lifting after system upgrades and can take
-            // significant amounts of time.
+            // This is only done if the system is ready so that early-stage receivers
+            // don't get executed with timeouts; and of course other timeout-
+            // exempt broadcasts are ignored.
             int numReceivers = (r.receivers != null) ? r.receivers.size() : 0;
-            if (mService.mProcessesReady && r.dispatchTime > 0) {
-                long now = SystemClock.uptimeMillis();
+            if (mService.mProcessesReady && !r.timeoutExempt && r.dispatchTime > 0) {
                 if ((numReceivers > 0) &&
-                        (now > r.dispatchTime + (2*mTimeoutPeriod*numReceivers))) {
+                        (now > r.dispatchTime + (2 * mConstants.TIMEOUT * numReceivers))) {
                     Slog.w(TAG, "Hung broadcast ["
                             + mQueueName + "] discarded after timeout failure:"
                             + " now=" + now
@@ -993,27 +1045,53 @@
                 return;
             }
 
+            // Is the current broadcast is done for any reason?
             if (r.receivers == null || r.nextReceiver >= numReceivers
                     || r.resultAbort || forceReceive) {
-                // No more receivers for this broadcast!  Send the final
-                // result if requested...
+                // Send the final result if requested
                 if (r.resultTo != null) {
-                    try {
-                        if (DEBUG_BROADCAST) Slog.i(TAG_BROADCAST,
-                                "Finishing broadcast [" + mQueueName + "] "
-                                + r.intent.getAction() + " app=" + r.callerApp);
-                        performReceiveLocked(r.callerApp, r.resultTo,
-                            new Intent(r.intent), r.resultCode,
-                            r.resultData, r.resultExtras, false, false, r.userId);
-                        // Set this to null so that the reference
-                        // (local and remote) isn't kept in the mBroadcastHistory.
-                        r.resultTo = null;
-                    } catch (RemoteException e) {
-                        r.resultTo = null;
-                        Slog.w(TAG, "Failure ["
-                                + mQueueName + "] sending broadcast result of "
-                                + r.intent, e);
+                    boolean sendResult = true;
 
+                    // if this was part of a split/deferral complex, update the refcount and only
+                    // send the completion when we clear all of them
+                    if (r.splitToken != 0) {
+                        int newCount = mSplitRefcounts.get(r.splitToken) - 1;
+                        if (newCount == 0) {
+                            // done!  clear out this record's bookkeeping and deliver
+                            if (DEBUG_BROADCAST_DEFERRAL) {
+                                Slog.i(TAG, "Sending broadcast completion for split token "
+                                        + r.splitToken);
+                            }
+                            mSplitRefcounts.delete(r.splitToken);
+                        } else {
+                            // still have some split broadcast records in flight; update refcount
+                            // and hold off on the callback
+                            if (DEBUG_BROADCAST_DEFERRAL) {
+                                Slog.i(TAG, "Result refcount " + newCount + " for split token "
+                                        + r.splitToken + " - not sending completion yet");
+                            }
+                            sendResult = false;
+                            mSplitRefcounts.put(r.splitToken, newCount);
+                        }
+                    }
+                    if (sendResult) {
+                        try {
+                            if (DEBUG_BROADCAST) {
+                                Slog.i(TAG_BROADCAST, "Finishing broadcast [" + mQueueName + "] "
+                                        + r.intent.getAction() + " app=" + r.callerApp);
+                            }
+                            performReceiveLocked(r.callerApp, r.resultTo,
+                                    new Intent(r.intent), r.resultCode,
+                                    r.resultData, r.resultExtras, false, false, r.userId);
+                            // Set this to null so that the reference
+                            // (local and remote) isn't kept in the mBroadcastHistory.
+                            r.resultTo = null;
+                        } catch (RemoteException e) {
+                            r.resultTo = null;
+                            Slog.w(TAG, "Failure ["
+                                    + mQueueName + "] sending broadcast result of "
+                                    + r.intent, e);
+                        }
                     }
                 }
 
@@ -1031,11 +1109,76 @@
                     mService.addBroadcastStatLocked(r.intent.getAction(), r.callerPackage,
                             r.manifestCount, r.manifestSkipCount, r.finishTime-r.dispatchTime);
                 }
-                mOrderedBroadcasts.remove(0);
+                mDispatcher.retireBroadcastLocked(r);
                 r = null;
                 looped = true;
                 continue;
             }
+
+            // Check whether the next receiver is under deferral policy, and handle that
+            // accordingly.  If the current broadcast was already part of deferred-delivery
+            // tracking, we know that it must now be deliverable as-is without re-deferral.
+            if (!r.deferred) {
+                final int receiverUid = r.getReceiverUid(r.receivers.get(r.nextReceiver));
+                if (mDispatcher.isDeferringLocked(receiverUid)) {
+                    if (DEBUG_BROADCAST_DEFERRAL) {
+                        Slog.i(TAG_BROADCAST, "Next receiver in " + r + " uid " + receiverUid
+                                + " at " + r.nextReceiver + " is under deferral");
+                    }
+                    // If this is the only (remaining) receiver in the broadcast, "splitting"
+                    // doesn't make sense -- just defer it as-is and retire it as the
+                    // currently active outgoing broadcast.
+                    BroadcastRecord defer;
+                    if (r.nextReceiver + 1 == numReceivers) {
+                        if (DEBUG_BROADCAST_DEFERRAL) {
+                            Slog.i(TAG, "Sole receiver of " + r
+                                    + " is under deferral; setting aside and proceeding");
+                        }
+                        defer = r;
+                        mDispatcher.retireBroadcastLocked(r);
+                    } else {
+                        // Nontrivial case; split out 'uid's receivers to a new broadcast record
+                        // and defer that, then loop and pick up continuing delivery of the current
+                        // record (now absent those receivers).
+
+                        // The split operation is guaranteed to match at least at 'nextReceiver'
+                        defer = r.splitRecipientsLocked(receiverUid, r.nextReceiver);
+                        if (DEBUG_BROADCAST_DEFERRAL) {
+                            Slog.i(TAG_BROADCAST, "Post split:");
+                            Slog.i(TAG_BROADCAST, "Original broadcast receivers:");
+                            for (int i = 0; i < r.receivers.size(); i++) {
+                                Slog.i(TAG_BROADCAST, "  " + r.receivers.get(i));
+                            }
+                            Slog.i(TAG_BROADCAST, "Split receivers:");
+                            for (int i = 0; i < defer.receivers.size(); i++) {
+                                Slog.i(TAG_BROADCAST, "  " + defer.receivers.get(i));
+                            }
+                        }
+                        // Track completion refcount as well if relevant
+                        if (r.resultTo != null) {
+                            int token = r.splitToken;
+                            if (token == 0) {
+                                // first split of this record; refcount for 'r' and 'deferred'
+                                r.splitToken = defer.splitToken = nextSplitTokenLocked();
+                                mSplitRefcounts.put(r.splitToken, 2);
+                            } else {
+                                // new split from an already-refcounted situation; increment count
+                                final int curCount = mSplitRefcounts.get(token);
+                                if (DEBUG_BROADCAST_DEFERRAL) {
+                                    if (curCount == 0) {
+                                        Slog.wtf(TAG, "Split refcount is zero with token for " + r);
+                                    }
+                                }
+                                mSplitRefcounts.put(token, curCount + 1);
+                            }
+                        }
+                    }
+                    mDispatcher.addDeferredBroadcast(receiverUid, defer);
+                    r = null;
+                    looped = true;
+                    continue;
+                }
+            }
         } while (r == null);
 
         // Get the next receiver...
@@ -1066,7 +1209,7 @@
                     + mQueueName + "] " + r);
         }
         if (! mPendingBroadcastTimeoutMessage) {
-            long timeoutTime = r.receiverTime + mTimeoutPeriod;
+            long timeoutTime = r.receiverTime + mConstants.TIMEOUT;
             if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST,
                     "Submitting BROADCAST_TIMEOUT_MSG ["
                     + mQueueName + "] for " + r + " at " + timeoutTime);
@@ -1474,21 +1617,29 @@
             mPendingBroadcastTimeoutMessage = false;
         }
 
-        if (mOrderedBroadcasts.size() == 0) {
+        if (mDispatcher.isEmpty() || mDispatcher.getActiveBroadcastLocked() == null) {
             return;
         }
 
         long now = SystemClock.uptimeMillis();
-        BroadcastRecord r = mOrderedBroadcasts.get(0);
+        BroadcastRecord r = mDispatcher.getActiveBroadcastLocked();
         if (fromMsg) {
             if (!mService.mProcessesReady) {
-                // Only process broadcast timeouts if the system is ready. That way
-                // PRE_BOOT_COMPLETED broadcasts can't timeout as they are intended
-                // to do heavy lifting for system up.
+                // Only process broadcast timeouts if the system is ready; some early
+                // broadcasts do heavy work setting up system facilities
                 return;
             }
 
-            long timeoutTime = r.receiverTime + mTimeoutPeriod;
+            // If the broadcast is generally exempt from timeout tracking, we're done
+            if (r.timeoutExempt) {
+                if (DEBUG_BROADCAST) {
+                    Slog.i(TAG_BROADCAST, "Broadcast timeout but it's exempt: "
+                            + r.intent.getAction());
+                }
+                return;
+            }
+
+            long timeoutTime = r.receiverTime + mConstants.TIMEOUT;
             if (timeoutTime > now) {
                 // We can observe premature timeouts because we do not cancel and reset the
                 // broadcast timeout message after each receiver finishes.  Instead, we set up
@@ -1503,16 +1654,15 @@
             }
         }
 
-        BroadcastRecord br = mOrderedBroadcasts.get(0);
-        if (br.state == BroadcastRecord.WAITING_SERVICES) {
+        if (r.state == BroadcastRecord.WAITING_SERVICES) {
             // In this case the broadcast had already finished, but we had decided to wait
             // for started services to finish as well before going on.  So if we have actually
             // waited long enough time timeout the broadcast, let's give up on the whole thing
             // and just move on to the next.
-            Slog.i(TAG, "Waited long enough for: " + (br.curComponent != null
-                    ? br.curComponent.flattenToShortString() : "(null)"));
-            br.curComponent = null;
-            br.state = BroadcastRecord.IDLE;
+            Slog.i(TAG, "Waited long enough for: " + (r.curComponent != null
+                    ? r.curComponent.flattenToShortString() : "(null)"));
+            r.curComponent = null;
+            r.state = BroadcastRecord.IDLE;
             processNextBroadcast(false);
             return;
         }
@@ -1619,13 +1769,8 @@
             }
         }
 
-        for (int i = mOrderedBroadcasts.size() - 1; i >= 0; i--) {
-            didSomething |= mOrderedBroadcasts.get(i).cleanupDisabledPackageReceiversLocked(
-                    packageName, filterByClasses, userId, doit);
-            if (!doit && didSomething) {
-                return true;
-            }
-        }
+        didSomething |= mDispatcher.cleanupDisabledPackageReceiversLocked(packageName,
+                filterByClasses, userId, doit);
 
         return didSomething;
     }
@@ -1665,7 +1810,7 @@
     }
 
     final boolean isIdle() {
-        return mParallelBroadcasts.isEmpty() && mOrderedBroadcasts.isEmpty()
+        return mParallelBroadcasts.isEmpty() && mDispatcher.isEmpty()
                 && (mPendingBroadcast == null);
     }
 
@@ -1677,10 +1822,7 @@
         for (int i = N - 1; i >= 0; i--) {
             mParallelBroadcasts.get(i).writeToProto(proto, BroadcastQueueProto.PARALLEL_BROADCASTS);
         }
-        N = mOrderedBroadcasts.size();
-        for (int i = N - 1; i >= 0; i--) {
-            mOrderedBroadcasts.get(i).writeToProto(proto, BroadcastQueueProto.ORDERED_BROADCASTS);
-        }
+        mDispatcher.writeToProto(proto, BroadcastQueueProto.ORDERED_BROADCASTS);
         if (mPendingBroadcast != null) {
             mPendingBroadcast.writeToProto(proto, BroadcastQueueProto.PENDING_BROADCAST);
         }
@@ -1721,7 +1863,7 @@
     final boolean dumpLocked(FileDescriptor fd, PrintWriter pw, String[] args,
             int opti, boolean dumpAll, String dumpPackage, boolean needSep) {
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
-        if (mParallelBroadcasts.size() > 0 || mOrderedBroadcasts.size() > 0
+        if (!mParallelBroadcasts.isEmpty() || !mDispatcher.isEmpty()
                 || mPendingBroadcast != null) {
             boolean printed = false;
             for (int i = mParallelBroadcasts.size() - 1; i >= 0; i--) {
@@ -1740,29 +1882,12 @@
                 pw.println("  Active Broadcast " + mQueueName + " #" + i + ":");
                 br.dump(pw, "    ", sdf);
             }
-            printed = false;
-            needSep = true;
-            for (int i = mOrderedBroadcasts.size() - 1; i >= 0; i--) {
-                BroadcastRecord br = mOrderedBroadcasts.get(i);
-                if (dumpPackage != null && !dumpPackage.equals(br.callerPackage)) {
-                    continue;
-                }
-                if (!printed) {
-                    if (needSep) {
-                        pw.println();
-                    }
-                    needSep = true;
-                    printed = true;
-                    pw.println("  Active ordered broadcasts [" + mQueueName + "]:");
-                }
-                pw.println("  Active Ordered Broadcast " + mQueueName + " #" + i + ":");
-                mOrderedBroadcasts.get(i).dump(pw, "    ", sdf);
-            }
+
+            mDispatcher.dumpLocked(pw, dumpPackage, mQueueName, sdf);
+
             if (dumpPackage == null || (mPendingBroadcast != null
                     && dumpPackage.equals(mPendingBroadcast.callerPackage))) {
-                if (needSep) {
-                    pw.println();
-                }
+                pw.println();
                 pw.println("  Pending broadcast [" + mQueueName + "]:");
                 if (mPendingBroadcast != null) {
                     mPendingBroadcast.dump(pw, "    ", sdf);
@@ -1773,6 +1898,8 @@
             }
         }
 
+        mConstants.dump(pw);
+
         int i;
         boolean printed = false;
 
diff --git a/services/core/java/com/android/server/am/BroadcastRecord.java b/services/core/java/com/android/server/am/BroadcastRecord.java
index 9e799f6..fa9b79d 100644
--- a/services/core/java/com/android/server/am/BroadcastRecord.java
+++ b/services/core/java/com/android/server/am/BroadcastRecord.java
@@ -36,10 +36,12 @@
 
 import java.io.PrintWriter;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * An active intent broadcast.
@@ -64,11 +66,15 @@
     final int[] delivery;   // delivery state of each receiver
     final long[] duration;   // duration a receiver took to process broadcast
     IIntentReceiver resultTo; // who receives final result if non-null
+    boolean deferred;
+    int splitCount;         // refcount for result callback, when split
+    int splitToken;         // identifier for cross-BroadcastRecord refcount
     long enqueueClockTime;  // the clock time the broadcast was enqueued
     long dispatchTime;      // when dispatch started on this set of receivers
     long dispatchClockTime; // the clock time the dispatch started
     long receiverTime;      // when current receiver started for timeouts.
     long finishTime;        // when we finished the broadcast.
+    boolean timeoutExempt;  // true if this broadcast is not subject to receiver timeouts
     int resultCode;         // current result code value.
     String resultData;      // current result data value.
     Bundle resultExtras;    // current result extra data values.
@@ -106,6 +112,9 @@
     ComponentName curComponent; // the receiver class that is currently running.
     ActivityInfo curReceiver;   // info about the receiver that is currently running.
 
+    // Private refcount-management bookkeeping; start > 0
+    static AtomicInteger sNextToken = new AtomicInteger(1);
+
     void dump(PrintWriter pw, String prefix, SimpleDateFormat sdf) {
         final long now = SystemClock.uptimeMillis();
 
@@ -228,7 +237,7 @@
             String[] _requiredPermissions, int _appOp, BroadcastOptions _options, List _receivers,
             IIntentReceiver _resultTo, int _resultCode, String _resultData, Bundle _resultExtras,
             boolean _serialized, boolean _sticky, boolean _initialSticky, int _userId,
-            boolean _allowBackgroundActivityStarts) {
+            boolean _allowBackgroundActivityStarts, boolean _timeoutExempt) {
         if (_intent == null) {
             throw new NullPointerException("Can't construct with a null intent");
         }
@@ -258,6 +267,7 @@
         nextReceiver = 0;
         state = IDLE;
         allowBackgroundActivityStarts = _allowBackgroundActivityStarts;
+        timeoutExempt = _timeoutExempt;
     }
 
     /**
@@ -302,6 +312,53 @@
         manifestSkipCount = from.manifestSkipCount;
         queue = from.queue;
         allowBackgroundActivityStarts = from.allowBackgroundActivityStarts;
+        timeoutExempt = from.timeoutExempt;
+    }
+
+    /**
+     * Split off a new BroadcastRecord that clones this one, but contains only the
+     * recipient records for the current (just-finished) receiver's app, starting
+     * after the just-finished receiver [i.e. at r.nextReceiver].  Returns null
+     * if there are no matching subsequent receivers in this BroadcastRecord.
+     */
+    BroadcastRecord splitRecipientsLocked(int slowAppUid, int startingAt) {
+        // Do we actually have any matching receivers down the line...?
+        ArrayList splitReceivers = null;
+        for (int i = startingAt; i < receivers.size(); ) {
+            Object o = receivers.get(i);
+            if (getReceiverUid(o) == slowAppUid) {
+                if (splitReceivers == null) {
+                    splitReceivers = new ArrayList<>();
+                }
+                splitReceivers.add(o);
+                receivers.remove(i);
+                break;
+            } else {
+                i++;
+            }
+        }
+
+        // No later receivers in the same app, so we have no more to do
+        if (splitReceivers == null) {
+            return null;
+        }
+
+        // build a new BroadcastRecord around that single-target list
+        BroadcastRecord split = new BroadcastRecord(queue, intent, callerApp,
+                callerPackage, callingPid, callingUid, callerInstantApp, resolvedType,
+                requiredPermissions, appOp, options, splitReceivers, resultTo, resultCode,
+                resultData, resultExtras, ordered, sticky, initialSticky, userId,
+                allowBackgroundActivityStarts, timeoutExempt);
+
+        return split;
+    }
+
+    int getReceiverUid(Object receiver) {
+        if (receiver instanceof BroadcastFilter) {
+            return ((BroadcastFilter) receiver).owningUid;
+        } else /* if (receiver instanceof ResolveInfo) */ {
+            return ((ResolveInfo) receiver).activityInfo.applicationInfo.uid;
+        }
     }
 
     public BroadcastRecord maybeStripForHistory() {
diff --git a/services/core/java/com/android/server/am/CarUserSwitchingDialog.java b/services/core/java/com/android/server/am/CarUserSwitchingDialog.java
index 7599afa..c7de7b1 100644
--- a/services/core/java/com/android/server/am/CarUserSwitchingDialog.java
+++ b/services/core/java/com/android/server/am/CarUserSwitchingDialog.java
@@ -65,7 +65,9 @@
         setCancelable(false);
         Resources res = getContext().getResources();
         // Custom view due to alignment and font size requirements
-        View view = LayoutInflater.from(getContext()).inflate(R.layout.car_user_switching_dialog,
+        getContext().setTheme(R.style.Theme_DeviceDefault_Light_Dialog_Alert_UserSwitchingDialog);
+        View view = LayoutInflater.from(getContext()).inflate(
+                R.layout.car_user_switching_dialog,
                 null);
 
         UserManager userManager =
diff --git a/services/core/java/com/android/server/am/CoreSettingsObserver.java b/services/core/java/com/android/server/am/CoreSettingsObserver.java
index 3d69aa8..360d296 100644
--- a/services/core/java/com/android/server/am/CoreSettingsObserver.java
+++ b/services/core/java/com/android/server/am/CoreSettingsObserver.java
@@ -69,10 +69,11 @@
         sGlobalSettingToTypeMap.put(Settings.Global.GPU_DEBUG_LAYERS_GLES, String.class);
         sGlobalSettingToTypeMap.put(Settings.Global.GPU_DEBUG_LAYER_APP, String.class);
         sGlobalSettingToTypeMap.put(Settings.Global.SMS_ACCESS_RESTRICTION_ENABLED, int.class);
-        sGlobalSettingToTypeMap.put(Settings.Global.GUP_DEV_ALL_APPS, int.class);
-        sGlobalSettingToTypeMap.put(Settings.Global.GUP_DEV_OPT_IN_APPS, String.class);
-        sGlobalSettingToTypeMap.put(Settings.Global.GUP_DEV_OPT_OUT_APPS, String.class);
-        sGlobalSettingToTypeMap.put(Settings.Global.GUP_BLACKLIST, String.class);
+        sGlobalSettingToTypeMap.put(Settings.Global.GAME_DRIVER_ALL_APPS, int.class);
+        sGlobalSettingToTypeMap.put(Settings.Global.GAME_DRIVER_OPT_IN_APPS, String.class);
+        sGlobalSettingToTypeMap.put(Settings.Global.GAME_DRIVER_OPT_OUT_APPS, String.class);
+        sGlobalSettingToTypeMap.put(Settings.Global.GAME_DRIVER_BLACKLIST, String.class);
+        sGlobalSettingToTypeMap.put(Settings.Global.GAME_DRIVER_WHITELIST, String.class);
         // add other global settings here...
     }
 
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index 1e03f6c..4985c52 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -127,8 +127,18 @@
     private final ActivityManagerService mService;
     private final ProcessList mProcessList;
 
-    OomAdjuster(ActivityManagerService service, ProcessList processList, ActiveUids activeUids) {
+    /**
+     * Used to lock {@link #updateOomAdjImpl} for state consistency. It also reduces frequency lock
+     * and unlock when getting and setting value to {@link ProcessRecord#mWindowProcessController}.
+     * Note it is declared as Object type so the locked-region-code-injection won't wrap the
+     * unnecessary priority booster.
+     */
+    private final Object mAtmGlobalLock;
+
+    OomAdjuster(ActivityManagerService service, ProcessList processList, ActiveUids activeUids,
+            Object atmGlobalLock) {
         mService = service;
+        mAtmGlobalLock = atmGlobalLock;
         mProcessList = processList;
         mActiveUids = activeUids;
 
@@ -186,6 +196,13 @@
 
     @GuardedBy("mService")
     final void updateOomAdjLocked() {
+        synchronized (mAtmGlobalLock) {
+            updateOomAdjImpl();
+        }
+    }
+
+    @GuardedBy({"mService", "mAtmGlobalLock"})
+    private void updateOomAdjImpl() {
         Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "updateOomAdj");
         mService.mOomAdjProfiler.oomAdjStarted();
         final ProcessRecord TOP_APP = mService.getTopAppLocked();
@@ -534,6 +551,7 @@
                 uidRec.setProcState = uidRec.getCurProcState();
                 uidRec.setWhitelist = uidRec.curWhitelist;
                 uidRec.setIdle = uidRec.idle;
+                mService.mAtmInternal.onUidProcStateChanged(uidRec.uid, uidRec.setProcState);
                 mService.enqueueUidChangeLocked(uidRec, -1, uidChange);
                 mService.noteUidProcessState(uidRec.uid, uidRec.getCurProcState());
                 if (uidRec.foregroundServices) {
@@ -897,11 +915,13 @@
         }
 
         if (adj > ProcessList.PERCEPTIBLE_APP_ADJ
-                || procState > ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE) {
+                || procState > ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE_LOCATION) {
             if (app.hasForegroundServices()) {
                 // The user is aware of this app, so make it visible.
                 adj = ProcessList.PERCEPTIBLE_APP_ADJ;
-                procState = ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;
+                procState = app.hasLocationForegroundServices()
+                        ? ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE_LOCATION
+                        : ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;
                 app.cached = false;
                 app.adjType = "fg-service";
                 schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
@@ -1507,6 +1527,7 @@
             switch (procState) {
                 case ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE:
                 case ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE:
+                case ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE_LOCATION:
                     // Something else is keeping it at this level, just leave it.
                     break;
                 case ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND:
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index 003ddd1..f90c0ca 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -58,7 +58,6 @@
 import android.graphics.Point;
 import android.net.LocalSocket;
 import android.net.LocalSocketAddress;
-import android.net.Uri;
 import android.os.AppZygote;
 import android.os.Binder;
 import android.os.Build;
@@ -738,6 +737,9 @@
             case ActivityManager.PROCESS_STATE_TOP:
                 procState = "TOP ";
                 break;
+            case ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE_LOCATION:
+                procState = "FGSL";
+                break;
             case ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE:
                 procState = "FGS ";
                 break;
@@ -804,10 +806,11 @@
                 return AppProtoEnums.PROCESS_STATE_PERSISTENT_UI;
             case ActivityManager.PROCESS_STATE_TOP:
                 return AppProtoEnums.PROCESS_STATE_TOP;
-            case ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE:
-                return AppProtoEnums.PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
+            case ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE_LOCATION:
             case ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE:
                 return AppProtoEnums.PROCESS_STATE_FOREGROUND_SERVICE;
+            case ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE:
+                return AppProtoEnums.PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
             case ActivityManager.PROCESS_STATE_TOP_SLEEPING:
                 return AppProtoEnums.PROCESS_STATE_TOP_SLEEPING;
             case ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND:
@@ -932,6 +935,7 @@
         PROC_MEM_PERSISTENT,            // ActivityManager.PROCESS_STATE_PERSISTENT
         PROC_MEM_PERSISTENT,            // ActivityManager.PROCESS_STATE_PERSISTENT_UI
         PROC_MEM_TOP,                   // ActivityManager.PROCESS_STATE_TOP
+        PROC_MEM_IMPORTANT,             // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE_LOCATION
         PROC_MEM_IMPORTANT,             // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE
         PROC_MEM_IMPORTANT,             // ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE
         PROC_MEM_IMPORTANT,             // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
@@ -1476,6 +1480,9 @@
                     mService.mSafeMode == true) {
                 runtimeFlags |= Zygote.DEBUG_ENABLE_SAFEMODE;
             }
+            if ((app.info.privateFlags & ApplicationInfo.PRIVATE_FLAG_PROFILEABLE_BY_SHELL) != 0) {
+                runtimeFlags |= Zygote.PROFILE_FROM_SHELL;
+            }
             if ("1".equals(SystemProperties.get("debug.checkjni"))) {
                 runtimeFlags |= Zygote.DEBUG_ENABLE_CHECKJNI;
             }
@@ -1502,7 +1509,7 @@
                 mService.mNativeDebuggingApp = null;
             }
 
-            if (app.info.isCodeIntegrityPreferred()
+            if (app.info.isEmbeddedDexUsed()
                     || (app.info.isPrivilegedApp()
                         && DexManager.isPackageSelectedToRunOob(app.pkgList.mPkgList.keySet()))) {
                 runtimeFlags |= Zygote.ONLY_USE_SYSTEM_OAT_FILES;
@@ -2038,25 +2045,25 @@
                     // We don't kill persistent processes.
                     continue;
                 }
-                if (app.removed) {
-                    procs.add(app);
-                } else if (app.setAdj >= ProcessList.CACHED_APP_MIN_ADJ) {
-                    app.removed = true;
+                if (app.removed || app.setAdj >= ProcessList.CACHED_APP_MIN_ADJ) {
                     procs.add(app);
                 }
             }
         }
+    }
 
-        final int N = procs.size();
-        for (int i = 0; i < N; i++) {
-            removeProcessLocked(procs.get(i), false, true, "kill all background");
-        }
+    @GuardedBy("mService")
+    boolean killPackageProcessesLocked(String packageName, int appId, int userId, int minOomAdj,
+            String reason) {
+        return killPackageProcessesLocked(packageName, appId, userId, minOomAdj,
+                false /* callerWillRestart */, true /* allowRestart */, true /* doit */,
+                false /* evenPersistent */, false /* setRemoved */, reason);
     }
 
     @GuardedBy("mService")
     final boolean killPackageProcessesLocked(String packageName, int appId,
             int userId, int minOomAdj, boolean callerWillRestart, boolean allowRestart,
-            boolean doit, boolean evenPersistent, String reason) {
+            boolean doit, boolean evenPersistent, boolean setRemoved, String reason) {
         ArrayList<ProcessRecord> procs = new ArrayList<>();
 
         // Remove all processes this package may have touched: all with the
@@ -2114,7 +2121,9 @@
                 if (!doit) {
                     return true;
                 }
-                app.removed = true;
+                if (setRemoved) {
+                    app.removed = true;
+                }
                 procs.add(app);
             }
         }
@@ -2190,7 +2199,7 @@
         }
         UidRecord uidRec = mActiveUids.get(proc.uid);
         if (uidRec == null) {
-            uidRec = new UidRecord(proc.uid, mService.mAtmInternal);
+            uidRec = new UidRecord(proc.uid);
             // This is the first appearance of the uid, report it now!
             if (DEBUG_UID_OBSERVERS) Slog.i(TAG_UID_OBSERVERS,
                     "Creating new process uid: " + uidRec);
@@ -2348,11 +2357,8 @@
             final int NA = apps.size();
             for (int ia = 0; ia < NA; ia++) {
                 final ProcessRecord app = apps.valueAt(ia);
-                if (app.removed) {
-                    procs.add(app);
-                } else if ((minTargetSdk < 0 || app.info.targetSdkVersion < minTargetSdk)
-                        && (maxProcState < 0 || app.setProcState > maxProcState)) {
-                    app.removed = true;
+                if (app.removed || ((minTargetSdk < 0 || app.info.targetSdkVersion < minTargetSdk)
+                        && (maxProcState < 0 || app.setProcState > maxProcState))) {
                     procs.add(app);
                 }
             }
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index 054c830..5dccaf1 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -31,6 +31,8 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
+import android.content.pm.ServiceInfo;
+import android.content.pm.VersionedPackage;
 import android.content.res.CompatibilityInfo;
 import android.os.Binder;
 import android.os.Debug;
@@ -65,6 +67,7 @@
 import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.List;
 
 /**
  * Full information about a particular process that
@@ -169,6 +172,7 @@
     private boolean mHasClientActivities;  // Are there any client services with activities?
     boolean hasStartedServices; // Are there any started services running in this process?
     private boolean mHasForegroundServices; // Running any services that are foreground?
+    private int mFgServiceTypes; // Type of foreground service, if there is a foreground service.
     private boolean mHasForegroundActivities; // Running any activities that are foreground?
     boolean repForegroundActivities; // Last reported foreground activities.
     boolean systemNoUi;         // This is a system process, but not currently showing UI.
@@ -264,7 +268,9 @@
     boolean forceCrashReport;   // suppress normal auto-dismiss of crash dialog & report UI?
     private boolean mNotResponding; // does the app have a not responding dialog?
     Dialog anrDialog;           // dialog being displayed due to app not resp.
-    boolean removed;            // has app package been removed from device?
+    volatile boolean removed;   // Whether this process should be killed and removed from process
+                                // list. It is set when the package is force-stopped or the process
+                                // has crashed too many times.
     private boolean mDebugging; // was app launched for debugging?
     boolean waitedForDebugger;  // has process show wait for debugger dialog?
     Dialog waitDialog;          // current wait for debugger dialog
@@ -649,10 +655,6 @@
         return mWindowProcessController.hasActivities();
     }
 
-    void clearActivities() {
-        mWindowProcessController.clearActivities();
-    }
-
     boolean hasActivitiesOrRecentTasks() {
         return mWindowProcessController.hasActivitiesOrRecentTasks();
     }
@@ -661,10 +663,6 @@
         return mWindowProcessController.hasRecentTasks();
     }
 
-    void clearRecentTasks() {
-        mWindowProcessController.clearRecentTasks();
-    }
-
     /**
      * This method returns true if any of the activities within the process record are interesting
      * to the user. See HistoryRecord.isInterestingToUserLocked()
@@ -970,6 +968,18 @@
         return list;
     }
 
+    public List<VersionedPackage> getPackageListWithVersionCode() {
+        int size = pkgList.size();
+        if (size == 0) {
+            return null;
+        }
+        List<VersionedPackage> list = new ArrayList<>();
+        for (int i = 0; i < pkgList.size(); i++) {
+            list.add(new VersionedPackage(pkgList.keyAt(i), pkgList.valueAt(i).appVersion));
+        }
+        return list;
+    }
+
     WindowProcessController getWindowProcessController() {
         return mWindowProcessController;
     }
@@ -1051,8 +1061,9 @@
         return mRequiredAbi;
     }
 
-    void setHasForegroundServices(boolean hasForegroundServices) {
+    void setHasForegroundServices(boolean hasForegroundServices, int fgServiceTypes) {
         mHasForegroundServices = hasForegroundServices;
+        mFgServiceTypes = fgServiceTypes;
         mWindowProcessController.setHasForegroundServices(hasForegroundServices);
     }
 
@@ -1060,6 +1071,11 @@
         return mHasForegroundServices;
     }
 
+    boolean hasLocationForegroundServices() {
+        return mHasForegroundServices
+                && (mFgServiceTypes & ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION) != 0;
+    }
+
     void setHasForegroundActivities(boolean hasForegroundActivities) {
         mHasForegroundActivities = hasForegroundActivities;
         mWindowProcessController.setHasForegroundActivities(hasForegroundActivities);
@@ -1156,7 +1172,9 @@
 
     void setActiveInstrumentation(ActiveInstrumentation instr) {
         mInstr = instr;
-        mWindowProcessController.setInstrumenting(instr != null);
+        boolean isInstrumenting = instr != null;
+        mWindowProcessController.setInstrumenting(isInstrumenting,
+                isInstrumenting && instr.mHasBackgroundActivityStartsPermission);
     }
 
     ActiveInstrumentation getActiveInstrumentation() {
@@ -1228,10 +1246,8 @@
     }
 
     @Override
-    public void setRemoved(boolean removed) {
-        synchronized (mService) {
-            this.removed = removed;
-        }
+    public boolean isRemoved() {
+        return removed;
     }
 
     /**
diff --git a/services/core/java/com/android/server/am/ServiceRecord.java b/services/core/java/com/android/server/am/ServiceRecord.java
index da5ce1c..abc1066a 100644
--- a/services/core/java/com/android/server/am/ServiceRecord.java
+++ b/services/core/java/com/android/server/am/ServiceRecord.java
@@ -16,10 +16,8 @@
 
 package com.android.server.am;
 
-import com.android.internal.app.procstats.ServiceState;
-import com.android.internal.os.BatteryStatsImpl;
-import com.android.server.LocalServices;
-import com.android.server.notification.NotificationManagerInternal;
+import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
+import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
 
 import android.app.INotificationManager;
 import android.app.Notification;
@@ -44,6 +42,11 @@
 import android.util.TimeUtils;
 import android.util.proto.ProtoOutputStream;
 import android.util.proto.ProtoUtils;
+
+import com.android.internal.app.procstats.ServiceState;
+import com.android.internal.os.BatteryStatsImpl;
+import com.android.server.LocalServices;
+import com.android.server.notification.NotificationManagerInternal;
 import com.android.server.uri.NeededUriGrants;
 import com.android.server.uri.UriPermissionOwner;
 
@@ -52,9 +55,6 @@
 import java.util.List;
 import java.util.Objects;
 
-import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
-import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
-
 /**
  * A running application service.
  */
@@ -103,6 +103,7 @@
     boolean isForeground;   // is service currently in foreground mode?
     int foregroundId;       // Notification ID of last foreground req.
     Notification foregroundNoti; // Notification record of foreground state.
+    int foregroundServiceType; // foreground service types.
     long lastActivity;      // last time there was some activity on the service.
     long startingBgTimeout;  // time at which we scheduled this for a delayed start.
     boolean startRequested; // someone explicitly called start?
@@ -722,7 +723,7 @@
                         // If it gave us a garbage notification, it doesn't
                         // get to be foreground.
                         ams.setServiceForeground(instanceName, ServiceRecord.this,
-                                0, null, 0);
+                                0, null, 0, 0);
                         ams.crashApplication(appUid, appPid, localPackageName, -1,
                                 "Bad notification for startForeground: " + e);
                     }
diff --git a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
index 128d98b..e731f34 100644
--- a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
+++ b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
@@ -77,8 +77,10 @@
     // permission in the corresponding .te file your feature belongs to.
     @VisibleForTesting
     static final String[] sDeviceConfigScopes = new String[] {
+        DeviceConfig.ActivityManagerNativeBoot.NAMESPACE,
         DeviceConfig.NAMESPACE_INPUT_NATIVE_BOOT,
         DeviceConfig.NAMESPACE_NETD_NATIVE,
+        DeviceConfig.RuntimeNative.NAMESPACE,
     };
 
     private final String[] mGlobalSettings;
diff --git a/services/core/java/com/android/server/am/UidRecord.java b/services/core/java/com/android/server/am/UidRecord.java
index 6cb1097..22a7de7 100644
--- a/services/core/java/com/android/server/am/UidRecord.java
+++ b/services/core/java/com/android/server/am/UidRecord.java
@@ -26,7 +26,6 @@
 import android.util.proto.ProtoUtils;
 
 import com.android.internal.annotations.GuardedBy;
-import com.android.server.wm.ActivityTaskManagerInternal;
 
 /**
  * Overall information about a uid that has actively running processes.
@@ -43,7 +42,6 @@
     boolean idle;
     boolean setIdle;
     int numProcs;
-    final ActivityTaskManagerInternal mAtmInternal;
 
     /**
      * Sequence number associated with the {@link #mCurProcState}. This is incremented using
@@ -117,10 +115,9 @@
     ChangeItem pendingChange;
     int lastReportedChange;
 
-    public UidRecord(int _uid, ActivityTaskManagerInternal atmInternal) {
+    public UidRecord(int _uid) {
         uid = _uid;
         idle = true;
-        mAtmInternal = atmInternal;
         reset();
     }
 
@@ -130,9 +127,6 @@
 
     public void setCurProcState(int curProcState) {
         mCurProcState = curProcState;
-        if (mAtmInternal != null) {
-            mAtmInternal.onUidProcStateChanged(uid, curProcState);
-        }
     }
 
     public void reset() {
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java
index 26d2d17..0e33090 100644
--- a/services/core/java/com/android/server/appop/AppOpsService.java
+++ b/services/core/java/com/android/server/appop/AppOpsService.java
@@ -22,6 +22,7 @@
 import static android.app.AppOpsManager.UID_STATE_CACHED;
 import static android.app.AppOpsManager.UID_STATE_FOREGROUND;
 import static android.app.AppOpsManager.UID_STATE_FOREGROUND_SERVICE;
+import static android.app.AppOpsManager.UID_STATE_FOREGROUND_SERVICE_LOCATION;
 import static android.app.AppOpsManager.UID_STATE_LAST_NON_RESTRICTED;
 import static android.app.AppOpsManager.UID_STATE_PERSISTENT;
 import static android.app.AppOpsManager.UID_STATE_TOP;
@@ -141,6 +142,8 @@
         UID_STATE_PERSISTENT,           // ActivityManager.PROCESS_STATE_PERSISTENT
         UID_STATE_PERSISTENT,           // ActivityManager.PROCESS_STATE_PERSISTENT_UI
         UID_STATE_TOP,                  // ActivityManager.PROCESS_STATE_TOP
+        UID_STATE_FOREGROUND_SERVICE_LOCATION,
+                                        // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE_LOCATION
         UID_STATE_FOREGROUND_SERVICE,   // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE
         UID_STATE_FOREGROUND,           // ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE
         UID_STATE_FOREGROUND,           // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
@@ -163,6 +166,7 @@
     static final String[] UID_STATE_NAMES = new String[] {
             "pers ",    // UID_STATE_PERSISTENT
             "top  ",    // UID_STATE_TOP
+            "fgsvcl",   // UID_STATE_FOREGROUND_SERVICE_LOCATION
             "fgsvc",    // UID_STATE_FOREGROUND_SERVICE
             "fg   ",    // UID_STATE_FOREGROUND
             "bg   ",    // UID_STATE_BACKGROUND
@@ -172,6 +176,7 @@
     static final String[] UID_STATE_TIME_ATTRS = new String[] {
             "tp",       // UID_STATE_PERSISTENT
             "tt",       // UID_STATE_TOP
+            "tfsl",     // UID_STATE_FOREGROUND_SERVICE_LOCATION
             "tfs",      // UID_STATE_FOREGROUND_SERVICE
             "tf",       // UID_STATE_FOREGROUND
             "tb",       // UID_STATE_BACKGROUND
@@ -181,6 +186,7 @@
     static final String[] UID_STATE_REJECT_ATTRS = new String[] {
             "rp",       // UID_STATE_PERSISTENT
             "rt",       // UID_STATE_TOP
+            "rfsl",     // UID_STATE_FOREGROUND_SERVICE_LOCATION
             "rfs",      // UID_STATE_FOREGROUND_SERVICE
             "rf",       // UID_STATE_FOREGROUND
             "rb",       // UID_STATE_BACKGROUND
@@ -843,7 +849,7 @@
     public void updateUidProcState(int uid, int procState) {
         synchronized (this) {
             final UidState uidState = getUidStateLocked(uid, true);
-            final int newState = PROCESS_STATE_TO_UID_STATE[procState];
+            int newState = PROCESS_STATE_TO_UID_STATE[procState];
             if (uidState != null && uidState.pendingState != newState) {
                 final int oldPendingState = uidState.pendingState;
                 uidState.pendingState = newState;
@@ -2791,9 +2797,13 @@
                         case "tt":
                             op.time[AppOpsManager.UID_STATE_TOP] = Long.parseLong(value);
                             break;
+                        case "tfsl":
+                            op.time[AppOpsManager.UID_STATE_FOREGROUND_SERVICE_LOCATION] =
+                                    Long.parseLong(value);
+                            break;
                         case "tfs":
-                            op.time[AppOpsManager.UID_STATE_FOREGROUND_SERVICE]
-                                    = Long.parseLong(value);
+                            op.time[AppOpsManager.UID_STATE_FOREGROUND_SERVICE] =
+                                    Long.parseLong(value);
                             break;
                         case "tf":
                             op.time[AppOpsManager.UID_STATE_FOREGROUND] = Long.parseLong(value);
@@ -2805,27 +2815,31 @@
                             op.time[AppOpsManager.UID_STATE_CACHED] = Long.parseLong(value);
                             break;
                         case "rp":
-                            op.rejectTime[AppOpsManager.UID_STATE_PERSISTENT]
-                                    = Long.parseLong(value);
+                            op.rejectTime[AppOpsManager.UID_STATE_PERSISTENT] =
+                                    Long.parseLong(value);
                             break;
                         case "rt":
                             op.rejectTime[AppOpsManager.UID_STATE_TOP] = Long.parseLong(value);
                             break;
+                        case "rfsl":
+                            op.rejectTime[AppOpsManager.UID_STATE_FOREGROUND_SERVICE_LOCATION] =
+                                    Long.parseLong(value);
+                            break;
                         case "rfs":
-                            op.rejectTime[AppOpsManager.UID_STATE_FOREGROUND_SERVICE]
-                                    = Long.parseLong(value);
+                            op.rejectTime[AppOpsManager.UID_STATE_FOREGROUND_SERVICE] =
+                                    Long.parseLong(value);
                             break;
                         case "rf":
-                            op.rejectTime[AppOpsManager.UID_STATE_FOREGROUND]
-                                    = Long.parseLong(value);
+                            op.rejectTime[AppOpsManager.UID_STATE_FOREGROUND] =
+                                    Long.parseLong(value);
                             break;
                         case "rb":
-                            op.rejectTime[AppOpsManager.UID_STATE_BACKGROUND]
-                                    = Long.parseLong(value);
+                            op.rejectTime[AppOpsManager.UID_STATE_BACKGROUND] =
+                                    Long.parseLong(value);
                             break;
                         case "rc":
-                            op.rejectTime[AppOpsManager.UID_STATE_CACHED]
-                                    = Long.parseLong(value);
+                            op.rejectTime[AppOpsManager.UID_STATE_CACHED] =
+                                    Long.parseLong(value);
                             break;
                         case "t":
                             // Backwards compat.
diff --git a/services/core/java/com/android/server/attention/AttentionManagerService.java b/services/core/java/com/android/server/attention/AttentionManagerService.java
index 5b469fe..2061b26 100644
--- a/services/core/java/com/android/server/attention/AttentionManagerService.java
+++ b/services/core/java/com/android/server/attention/AttentionManagerService.java
@@ -16,9 +16,9 @@
 
 package com.android.server.attention;
 
+import static android.provider.DeviceConfig.AttentionManagerService.COMPONENT_NAME;
 import static android.provider.DeviceConfig.AttentionManagerService.NAMESPACE;
-import static android.provider.DeviceConfig.AttentionManagerService.PROPERTY_COMPONENT_NAME;
-import static android.provider.DeviceConfig.AttentionManagerService.PROPERTY_SERVICE_ENABLED;
+import static android.provider.DeviceConfig.AttentionManagerService.SERVICE_ENABLED;
 
 import android.Manifest;
 import android.annotation.Nullable;
@@ -129,7 +129,7 @@
     }
 
     private boolean isServiceEnabled() {
-        final String enabled = DeviceConfig.getProperty(NAMESPACE, PROPERTY_SERVICE_ENABLED);
+        final String enabled = DeviceConfig.getProperty(NAMESPACE, SERVICE_ENABLED);
         return enabled == null ? DEFAULT_SERVICE_ENABLED : "true".equals(enabled);
     }
 
@@ -279,7 +279,7 @@
      * system.
      */
     private static ComponentName resolveAttentionService(Context context) {
-        final String flag = DeviceConfig.getProperty(NAMESPACE, PROPERTY_COMPONENT_NAME);
+        final String flag = DeviceConfig.getProperty(NAMESPACE, COMPONENT_NAME);
 
         final String componentNameString = flag != null ? flag : context.getString(
                 R.string.config_defaultAttentionService);
diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
index d652f93..deaa931 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
@@ -600,7 +600,7 @@
                     break;
                 case MSG_IL_SET_A2DP_SINK_CONNECTION_STATE:
                     mDeviceInventory.onSetA2dpSinkConnectionState(
-                            (BtHelper.BluetoothA2dpDeviceInfo) msg.obj, msg.arg1, msg.arg2);
+                            (BtHelper.BluetoothA2dpDeviceInfo) msg.obj, msg.arg1);
                     break;
                 case MSG_IL_SET_A2DP_SOURCE_CONNECTION_STATE:
                     mDeviceInventory.onSetA2dpSourceConnectionState(
diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
index eb76e6e..97649a7 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
@@ -147,18 +147,20 @@
     }
 
     /*package*/ void onSetA2dpSinkConnectionState(@NonNull BtHelper.BluetoothA2dpDeviceInfo btInfo,
-            @AudioService.BtProfileConnectionState int state, int a2dpVolume) {
+            @AudioService.BtProfileConnectionState int state) {
         final BluetoothDevice btDevice = btInfo.getBtDevice();
+        int a2dpVolume = btInfo.getVolume();
         if (AudioService.DEBUG_DEVICES) {
             Log.d(TAG, "onSetA2dpSinkConnectionState btDevice=" + btDevice + " state="
-                    + state + " is dock=" + btDevice.isBluetoothDock());
+                    + state + " is dock=" + btDevice.isBluetoothDock() + " vol=" + a2dpVolume);
         }
         String address = btDevice.getAddress();
         if (!BluetoothAdapter.checkBluetoothAddress(address)) {
             address = "";
         }
         AudioService.sDeviceLogger.log(new AudioEventLogger.StringEvent(
-                "A2DP sink connected: device addr=" + address + " state=" + state));
+                "A2DP sink connected: device addr=" + address + " state=" + state
+                        + " vol=" + a2dpVolume));
 
         final int a2dpCodec;
         synchronized (mDeviceBroker.mA2dpAvrcpLock) {
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index df33bf2..9457fe3 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -392,12 +392,14 @@
     * e.g. user on homescreen, no app playing anything, presses hardware volume buttons, this
     *    stream type is controlled.
     */
-   protected static final int DEFAULT_VOL_STREAM_NO_PLAYBACK = AudioSystem.STREAM_MUSIC;
+    protected static final int DEFAULT_VOL_STREAM_NO_PLAYBACK = AudioSystem.STREAM_MUSIC;
 
     private final AudioSystem.ErrorCallback mAudioSystemCallback = new AudioSystem.ErrorCallback() {
         public void onError(int error) {
             switch (error) {
             case AudioSystem.AUDIO_STATUS_SERVER_DIED:
+                mRecordMonitor.clear();
+
                 sendMsg(mAudioHandler, MSG_AUDIO_SERVER_DIED,
                         SENDMSG_NOOP, 0, 0, null, 0);
                 sendMsg(mAudioHandler, MSG_DISPATCH_AUDIO_SERVER_STATE,
@@ -906,6 +908,9 @@
         // Restore mono mode
         updateMasterMono(mContentResolver);
 
+        // Restore audio balance
+        updateMasterBalance(mContentResolver);
+
         // Restore ringer mode
         setRingerModeInt(getRingerModeInternal(), false);
 
@@ -1194,6 +1199,17 @@
         AudioSystem.setMasterMono(masterMono);
     }
 
+    private void updateMasterBalance(ContentResolver cr) {
+        final float masterBalance = System.getFloatForUser(
+                cr, System.MASTER_BALANCE, 0.f /* default */, UserHandle.USER_CURRENT);
+        if (DEBUG_VOL) {
+            Log.d(TAG, String.format("Master balance %f", masterBalance));
+        }
+        if (AudioSystem.setMasterBalance(masterBalance) != 0) {
+            Log.e(TAG, String.format("setMasterBalance failed for %f", masterBalance));
+        }
+    }
+
     private void sendEncodedSurroundMode(ContentResolver cr, String eventSource)
     {
         final int encodedSurroundMode = Settings.Global.getInt(
@@ -1370,6 +1386,8 @@
 
         updateMasterMono(cr);
 
+        updateMasterBalance(cr);
+
         // Each stream will read its own persisted settings
 
         // Broadcast the sticky intents
@@ -4946,6 +4964,8 @@
                 Settings.Global.DOCK_AUDIO_MEDIA_ENABLED), false, this);
             mContentResolver.registerContentObserver(Settings.System.getUriFor(
                     Settings.System.MASTER_MONO), false, this);
+            mContentResolver.registerContentObserver(Settings.System.getUriFor(
+                    Settings.System.MASTER_BALANCE), false, this);
 
             mEncodedSurroundMode = Settings.Global.getInt(
                     mContentResolver, Settings.Global.ENCODED_SURROUND_OUTPUT,
@@ -4979,6 +4999,7 @@
                 }
                 readDockAudioSettings(mContentResolver);
                 updateMasterMono(mContentResolver);
+                updateMasterBalance(mContentResolver);
                 updateEncodedSurroundOutput();
                 sendEnabledSurroundFormats(mContentResolver, mSurroundModeChanged);
                 updateAssistantUId(false);
diff --git a/services/core/java/com/android/server/audio/RecordingActivityMonitor.java b/services/core/java/com/android/server/audio/RecordingActivityMonitor.java
index 9d6628c..b2c7ff3 100644
--- a/services/core/java/com/android/server/audio/RecordingActivityMonitor.java
+++ b/services/core/java/com/android/server/audio/RecordingActivityMonitor.java
@@ -78,24 +78,27 @@
                 updateSnapshot(event, uid, session, source, recordingInfo,
                 portId, silenced, activeSource, clientEffects, effects);
         if (configsSystem != null){
-            synchronized (mClients) {
-                // list of recording configurations for "public consumption". It is only computed if
-                // there are non-system recording activity listeners.
-                final List<AudioRecordingConfiguration> configsPublic = mHasPublicClients ?
-                        anonymizeForPublicConsumption(configsSystem) :
-                            new ArrayList<AudioRecordingConfiguration>();
-                final Iterator<RecMonitorClient> clientIterator = mClients.iterator();
-                while (clientIterator.hasNext()) {
-                    final RecMonitorClient rmc = clientIterator.next();
-                    try {
-                        if (rmc.mIsPrivileged) {
-                            rmc.mDispatcherCb.dispatchRecordingConfigChange(configsSystem);
-                        } else {
-                            rmc.mDispatcherCb.dispatchRecordingConfigChange(configsPublic);
-                        }
-                    } catch (RemoteException e) {
-                        Log.w(TAG, "Could not call dispatchRecordingConfigChange() on client", e);
+            dispatchCallbacks(configsSystem);
+        }
+    }
+    private void dispatchCallbacks(List<AudioRecordingConfiguration> configs) {
+        synchronized (mClients) {
+            // list of recording configurations for "public consumption". It is only computed if
+            // there are non-system recording activity listeners.
+            final List<AudioRecordingConfiguration> configsPublic = mHasPublicClients
+                    ? anonymizeForPublicConsumption(configs) :
+                      new ArrayList<AudioRecordingConfiguration>();
+            final Iterator<RecMonitorClient> clientIterator = mClients.iterator();
+            while (clientIterator.hasNext()) {
+                final RecMonitorClient rmc = clientIterator.next();
+                try {
+                    if (rmc.mIsPrivileged) {
+                        rmc.mDispatcherCb.dispatchRecordingConfigChange(configs);
+                    } else {
+                        rmc.mDispatcherCb.dispatchRecordingConfigChange(configsPublic);
                     }
+                } catch (RemoteException e) {
+                    Log.w(TAG, "Could not call dispatchRecordingConfigChange() on client", e);
                 }
             }
         }
@@ -130,6 +133,13 @@
         AudioSystem.setRecordingCallback(this);
     }
 
+    void clear() {
+        synchronized (mRecordConfigs) {
+            mRecordConfigs.clear();
+        }
+        dispatchCallbacks(new ArrayList<AudioRecordingConfiguration>());
+    }
+
     void registerRecordingCallback(IRecordingConfigDispatcher rcdb, boolean isPrivileged) {
         if (rcdb == null) {
             return;
diff --git a/services/core/java/com/android/server/biometrics/AuthenticationClient.java b/services/core/java/com/android/server/biometrics/AuthenticationClient.java
index eaa7a83..bd4acdb 100644
--- a/services/core/java/com/android/server/biometrics/AuthenticationClient.java
+++ b/services/core/java/com/android/server/biometrics/AuthenticationClient.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.hardware.biometrics.BiometricAuthenticator;
 import android.hardware.biometrics.BiometricConstants;
+import android.hardware.biometrics.BiometricsProtoEnums;
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.security.KeyStore;
@@ -71,6 +72,11 @@
         stop(false /* initiatedByClient */);
     }
 
+    @Override
+    protected int statsAction() {
+        return BiometricsProtoEnums.ACTION_AUTHENTICATE;
+    }
+
     public boolean isBiometricPrompt() {
         return getCookie() != 0;
     }
@@ -80,8 +86,16 @@
     }
 
     @Override
+    protected boolean isCryptoOperation() {
+        return mOpId != 0;
+    }
+
+    @Override
     public boolean onAuthenticated(BiometricAuthenticator.Identifier identifier,
             boolean authenticated, ArrayList<Byte> token) {
+        super.logOnAuthenticated(authenticated, mRequireConfirmation, getTargetUserId(),
+                isBiometricPrompt());
+
         final BiometricServiceBase.ServiceListener listener = getListener();
 
         mMetricsLogger.action(mMetrics.actionBiometricAuth(), authenticated);
@@ -142,10 +156,7 @@
                     final int errorCode = lockoutMode == LOCKOUT_TIMED
                             ? BiometricConstants.BIOMETRIC_ERROR_LOCKOUT
                             : BiometricConstants.BIOMETRIC_ERROR_LOCKOUT_PERMANENT;
-                    if (listener != null) {
-                        listener.onError(getHalDeviceId(), errorCode, 0 /* vendorCode */,
-                                getCookie());
-                    }
+                    onError(getHalDeviceId(), errorCode, 0 /* vendorCode */);
                 } else {
                     // Don't send onAuthenticationFailed if we're in lockout, it causes a
                     // janky UI on Keyguard/BiometricPrompt since "authentication failed"
diff --git a/services/core/java/com/android/server/biometrics/BiometricService.java b/services/core/java/com/android/server/biometrics/BiometricService.java
index 15d66e6..b50b800 100644
--- a/services/core/java/com/android/server/biometrics/BiometricService.java
+++ b/services/core/java/com/android/server/biometrics/BiometricService.java
@@ -41,6 +41,7 @@
 import android.hardware.biometrics.BiometricConstants;
 import android.hardware.biometrics.BiometricPrompt;
 import android.hardware.biometrics.BiometricSourceType;
+import android.hardware.biometrics.BiometricsProtoEnums;
 import android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback;
 import android.hardware.biometrics.IBiometricService;
 import android.hardware.biometrics.IBiometricServiceReceiver;
@@ -64,6 +65,7 @@
 import android.text.TextUtils;
 import android.util.Pair;
 import android.util.Slog;
+import android.util.StatsLog;
 
 import com.android.internal.R;
 import com.android.internal.statusbar.IStatusBarService;
@@ -309,6 +311,7 @@
             // Continue authentication with the same modality/modalities after "try again" is
             // pressed
             final int mModality;
+            final boolean mRequireConfirmation;
 
             // The current state, which can be either idle, called, or started
             private int mState = STATE_AUTH_IDLE;
@@ -316,10 +319,13 @@
             // the authentication.
             byte[] mTokenEscrow;
 
+            // Timestamp when hardware authentication occurred
+            private long mAuthenticatedTimeMs;
+
             AuthSession(HashMap<Integer, Integer> modalities, IBinder token, long sessionId,
                     int userId, IBiometricServiceReceiver receiver, String opPackageName,
                     Bundle bundle, int callingUid, int callingPid, int callingUserId,
-                    int modality) {
+                    int modality, boolean requireConfirmation) {
                 mModalitiesWaiting = modalities;
                 mToken = token;
                 mSessionId = sessionId;
@@ -331,6 +337,11 @@
                 mCallingPid = callingPid;
                 mCallingUserId = callingUserId;
                 mModality = modality;
+                mRequireConfirmation = requireConfirmation;
+            }
+
+            boolean isCrypto() {
+                return mSessionId != 0;
             }
 
             boolean containsCookie(int cookie) {
@@ -412,6 +423,7 @@
                         mCurrentAuthSession.mState = STATE_AUTH_IDLE;
                         mCurrentAuthSession = null;
                     } else {
+                        mCurrentAuthSession.mAuthenticatedTimeMs = System.currentTimeMillis();
                         // Store the auth token and submit it to keystore after the confirmation
                         // button has been pressed.
                         mCurrentAuthSession.mTokenEscrow = token;
@@ -557,6 +569,8 @@
                     return;
                 }
 
+                logDialogDismissed(reason);
+
                 if (reason != BiometricPrompt.DISMISSED_REASON_POSITIVE) {
                     // Positive button is used by passive modalities as a "confirm" button,
                     // do not send to client
@@ -599,6 +613,77 @@
                             mCurrentAuthSession.mModality);
                 });
             }
+
+            private void logDialogDismissed(int reason) {
+                if (reason == BiometricPrompt.DISMISSED_REASON_POSITIVE) {
+                    // Explicit auth, authentication confirmed.
+                    // Latency in this case is authenticated -> confirmed. <Biometric>Service
+                    // should have the first half (first acquired -> authenticated).
+                    final long latency = System.currentTimeMillis()
+                            - mCurrentAuthSession.mAuthenticatedTimeMs;
+
+                    if (LoggableMonitor.DEBUG) {
+                        Slog.v(LoggableMonitor.TAG, "Confirmed! Modality: " + statsModality()
+                                + ", User: " + mCurrentAuthSession.mUserId
+                                + ", IsCrypto: " + mCurrentAuthSession.isCrypto()
+                                + ", Client: " + BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT
+                                + ", RequireConfirmation: "
+                                    + mCurrentAuthSession.mRequireConfirmation
+                                + ", State: " + StatsLog.BIOMETRIC_AUTHENTICATED__STATE__CONFIRMED
+                                + ", Latency: " + latency);
+                    }
+
+                    StatsLog.write(StatsLog.BIOMETRIC_AUTHENTICATED,
+                            statsModality(),
+                            mCurrentAuthSession.mUserId,
+                            mCurrentAuthSession.isCrypto(),
+                            BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT,
+                            mCurrentAuthSession.mRequireConfirmation,
+                            StatsLog.BIOMETRIC_AUTHENTICATED__STATE__CONFIRMED,
+                            latency);
+                } else {
+                    int error = reason == BiometricPrompt.DISMISSED_REASON_NEGATIVE
+                            ? BiometricConstants.BIOMETRIC_ERROR_NEGATIVE_BUTTON
+                            : reason == BiometricPrompt.DISMISSED_REASON_USER_CANCEL
+                                    ? BiometricConstants.BIOMETRIC_ERROR_USER_CANCELED
+                                    : 0;
+                    if (LoggableMonitor.DEBUG) {
+                        Slog.v(LoggableMonitor.TAG, "Dismissed! Modality: " + statsModality()
+                                + ", User: " + mCurrentAuthSession.mUserId
+                                + ", IsCrypto: " + mCurrentAuthSession.isCrypto()
+                                + ", Action: " + BiometricsProtoEnums.ACTION_AUTHENTICATE
+                                + ", Client: " + BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT
+                                + ", Error: " + error);
+                    }
+                    // Auth canceled
+                    StatsLog.write(StatsLog.BIOMETRIC_ERROR_OCCURRED,
+                            statsModality(),
+                            mCurrentAuthSession.mUserId,
+                            mCurrentAuthSession.isCrypto(),
+                            BiometricsProtoEnums.ACTION_AUTHENTICATE,
+                            BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT,
+                            error,
+                            0 /* vendorCode */);
+                }
+            }
+
+            private int statsModality() {
+                int modality = 0;
+                if (mCurrentAuthSession == null) {
+                    return BiometricsProtoEnums.MODALITY_UNKNOWN;
+                }
+                if ((mCurrentAuthSession.mModality & BiometricAuthenticator.TYPE_FINGERPRINT)
+                        != 0) {
+                    modality |= BiometricsProtoEnums.MODALITY_FINGERPRINT;
+                }
+                if ((mCurrentAuthSession.mModality & BiometricAuthenticator.TYPE_IRIS) != 0) {
+                    modality |= BiometricsProtoEnums.MODALITY_IRIS;
+                }
+                if ((mCurrentAuthSession.mModality & BiometricAuthenticator.TYPE_FACE) != 0) {
+                    modality |= BiometricsProtoEnums.MODALITY_FACE;
+                }
+                return modality;
+            }
         };
 
         @Override // Binder call
@@ -719,14 +804,17 @@
             // result back to the client.
             // TODO(b/123378871): Remove when moved.
             if (bundle.getBoolean(BiometricPrompt.KEY_ENABLE_FALLBACK)) {
-                mConfirmDeviceCredentialReceiver = receiver;
-                final KeyguardManager kgm = getContext().getSystemService(KeyguardManager.class);
-                // Use this so we don't need to duplicate logic..
-                final Intent intent = kgm.createConfirmDeviceCredentialIntent(null /* title */,
-                        null /* description */);
-                // Then give it the bundle to do magic behavior..
-                intent.putExtra(KeyguardManager.EXTRA_BIOMETRIC_PROMPT_BUNDLE, bundle);
-                getContext().startActivityAsUser(intent, UserHandle.CURRENT);
+                mHandler.post(() -> {
+                    mConfirmDeviceCredentialReceiver = receiver;
+                    final KeyguardManager kgm = getContext().getSystemService(
+                            KeyguardManager.class);
+                    // Use this so we don't need to duplicate logic..
+                    final Intent intent = kgm.createConfirmDeviceCredentialIntent(null /* title */,
+                            null /* description */);
+                    // Then give it the bundle to do magic behavior..
+                    intent.putExtra(KeyguardManager.EXTRA_BIOMETRIC_PROMPT_BUNDLE, bundle);
+                    getContext().startActivityAsUser(intent, UserHandle.CURRENT);
+                });
                 return;
             }
 
@@ -815,7 +903,11 @@
             try {
                 boolean requireConfirmation = bundle.getBoolean(
                         BiometricPrompt.KEY_REQUIRE_CONFIRMATION, true /* default */);
-
+                if ((modality & TYPE_FACE) != 0) {
+                    // Check if the user has forced confirmation to be required in Settings.
+                    requireConfirmation = requireConfirmation
+                            || mSettingObserver.getFaceAlwaysRequireConfirmation();
+                }
                 // Generate random cookies to pass to the services that should prepare to start
                 // authenticating. Store the cookie here and wait for all services to "ack"
                 // with the cookie. Once all cookies are received, we can show the prompt
@@ -827,7 +919,7 @@
                 authenticators.put(modality, cookie);
                 mPendingAuthSession = new AuthSession(authenticators, token, sessionId, userId,
                         receiver, opPackageName, bundle, callingUid, callingPid, callingUserId,
-                        modality);
+                        modality, requireConfirmation);
                 mPendingAuthSession.mState = STATE_AUTH_CALLED;
                 // No polymorphism :(
                 if ((modality & TYPE_FINGERPRINT) != 0) {
@@ -839,9 +931,6 @@
                     Slog.w(TAG, "Iris unsupported");
                 }
                 if ((modality & TYPE_FACE) != 0) {
-                    // Check if the user has forced confirmation to be required in Settings.
-                    requireConfirmation = requireConfirmation
-                            || mSettingObserver.getFaceAlwaysRequireConfirmation();
                     mFaceService.prepareForAuthentication(requireConfirmation,
                             token, sessionId, userId, mInternalReceiver, opPackageName,
                             cookie, callingUid, callingPid, callingUserId);
diff --git a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java
index 174ecfa..b65535a 100644
--- a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java
+++ b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java
@@ -35,6 +35,7 @@
 import android.content.pm.UserInfo;
 import android.hardware.biometrics.BiometricAuthenticator;
 import android.hardware.biometrics.BiometricConstants;
+import android.hardware.biometrics.BiometricsProtoEnums;
 import android.hardware.biometrics.IBiometricService;
 import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
 import android.hardware.biometrics.IBiometricServiceReceiverInternal;
@@ -55,6 +56,7 @@
 import android.util.Slog;
 import android.util.SparseBooleanArray;
 import android.util.SparseIntArray;
+import android.util.StatsLog;
 
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.statusbar.IStatusBarService;
@@ -220,8 +222,16 @@
      */
     protected void notifyClientActiveCallbacks(boolean isActive) {}
 
+    protected abstract int statsModality();
+
     protected abstract class AuthenticationClientImpl extends AuthenticationClient {
 
+        // Used to check if the public API that was invoked was from FingerprintManager. Only
+        // to be overridden by FingerprintService.
+        protected boolean isFingerprint() {
+            return false;
+        }
+
         public AuthenticationClientImpl(Context context, DaemonWrapper daemon, long halDeviceId,
                 IBinder token, ServiceListener listener, int targetUserId, int groupId, long opId,
                 boolean restricted, String owner, int cookie, boolean requireConfirmation) {
@@ -230,6 +240,19 @@
         }
 
         @Override
+        protected int statsClient() {
+            if (isKeyguard(getOwnerString())) {
+                return BiometricsProtoEnums.CLIENT_KEYGUARD;
+            } else if (isBiometricPrompt()) {
+                return BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT;
+            } else if (isFingerprint()) {
+                return BiometricsProtoEnums.CLIENT_FINGERPRINT_MANAGER;
+            } else {
+                return BiometricsProtoEnums.CLIENT_UNKNOWN;
+            }
+        }
+
+        @Override
         public void onStart() {
             try {
                 mActivityTaskManager.registerTaskStackListener(mTaskStackListener);
@@ -279,7 +302,7 @@
         }
     }
 
-    protected class EnrollClientImpl extends EnrollClient {
+    protected abstract class EnrollClientImpl extends EnrollClient {
 
         public EnrollClientImpl(Context context, DaemonWrapper daemon, long halDeviceId,
                 IBinder token, ServiceListener listener, int userId, int groupId,
@@ -296,7 +319,7 @@
         }
     }
 
-    protected class RemovalClientImpl extends RemovalClient {
+    protected abstract class RemovalClientImpl extends RemovalClient {
         private boolean mShouldNotify;
 
         public RemovalClientImpl(Context context, DaemonWrapper daemon, long halDeviceId,
@@ -318,7 +341,7 @@
         }
     }
 
-    protected class EnumerateClientImpl extends EnumerateClient {
+    protected abstract class EnumerateClientImpl extends EnumerateClient {
 
         public EnumerateClientImpl(Context context, DaemonWrapper daemon, long halDeviceId,
                 IBinder token, ServiceListener listener, int groupId, int userId,
@@ -600,6 +623,8 @@
         mHALDeathCount++;
         handleError(getHalDeviceId(), BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE,
                 0 /*vendorCode */);
+
+        StatsLog.write(StatsLog.BIOMETRIC_HAL_DEATH_REPORTED, statsModality());
     }
 
     protected ClientMonitor getCurrentClient() {
@@ -653,7 +678,6 @@
             } else {
                 updateActiveGroup(mCurrentUserId, null);
             }
-
         }
     }
 
diff --git a/services/core/java/com/android/server/biometrics/ClientMonitor.java b/services/core/java/com/android/server/biometrics/ClientMonitor.java
index d19aff6..e80b39b 100644
--- a/services/core/java/com/android/server/biometrics/ClientMonitor.java
+++ b/services/core/java/com/android/server/biometrics/ClientMonitor.java
@@ -36,7 +36,7 @@
  * the current client.  Subclasses are responsible for coordinating the interaction with
  * the biometric's HAL for the specific action (e.g. authenticate, enroll, enumerate, etc.).
  */
-public abstract class ClientMonitor implements IBinder.DeathRecipient {
+public abstract class ClientMonitor extends LoggableMonitor implements IBinder.DeathRecipient {
     protected static final int ERROR_ESRCH = 3; // Likely HAL is dead. See errno.h.
     protected static final boolean DEBUG = BiometricServiceBase.DEBUG;
     private static final AudioAttributes FINGERPRINT_SONFICATION_ATTRIBUTES =
@@ -157,6 +157,7 @@
      * @return true if client should be removed
      */
     public boolean onAcquired(int acquiredInfo, int vendorCode) {
+        super.logOnAcquired(acquiredInfo, vendorCode, getTargetUserId());
         try {
             if (mListener != null) {
                 mListener.onAcquired(getHalDeviceId(), acquiredInfo, vendorCode);
@@ -180,6 +181,7 @@
      * @return true if client should be removed
      */
     public boolean onError(long deviceId, int error, int vendorCode) {
+        super.logOnError(error, vendorCode, getTargetUserId());
         try {
             if (mListener != null) {
                 mListener.onError(deviceId, error, vendorCode, getCookie());
diff --git a/services/core/java/com/android/server/biometrics/EnrollClient.java b/services/core/java/com/android/server/biometrics/EnrollClient.java
index 8a0f085..1124b7f 100644
--- a/services/core/java/com/android/server/biometrics/EnrollClient.java
+++ b/services/core/java/com/android/server/biometrics/EnrollClient.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.hardware.biometrics.BiometricAuthenticator;
 import android.hardware.biometrics.BiometricConstants;
+import android.hardware.biometrics.BiometricsProtoEnums;
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.util.Slog;
@@ -36,6 +37,8 @@
     private final BiometricUtils mBiometricUtils;
     private final int[] mDisabledFeatures;
 
+    public abstract boolean shouldVibrate();
+
     public EnrollClient(Context context, Metrics metrics,
             BiometricServiceBase.DaemonWrapper daemon, long halDeviceId, IBinder token,
             BiometricServiceBase.ServiceListener listener, int userId, int groupId,
@@ -49,6 +52,11 @@
     }
 
     @Override
+    protected int statsAction() {
+        return BiometricsProtoEnums.ACTION_ENROLL;
+    }
+
+    @Override
     public boolean onEnrollResult(BiometricAuthenticator.Identifier identifier,
             int remaining) {
         if (remaining == 0) {
@@ -62,7 +70,9 @@
      */
     private boolean sendEnrollResult(BiometricAuthenticator.Identifier identifier,
             int remaining) {
-        vibrateSuccess();
+        if (shouldVibrate()) {
+            vibrateSuccess();
+        }
         mMetricsLogger.action(mMetrics.actionBiometricEnroll());
         try {
             getListener().onEnrollResult(identifier, remaining);
diff --git a/services/core/java/com/android/server/biometrics/EnumerateClient.java b/services/core/java/com/android/server/biometrics/EnumerateClient.java
index df6220c..0f57f48 100644
--- a/services/core/java/com/android/server/biometrics/EnumerateClient.java
+++ b/services/core/java/com/android/server/biometrics/EnumerateClient.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.hardware.biometrics.BiometricAuthenticator;
 import android.hardware.biometrics.BiometricConstants;
+import android.hardware.biometrics.BiometricsProtoEnums;
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.util.Slog;
@@ -38,6 +39,11 @@
     }
 
     @Override
+    protected int statsAction() {
+        return BiometricsProtoEnums.ACTION_ENUMERATE;
+    }
+
+    @Override
     public int start() {
         // The biometric template ids will be removed when we get confirmation from the HAL
         try {
diff --git a/services/core/java/com/android/server/biometrics/LoggableMonitor.java b/services/core/java/com/android/server/biometrics/LoggableMonitor.java
new file mode 100644
index 0000000..91c924d
--- /dev/null
+++ b/services/core/java/com/android/server/biometrics/LoggableMonitor.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.biometrics;
+
+import android.hardware.biometrics.BiometricConstants;
+import android.hardware.biometrics.BiometricsProtoEnums;
+import android.hardware.face.FaceManager;
+import android.util.Slog;
+import android.util.StatsLog;
+
+/**
+ * Abstract class that adds logging functionality to the ClientMonitor classes.
+ */
+public abstract class LoggableMonitor {
+
+    public static final String TAG = "BiometricStats";
+    public static final boolean DEBUG = true;
+
+    private long mFirstAcquireTimeMs;
+
+    /**
+     * Only valid for AuthenticationClient.
+     * @return true if the client is authenticating for a crypto operation.
+     */
+    protected boolean isCryptoOperation() {
+        return false;
+    }
+
+    /**
+     * @return One of {@link BiometricsProtoEnums} MODALITY_* constants.
+     */
+    protected abstract int statsModality();
+
+    /**
+     * Action == enroll, authenticate, remove, enumerate.
+     * @return One of {@link BiometricsProtoEnums} ACTION_* constants.
+     */
+    protected abstract int statsAction();
+
+    /**
+     * Only matters for AuthenticationClient. Should only be overridden in
+     * {@link BiometricServiceBase}, which determines if a client is for BiometricPrompt, Keyguard,
+     * etc.
+     * @return one of {@link BiometricsProtoEnums} CLIENT_* constants.
+     */
+    protected int statsClient() {
+        return BiometricsProtoEnums.CLIENT_UNKNOWN;
+    }
+
+    protected final void logOnAcquired(int acquiredInfo, int vendorCode, int targetUserId) {
+        if (statsModality() == BiometricsProtoEnums.MODALITY_FACE) {
+            if (acquiredInfo == FaceManager.FACE_ACQUIRED_START) {
+                mFirstAcquireTimeMs = System.currentTimeMillis();
+            }
+        } else if (acquiredInfo == BiometricConstants.BIOMETRIC_ACQUIRED_GOOD) {
+            if (mFirstAcquireTimeMs == 0) {
+                mFirstAcquireTimeMs = System.currentTimeMillis();
+            }
+        }
+        if (DEBUG) {
+            Slog.v(TAG, "Acquired! Modality: " + statsModality()
+                    + ", User: " + targetUserId
+                    + ", IsCrypto: " + isCryptoOperation()
+                    + ", Action: " + statsAction()
+                    + ", Client: " + statsClient()
+                    + ", AcquiredInfo: " + acquiredInfo
+                    + ", VendorCode: " + vendorCode);
+        }
+        StatsLog.write(StatsLog.BIOMETRIC_ACQUIRED,
+                statsModality(),
+                targetUserId,
+                isCryptoOperation(),
+                statsAction(),
+                statsClient(),
+                acquiredInfo,
+                0 /* vendorCode */); // Don't log vendorCode for now
+    }
+
+    protected final void logOnError(int error, int vendorCode, int targetUserId) {
+        if (DEBUG) {
+            Slog.v(TAG, "Error! Modality: " + statsModality()
+                    + ", User: " + targetUserId
+                    + ", IsCrypto: " + isCryptoOperation()
+                    + ", Action: " + statsAction()
+                    + ", Client: " + statsClient()
+                    + ", Error: " + error
+                    + ", VendorCode: " + vendorCode);
+        }
+        StatsLog.write(StatsLog.BIOMETRIC_ERROR_OCCURRED,
+                statsModality(),
+                targetUserId,
+                isCryptoOperation(),
+                statsAction(),
+                statsClient(),
+                error,
+                vendorCode);
+    }
+
+    protected final void logOnAuthenticated(boolean authenticated, boolean requireConfirmation,
+            int targetUserId, boolean isBiometricPrompt) {
+        int authState = StatsLog.BIOMETRIC_AUTHENTICATED__STATE__UNKNOWN;
+        if (!authenticated) {
+            authState = StatsLog.BIOMETRIC_AUTHENTICATED__STATE__REJECTED;
+        } else {
+            // Authenticated
+            if (isBiometricPrompt && requireConfirmation) {
+                authState = StatsLog.BIOMETRIC_AUTHENTICATED__STATE__PENDING_CONFIRMATION;
+            } else {
+                authState = StatsLog.BIOMETRIC_AUTHENTICATED__STATE__CONFIRMED;
+            }
+        }
+
+        // Only valid if we have a first acquired time, otherwise set to -1
+        final long latency = mFirstAcquireTimeMs != 0
+                ? (System.currentTimeMillis() - mFirstAcquireTimeMs)
+                : -1;
+
+        if (DEBUG) {
+            Slog.v(TAG, "Authenticated! Modality: " + statsModality()
+                    + ", User: " + targetUserId
+                    + ", IsCrypto: " + isCryptoOperation()
+                    + ", Client: " + statsClient()
+                    + ", RequireConfirmation: " + requireConfirmation
+                    + ", State: " + authState
+                    + ", Latency: " + latency);
+        }
+
+        StatsLog.write(StatsLog.BIOMETRIC_AUTHENTICATED,
+                statsModality(),
+                targetUserId,
+                isCryptoOperation(),
+                statsClient(),
+                requireConfirmation,
+                authState,
+                latency);
+    }
+}
diff --git a/services/core/java/com/android/server/biometrics/RemovalClient.java b/services/core/java/com/android/server/biometrics/RemovalClient.java
index be233ec..0509067 100644
--- a/services/core/java/com/android/server/biometrics/RemovalClient.java
+++ b/services/core/java/com/android/server/biometrics/RemovalClient.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.hardware.biometrics.BiometricAuthenticator;
 import android.hardware.biometrics.BiometricConstants;
+import android.hardware.biometrics.BiometricsProtoEnums;
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.util.Slog;
@@ -43,6 +44,11 @@
     }
 
     @Override
+    protected int statsAction() {
+        return BiometricsProtoEnums.ACTION_REMOVE;
+    }
+
+    @Override
     public int start() {
         // The biometric template ids will be removed when we get confirmation from the HAL
         try {
diff --git a/services/core/java/com/android/server/biometrics/face/FaceService.java b/services/core/java/com/android/server/biometrics/face/FaceService.java
index a2aacdd..90342ee 100644
--- a/services/core/java/com/android/server/biometrics/face/FaceService.java
+++ b/services/core/java/com/android/server/biometrics/face/FaceService.java
@@ -27,6 +27,7 @@
 import android.content.pm.UserInfo;
 import android.hardware.biometrics.BiometricAuthenticator;
 import android.hardware.biometrics.BiometricConstants;
+import android.hardware.biometrics.BiometricsProtoEnums;
 import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
 import android.hardware.biometrics.IBiometricServiceReceiverInternal;
 import android.hardware.biometrics.face.V1_0.IBiometricsFace;
@@ -90,6 +91,11 @@
             super(context, daemon, halDeviceId, token, listener, targetUserId, groupId, opId,
                     restricted, owner, cookie, requireConfirmation);
         }
+
+        @Override
+        protected int statsModality() {
+            return FaceService.this.statsModality();
+        }
     }
 
     /**
@@ -121,7 +127,17 @@
             final boolean restricted = isRestricted();
             final EnrollClientImpl client = new EnrollClientImpl(getContext(), mDaemonWrapper,
                     mHalDeviceId, token, new ServiceListenerImpl(receiver), mCurrentUserId,
-                    0 /* groupId */, cryptoToken, restricted, opPackageName, disabledFeatures);
+                    0 /* groupId */, cryptoToken, restricted, opPackageName, disabledFeatures) {
+                @Override
+                public boolean shouldVibrate() {
+                    return false;
+                }
+
+                @Override
+                protected int statsModality() {
+                    return FaceService.this.statsModality();
+                }
+            };
 
             enrollInternal(client, UserHandle.getCallingUserId());
         }
@@ -201,7 +217,12 @@
             final boolean restricted = isRestricted();
             final RemovalClientImpl client = new RemovalClientImpl(getContext(), mDaemonWrapper,
                     mHalDeviceId, token, new ServiceListenerImpl(receiver), faceId, 0 /* groupId */,
-                    userId, restricted, token.toString());
+                    userId, restricted, token.toString()) {
+                @Override
+                protected int statsModality() {
+                    return FaceService.this.statsModality();
+                }
+            };
             client.setShouldNotifyUserActivity(true);
             removeInternal(client);
         }
@@ -214,7 +235,12 @@
             final boolean restricted = isRestricted();
             final EnumerateClientImpl client = new EnumerateClientImpl(getContext(), mDaemonWrapper,
                     mHalDeviceId, token, new ServiceListenerImpl(receiver), userId, userId,
-                    restricted, getContext().getOpPackageName());
+                    restricted, getContext().getOpPackageName()) {
+                @Override
+                protected int statsModality() {
+                    return FaceService.this.statsModality();
+                }
+            };
             enumerateInternal(client);
         }
 
@@ -765,6 +791,11 @@
         // noop for Face.
     }
 
+    @Override
+    protected int statsModality() {
+        return BiometricsProtoEnums.MODALITY_FACE;
+    }
+
     /** Gets the face daemon */
     private synchronized IBiometricsFace getFaceDaemon() {
         if (mDaemon == null) {
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
index fcf821f2..62947c7 100644
--- a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
@@ -30,6 +30,7 @@
 import android.content.pm.UserInfo;
 import android.hardware.biometrics.BiometricAuthenticator;
 import android.hardware.biometrics.BiometricConstants;
+import android.hardware.biometrics.BiometricsProtoEnums;
 import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
 import android.hardware.biometrics.IBiometricServiceReceiverInternal;
 import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
@@ -101,6 +102,11 @@
     }
 
     private final class FingerprintAuthClient extends AuthenticationClientImpl {
+        @Override
+        protected boolean isFingerprint() {
+            return true;
+        }
+
         public FingerprintAuthClient(Context context,
                 DaemonWrapper daemon, long halDeviceId, IBinder token,
                 ServiceListener listener, int targetUserId, int groupId, long opId,
@@ -109,6 +115,11 @@
             super(context, daemon, halDeviceId, token, listener, targetUserId, groupId, opId,
                     restricted, owner, cookie, requireConfirmation);
         }
+
+        @Override
+        protected int statsModality() {
+            return FingerprintService.this.statsModality();
+        }
     }
 
     /**
@@ -142,7 +153,17 @@
             final int groupId = userId; // default group for fingerprint enrollment
             final EnrollClientImpl client = new EnrollClientImpl(getContext(), mDaemonWrapper,
                     mHalDeviceId, token, new ServiceListenerImpl(receiver), mCurrentUserId, groupId,
-                    cryptoToken, restricted, opPackageName, new int[0] /* disabledFeatures */);
+                    cryptoToken, restricted, opPackageName, new int[0] /* disabledFeatures */) {
+                @Override
+                public boolean shouldVibrate() {
+                    return true;
+                }
+
+                @Override
+                protected int statsModality() {
+                    return FingerprintService.this.statsModality();
+                }
+            };
 
             enrollInternal(client, userId);
         }
@@ -220,7 +241,12 @@
             final boolean restricted = isRestricted();
             final RemovalClientImpl client = new RemovalClientImpl(getContext(), mDaemonWrapper,
                     mHalDeviceId, token, new ServiceListenerImpl(receiver), fingerId, groupId,
-                    userId, restricted, token.toString());
+                    userId, restricted, token.toString()) {
+                @Override
+                protected int statsModality() {
+                    return FingerprintService.this.statsModality();
+                }
+            };
             client.setShouldNotifyUserActivity(true);
             removeInternal(client);
         }
@@ -233,7 +259,12 @@
             final boolean restricted = isRestricted();
             final EnumerateClientImpl client = new EnumerateClientImpl(getContext(), mDaemonWrapper,
                     mHalDeviceId, token, new ServiceListenerImpl(receiver), userId, userId,
-                    restricted, getContext().getOpPackageName());
+                    restricted, getContext().getOpPackageName()) {
+                @Override
+                protected int statsModality() {
+                    return FingerprintService.this.statsModality();
+                }
+            };
             enumerateInternal(client);
         }
 
@@ -539,6 +570,11 @@
             }
             return remaining == 0;
         }
+
+        @Override
+        protected int statsModality() {
+            return FingerprintService.this.statsModality();
+        }
     }
 
     /**
@@ -553,6 +589,11 @@
                     restricted,
                     owner);
         }
+
+        @Override
+        protected int statsModality() {
+            return FingerprintService.this.statsModality();
+        }
     }
 
     private final FingerprintMetrics mFingerprintMetrics = new FingerprintMetrics();
@@ -880,6 +921,11 @@
         }
     }
 
+    @Override
+    protected int statsModality() {
+        return BiometricsProtoEnums.MODALITY_FINGERPRINT;
+    }
+
     /** Gets the fingerprint daemon */
     private synchronized IBiometricsFingerprint getFingerprintDaemon() {
         if (mDaemon == null) {
diff --git a/services/core/java/com/android/server/biometrics/iris/IrisService.java b/services/core/java/com/android/server/biometrics/iris/IrisService.java
index 37cdc2a..eb457b6 100644
--- a/services/core/java/com/android/server/biometrics/iris/IrisService.java
+++ b/services/core/java/com/android/server/biometrics/iris/IrisService.java
@@ -17,6 +17,7 @@
 package com.android.server.biometrics.iris;
 
 import android.content.Context;
+import android.hardware.biometrics.BiometricsProtoEnums;
 
 import com.android.server.biometrics.BiometricServiceBase;
 import com.android.server.biometrics.BiometricUtils;
@@ -128,4 +129,9 @@
     protected boolean checkAppOps(int uid, String opPackageName) {
         return false;
     }
+
+    @Override
+    protected int statsModality() {
+        return BiometricsProtoEnums.MODALITY_IRIS;
+    }
 }
diff --git a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
index d0cff25..cd4ce2d 100644
--- a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
+++ b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
@@ -235,6 +235,8 @@
     public final Messenger messenger;
     public final AsyncChannel asyncChannel;
 
+    public final int factorySerialNumber;
+
     // Used by ConnectivityService to keep track of 464xlat.
     public Nat464Xlat clatd;
 
@@ -252,7 +254,7 @@
     public NetworkAgentInfo(Messenger messenger, AsyncChannel ac, Network net, NetworkInfo info,
             LinkProperties lp, NetworkCapabilities nc, int score, Context context, Handler handler,
             NetworkMisc misc, ConnectivityService connService, INetd netd,
-            INetworkManagementService nms) {
+            INetworkManagementService nms, int factorySerialNumber) {
         this.messenger = messenger;
         asyncChannel = ac;
         network = net;
@@ -266,6 +268,7 @@
         mContext = context;
         mHandler = handler;
         networkMisc = misc;
+        this.factorySerialNumber = factorySerialNumber;
     }
 
     /**
diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java
index eb5be77..a14fd17 100644
--- a/services/core/java/com/android/server/connectivity/Tethering.java
+++ b/services/core/java/com/android/server/connectivity/Tethering.java
@@ -121,7 +121,6 @@
 import java.util.HashSet;
 import java.util.Set;
 
-
 /**
  * @hide
  *
@@ -223,7 +222,8 @@
 
         IntentFilter filter = new IntentFilter();
         filter.addAction(ACTION_CARRIER_CONFIG_CHANGED);
-        mEntitlementMgr = mDeps.getEntitlementManager(mContext, mLog, systemProperties);
+        mEntitlementMgr = mDeps.getEntitlementManager(mContext, mTetherMasterSM,
+                mLog, systemProperties);
         mCarrierConfigChange = new VersionedBroadcastListener(
                 "CarrierConfigChangeListener", mContext, smHandler, filter,
                 (Intent ignored) -> {
@@ -470,6 +470,7 @@
                 } else {
                     sendTetherResult(receiver, resultCode);
                 }
+                mEntitlementMgr.updateEntitlementCacheValue(type, resultCode);
             }
         };
 
@@ -1662,6 +1663,14 @@
         mUpstreamNetworkMonitor.startTrackDefaultNetwork(mDeps.getDefaultNetworkRequest());
     }
 
+    /** Get the latest value of the tethering entitlement check. */
+    public void getLatestTetheringEntitlementValue(int type, ResultReceiver receiver,
+            boolean showEntitlementUi) {
+        if (receiver != null) {
+            mEntitlementMgr.getLatestTetheringEntitlementValue(type, receiver, showEntitlementUi);
+        }
+    }
+
     @Override
     public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
         // Binder.java closes the resource for us.
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
index 62a1b03..e1af81b 100644
--- a/services/core/java/com/android/server/connectivity/Vpn.java
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
@@ -54,6 +54,7 @@
 import android.net.Network;
 import android.net.NetworkAgent;
 import android.net.NetworkCapabilities;
+import android.net.NetworkFactory;
 import android.net.NetworkInfo;
 import android.net.NetworkInfo.DetailedState;
 import android.net.NetworkMisc;
@@ -151,7 +152,7 @@
                 .divide(BigInteger.valueOf(100));
     }
     // How many routes to evaluate before bailing and declaring this Vpn should provide
-    // the INTERNET capability. This is necessary because computing the adress space is
+    // the INTERNET capability. This is necessary because computing the address space is
     // O(n²) and this is running in the system service, so a limit is needed to alleviate
     // the risk of attack.
     // This is taken as a total of IPv4 + IPV6 routes for simplicity, but the algorithm
@@ -165,6 +166,7 @@
     private final NetworkInfo mNetworkInfo;
     private String mPackage;
     private int mOwnerUID;
+    private boolean mIsPackageTargetingAtLeastQ;
     private String mInterface;
     private Connection mConnection;
     private LegacyVpnRunner mLegacyVpnRunner;
@@ -194,6 +196,12 @@
     private boolean mLockdown = false;
 
     /**
+     * Set of packages in addition to the VPN app itself that can access the network directly when
+     * VPN is not connected even if {@code mLockdown} is set.
+     */
+    private @NonNull List<String> mLockdownWhitelist = Collections.emptyList();
+
+    /**
      * List of UIDs for which networking should be blocked until VPN is ready, during brief periods
      * when VPN is not running. For example, during system startup or after a crash.
      * @see mLockdown
@@ -220,6 +228,7 @@
 
         mPackage = VpnConfig.LEGACY_VPN;
         mOwnerUID = getAppUid(mPackage, mUserHandle);
+        mIsPackageTargetingAtLeastQ = doesPackageTargetAtLeastQ(mPackage);
 
         try {
             netService.registerObserver(mObserver);
@@ -261,8 +270,11 @@
 
     public void updateCapabilities() {
         final Network[] underlyingNetworks = (mConfig != null) ? mConfig.underlyingNetworks : null;
+        // Only apps targeting Q and above can explicitly declare themselves as metered.
+        final boolean isAlwaysMetered =
+                mIsPackageTargetingAtLeastQ && (mConfig == null || mConfig.isMetered);
         updateCapabilities(mContext.getSystemService(ConnectivityManager.class), underlyingNetworks,
-                mNetworkCapabilities);
+                mNetworkCapabilities, isAlwaysMetered);
 
         if (mNetworkAgent != null) {
             mNetworkAgent.sendNetworkCapabilities(mNetworkCapabilities);
@@ -271,11 +283,13 @@
 
     @VisibleForTesting
     public static void updateCapabilities(ConnectivityManager cm, Network[] underlyingNetworks,
-            NetworkCapabilities caps) {
+            NetworkCapabilities caps, boolean isAlwaysMetered) {
         int[] transportTypes = new int[] { NetworkCapabilities.TRANSPORT_VPN };
         int downKbps = NetworkCapabilities.LINK_BANDWIDTH_UNSPECIFIED;
         int upKbps = NetworkCapabilities.LINK_BANDWIDTH_UNSPECIFIED;
-        boolean metered = false;
+        // VPN's meteredness is OR'd with isAlwaysMetered and meteredness of its underlying
+        // networks.
+        boolean metered = isAlwaysMetered;
         boolean roaming = false;
         boolean congested = false;
 
@@ -320,9 +334,9 @@
      *
      * Used to enable/disable legacy VPN lockdown.
      *
-     * This uses the same ip rule mechanism as {@link #setAlwaysOnPackage(String, boolean)};
-     * previous settings from calling that function will be replaced and saved with the
-     * always-on state.
+     * This uses the same ip rule mechanism as
+     * {@link #setAlwaysOnPackage(String, boolean, List<String>)}; previous settings from calling
+     * that function will be replaced and saved with the always-on state.
      *
      * @param lockdown whether to prevent all traffic outside of a VPN.
      */
@@ -419,12 +433,14 @@
      *
      * @param packageName the package to designate as always-on VPN supplier.
      * @param lockdown whether to prevent traffic outside of a VPN, for example while connecting.
+     * @param lockdownWhitelist packages to be whitelisted from lockdown.
      * @return {@code true} if the package has been set as always-on, {@code false} otherwise.
      */
-    public synchronized boolean setAlwaysOnPackage(String packageName, boolean lockdown) {
+    public synchronized boolean setAlwaysOnPackage(
+            String packageName, boolean lockdown, List<String> lockdownWhitelist) {
         enforceControlPermissionOrInternalCaller();
 
-        if (setAlwaysOnPackageInternal(packageName, lockdown)) {
+        if (setAlwaysOnPackageInternal(packageName, lockdown, lockdownWhitelist)) {
             saveAlwaysOnPackage();
             return true;
         }
@@ -439,15 +455,27 @@
      *
      * @param packageName the package to designate as always-on VPN supplier.
      * @param lockdown whether to prevent traffic outside of a VPN, for example while connecting.
+     * @param lockdownWhitelist packages to be whitelisted from lockdown. This is only used if
+     *        {@code lockdown} is {@code true}. Packages must not contain commas.
      * @return {@code true} if the package has been set as always-on, {@code false} otherwise.
      */
     @GuardedBy("this")
-    private boolean setAlwaysOnPackageInternal(String packageName, boolean lockdown) {
+    private boolean setAlwaysOnPackageInternal(
+            String packageName, boolean lockdown, List<String> lockdownWhitelist) {
         if (VpnConfig.LEGACY_VPN.equals(packageName)) {
             Log.w(TAG, "Not setting legacy VPN \"" + packageName + "\" as always-on.");
             return false;
         }
 
+        if (lockdownWhitelist != null) {
+            for (String pkg : lockdownWhitelist) {
+                if (pkg.contains(",")) {
+                    Log.w(TAG, "Not setting always-on vpn, invalid whitelisted package: " + pkg);
+                    return false;
+                }
+            }
+        }
+
         if (packageName != null) {
             // Pre-authorize new always-on VPN package.
             if (!setPackageAuthorization(packageName, true)) {
@@ -460,13 +488,18 @@
         }
 
         mLockdown = (mAlwaysOn && lockdown);
+        mLockdownWhitelist = (mLockdown && lockdownWhitelist != null)
+                ? Collections.unmodifiableList(new ArrayList<>(lockdownWhitelist))
+                : Collections.emptyList();
+
         if (isCurrentPreparedPackage(packageName)) {
             updateAlwaysOnNotification(mNetworkInfo.getDetailedState());
+            setVpnForcedLocked(mLockdown);
         } else {
             // Prepare this app. The notification will update as a side-effect of updateState().
+            // It also calls setVpnForcedLocked().
             prepareInternal(packageName);
         }
-        setVpnForcedLocked(mLockdown);
         return true;
     }
 
@@ -478,7 +511,6 @@
      * @return the package name of the VPN controller responsible for always-on VPN,
      *         or {@code null} if none is set or always-on VPN is controlled through
      *         lockdown instead.
-     * @hide
      */
     public synchronized String getAlwaysOnPackage() {
         enforceControlPermissionOrInternalCaller();
@@ -486,6 +518,13 @@
     }
 
     /**
+     * @return an immutable list of packages whitelisted from always-on VPN lockdown.
+     */
+    public synchronized List<String> getLockdownWhitelist() {
+        return mLockdown ? mLockdownWhitelist : null;
+    }
+
+    /**
      * Save the always-on package and lockdown config into Settings.Secure
      */
     @GuardedBy("this")
@@ -496,6 +535,9 @@
                     getAlwaysOnPackage(), mUserHandle);
             mSystemServices.settingsSecurePutIntForUser(Settings.Secure.ALWAYS_ON_VPN_LOCKDOWN,
                     (mAlwaysOn && mLockdown ? 1 : 0), mUserHandle);
+            mSystemServices.settingsSecurePutStringForUser(
+                    Settings.Secure.ALWAYS_ON_VPN_LOCKDOWN_WHITELIST,
+                    String.join(",", mLockdownWhitelist), mUserHandle);
         } finally {
             Binder.restoreCallingIdentity(token);
         }
@@ -512,7 +554,11 @@
                     Settings.Secure.ALWAYS_ON_VPN_APP, mUserHandle);
             final boolean alwaysOnLockdown = mSystemServices.settingsSecureGetIntForUser(
                     Settings.Secure.ALWAYS_ON_VPN_LOCKDOWN, 0 /*default*/, mUserHandle) != 0;
-            setAlwaysOnPackageInternal(alwaysOnPackage, alwaysOnLockdown);
+            final String whitelistString = mSystemServices.settingsSecureGetStringForUser(
+                    Settings.Secure.ALWAYS_ON_VPN_LOCKDOWN_WHITELIST, mUserHandle);
+            final List<String> whitelistedPackages = TextUtils.isEmpty(whitelistString)
+                    ? Collections.emptyList() : Arrays.asList(whitelistString.split(","));
+            setAlwaysOnPackageInternal(alwaysOnPackage, alwaysOnLockdown, whitelistedPackages);
         } finally {
             Binder.restoreCallingIdentity(token);
         }
@@ -532,7 +578,7 @@
             }
             // Remove always-on VPN if it's not supported.
             if (!isAlwaysOnPackageSupported(alwaysOnPackage)) {
-                setAlwaysOnPackage(null, false);
+                setAlwaysOnPackage(null, false, null);
                 return false;
             }
             // Skip if the service is already established. This isn't bulletproof: it's not bound
@@ -686,6 +732,7 @@
             Log.i(TAG, "Switched from " + mPackage + " to " + newPackage);
             mPackage = newPackage;
             mOwnerUID = getAppUid(newPackage, mUserHandle);
+            mIsPackageTargetingAtLeastQ = doesPackageTargetAtLeastQ(newPackage);
             try {
                 mNetd.allowProtect(mOwnerUID);
             } catch (Exception e) {
@@ -751,6 +798,21 @@
         return result;
     }
 
+    private boolean doesPackageTargetAtLeastQ(String packageName) {
+        if (VpnConfig.LEGACY_VPN.equals(packageName)) {
+            return true;
+        }
+        PackageManager pm = mContext.getPackageManager();
+        try {
+            ApplicationInfo appInfo =
+                    pm.getApplicationInfoAsUser(packageName, 0 /*flags*/, mUserHandle);
+            return appInfo.targetSdkVersion >= VERSION_CODES.Q;
+        } catch (NameNotFoundException unused) {
+            Log.w(TAG, "Can't find \"" + packageName + "\"");
+            return false;
+        }
+    }
+
     public NetworkInfo getNetworkInfo() {
         return mNetworkInfo;
     }
@@ -904,7 +966,8 @@
         try {
             mNetworkAgent = new NetworkAgent(mLooper, mContext, NETWORKTYPE /* logtag */,
                     mNetworkInfo, mNetworkCapabilities, lp,
-                    ConnectivityConstants.VPN_DEFAULT_SCORE, networkMisc) {
+                    ConnectivityConstants.VPN_DEFAULT_SCORE, networkMisc,
+                    NetworkFactory.SerialNumber.VPN) {
                             @Override
                             public void unwanted() {
                                 // We are user controlled, not driven by NetworkRequest.
@@ -1038,6 +1101,8 @@
                 // as rules are deleted. This prevents data leakage as the rules are moved over.
                 agentDisconnect(oldNetworkAgent);
             }
+            // Set up VPN's capabilities such as meteredness.
+            updateCapabilities();
 
             if (oldConnection != null) {
                 mContext.unbindService(oldConnection);
@@ -1249,9 +1314,10 @@
     }
 
     /**
-     * Restrict network access from all UIDs affected by this {@link Vpn}, apart from the VPN
-     * service app itself, to only sockets that have had {@code protect()} called on them. All
-     * non-VPN traffic is blocked via a {@code PROHIBIT} response from the kernel.
+     * Restricts network access from all UIDs affected by this {@link Vpn}, apart from the VPN
+     * service app itself and whitelisted packages, to only sockets that have had {@code protect()}
+     * called on them. All non-VPN traffic is blocked via a {@code PROHIBIT} response from the
+     * kernel.
      *
      * The exception for the VPN UID isn't technically necessary -- setup should use protected
      * sockets -- but in practice it saves apps that don't protect their sockets from breaking.
@@ -1267,8 +1333,13 @@
      */
     @GuardedBy("this")
     private void setVpnForcedLocked(boolean enforce) {
-        final List<String> exemptedPackages =
-                isNullOrLegacyVpn(mPackage) ? null : Collections.singletonList(mPackage);
+        final List<String> exemptedPackages;
+        if (isNullOrLegacyVpn(mPackage)) {
+            exemptedPackages = null;
+        } else {
+            exemptedPackages = new ArrayList<>(mLockdownWhitelist);
+            exemptedPackages.add(mPackage);
+        }
         final Set<UidRange> removedRanges = new ArraySet<>(mBlockedUsers);
 
         Set<UidRange> addedRanges = Collections.emptySet();
@@ -1732,6 +1803,7 @@
         config.user = profile.key;
         config.interfaze = iface;
         config.session = profile.name;
+        config.isMetered = false;
 
         config.addLegacyRoutes(profile.routes);
         if (!profile.dnsServers.isEmpty()) {
diff --git a/services/core/java/com/android/server/connectivity/tethering/EntitlementManager.java b/services/core/java/com/android/server/connectivity/tethering/EntitlementManager.java
index a4e3e1d..75aac10 100644
--- a/services/core/java/com/android/server/connectivity/tethering/EntitlementManager.java
+++ b/services/core/java/com/android/server/connectivity/tethering/EntitlementManager.java
@@ -21,6 +21,9 @@
 import static android.net.ConnectivityManager.EXTRA_REM_TETHER_TYPE;
 import static android.net.ConnectivityManager.EXTRA_RUN_PROVISION;
 import static android.net.ConnectivityManager.EXTRA_SET_ALARM;
+import static android.net.ConnectivityManager.TETHER_ERROR_ENTITLEMENT_UNKONWN;
+import static android.net.ConnectivityManager.TETHER_ERROR_NO_ERROR;
+import static android.net.ConnectivityManager.TETHER_ERROR_PROVISION_FAILED;
 
 import static com.android.internal.R.string.config_wifi_tether_enable;
 
@@ -31,15 +34,21 @@
 import android.content.res.Resources;
 import android.net.util.SharedLog;
 import android.os.Binder;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Parcel;
 import android.os.PersistableBundle;
 import android.os.ResultReceiver;
 import android.os.UserHandle;
 import android.provider.Settings;
 import android.telephony.CarrierConfigManager;
 import android.util.ArraySet;
+import android.util.Log;
+import android.util.SparseIntArray;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.StateMachine;
 import com.android.server.connectivity.MockableSystemProperties;
 
 /**
@@ -50,6 +59,7 @@
  */
 public class EntitlementManager {
     private static final String TAG = EntitlementManager.class.getSimpleName();
+    private static final boolean DBG = false;
 
     // {@link ComponentName} of the Service used to run tether provisioning.
     private static final ComponentName TETHER_SERVICE = ComponentName.unflattenFromString(
@@ -65,15 +75,19 @@
     private final Context mContext;
     private final MockableSystemProperties mSystemProperties;
     private final SharedLog mLog;
+    private final Handler mMasterHandler;
+    private final SparseIntArray mEntitlementCacheValue;
     @Nullable
     private TetheringConfiguration mConfig;
 
-    public EntitlementManager(Context ctx, SharedLog log,
+    public EntitlementManager(Context ctx, StateMachine tetherMasterSM, SharedLog log,
             MockableSystemProperties systemProperties) {
         mContext = ctx;
-        mLog = log;
+        mLog = log.forSubComponent(TAG);
         mCurrentTethers = new ArraySet<Integer>();
         mSystemProperties = systemProperties;
+        mEntitlementCacheValue = new SparseIntArray();
+        mMasterHandler = tetherMasterSM.getHandler();
     }
 
     /**
@@ -128,6 +142,10 @@
      * Reference ConnectivityManager.TETHERING_{@code *} for each tether type.
      */
     public void reevaluateSimCardProvisioning() {
+        synchronized (mEntitlementCacheValue) {
+            mEntitlementCacheValue.clear();
+        }
+
         if (!mConfig.hasMobileHotspotProvisionApp()) return;
         if (carrierConfigAffirmsEntitlementCheckNotRequired()) return;
 
@@ -175,6 +193,11 @@
     }
 
     public void runUiTetherProvisioningAndEnable(int type, ResultReceiver receiver) {
+        runUiTetherProvisioning(type, receiver);
+    }
+
+    @VisibleForTesting
+    protected void runUiTetherProvisioning(int type, ResultReceiver receiver) {
         Intent intent = new Intent(Settings.ACTION_TETHER_PROVISIONING);
         intent.putExtra(EXTRA_ADD_TETHER_TYPE, type);
         intent.putExtra(EXTRA_PROVISION_CALLBACK, receiver);
@@ -221,4 +244,70 @@
             Binder.restoreCallingIdentity(ident);
         }
     }
+
+    private ResultReceiver buildProxyReceiver(int type, final ResultReceiver receiver) {
+        ResultReceiver rr = new ResultReceiver(mMasterHandler) {
+            @Override
+            protected void onReceiveResult(int resultCode, Bundle resultData) {
+                int updatedCacheValue = updateEntitlementCacheValue(type, resultCode);
+                receiver.send(updatedCacheValue, null);
+            }
+        };
+
+        return writeToParcel(rr);
+    }
+
+    private ResultReceiver writeToParcel(final ResultReceiver receiver) {
+        // This is necessary to avoid unmarshalling issues when sending the receiver
+        // across processes.
+        Parcel parcel = Parcel.obtain();
+        receiver.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        ResultReceiver receiverForSending = ResultReceiver.CREATOR.createFromParcel(parcel);
+        parcel.recycle();
+        return receiverForSending;
+    }
+
+    /**
+     * Update the last entitlement value to internal cache
+     *
+     * @param type tethering type from ConnectivityManager.TETHERING_{@code *}
+     * @param resultCode last entitlement value
+     * @return the last updated entitlement value
+     */
+    public int updateEntitlementCacheValue(int type, int resultCode) {
+        if (DBG) {
+            Log.d(TAG, "updateEntitlementCacheValue: " + type + ", result: " + resultCode);
+        }
+        synchronized (mEntitlementCacheValue) {
+            if (resultCode == TETHER_ERROR_NO_ERROR) {
+                mEntitlementCacheValue.put(type, resultCode);
+                return resultCode;
+            } else {
+                mEntitlementCacheValue.put(type, TETHER_ERROR_PROVISION_FAILED);
+                return TETHER_ERROR_PROVISION_FAILED;
+            }
+        }
+    }
+
+    /** Get the last value of the tethering entitlement check. */
+    public void getLatestTetheringEntitlementValue(int downstream, ResultReceiver receiver,
+            boolean showEntitlementUi) {
+        if (!isTetherProvisioningRequired()) {
+            receiver.send(TETHER_ERROR_NO_ERROR, null);
+            return;
+        }
+
+        final int cacheValue;
+        synchronized (mEntitlementCacheValue) {
+            cacheValue = mEntitlementCacheValue.get(
+                downstream, TETHER_ERROR_ENTITLEMENT_UNKONWN);
+        }
+        if (cacheValue == TETHER_ERROR_NO_ERROR || !showEntitlementUi) {
+            receiver.send(cacheValue, null);
+        } else {
+            ResultReceiver proxy = buildProxyReceiver(downstream, receiver);
+            runUiTetherProvisioning(downstream, proxy);
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/connectivity/tethering/TetheringDependencies.java b/services/core/java/com/android/server/connectivity/tethering/TetheringDependencies.java
index a42efe9..6d6f81e 100644
--- a/services/core/java/com/android/server/connectivity/tethering/TetheringDependencies.java
+++ b/services/core/java/com/android/server/connectivity/tethering/TetheringDependencies.java
@@ -81,8 +81,8 @@
     /**
      * Get a reference to the EntitlementManager to be used by tethering.
      */
-    public EntitlementManager getEntitlementManager(Context ctx, SharedLog log,
-            MockableSystemProperties systemProperties) {
-        return new EntitlementManager(ctx, log, systemProperties);
+    public EntitlementManager getEntitlementManager(Context ctx, StateMachine target,
+            SharedLog log, MockableSystemProperties systemProperties) {
+        return new EntitlementManager(ctx, target, log, systemProperties);
     }
 }
diff --git a/services/core/java/com/android/server/display/BrightnessTracker.java b/services/core/java/com/android/server/display/BrightnessTracker.java
index 019d726..727cf0e 100644
--- a/services/core/java/com/android/server/display/BrightnessTracker.java
+++ b/services/core/java/com/android/server/display/BrightnessTracker.java
@@ -27,12 +27,17 @@
 import android.content.IntentFilter;
 import android.content.pm.ParceledListSlice;
 import android.database.ContentObserver;
+import android.graphics.PixelFormat;
 import android.hardware.Sensor;
 import android.hardware.SensorEvent;
 import android.hardware.SensorEventListener;
 import android.hardware.SensorManager;
 import android.hardware.display.AmbientBrightnessDayStats;
 import android.hardware.display.BrightnessChangeEvent;
+import android.hardware.display.DisplayManager;
+import android.hardware.display.DisplayManagerInternal;
+import android.hardware.display.DisplayedContentSample;
+import android.hardware.display.DisplayedContentSamplingAttributes;
 import android.net.Uri;
 import android.os.BatteryManager;
 import android.os.Environment;
@@ -48,6 +53,7 @@
 import android.util.AtomicFile;
 import android.util.Slog;
 import android.util.Xml;
+import android.view.Display;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
@@ -55,6 +61,7 @@
 import com.android.internal.os.BackgroundThread;
 import com.android.internal.util.FastXmlSerializer;
 import com.android.internal.util.RingBuffer;
+import com.android.server.LocalServices;
 
 import libcore.io.IoUtils;
 
@@ -111,6 +118,8 @@
     private static final String ATTR_DEFAULT_CONFIG = "defaultConfig";
     private static final String ATTR_POWER_SAVE = "powerSaveFactor";
     private static final String ATTR_USER_POINT = "userPoint";
+    private static final String ATTR_COLOR_SAMPLE_DURATION = "colorSampleDuration";
+    private static final String ATTR_COLOR_VALUE_BUCKETS = "colorValueBuckets";
 
     private static final int MSG_BACKGROUND_START = 0;
     private static final int MSG_BRIGHTNESS_CHANGED = 1;
@@ -119,6 +128,10 @@
 
     private static final SimpleDateFormat FORMAT = new SimpleDateFormat("MM-dd HH:mm:ss.SSS");
 
+    private static final long COLOR_SAMPLE_DURATION = TimeUnit.SECONDS.toSeconds(10);
+    // Sample chanel 2 of HSV which is the Value component.
+    private static final int COLOR_SAMPLE_COMPONENT_MASK = 0x1 << 2;
+
     // Lock held while accessing mEvents, is held while writing events to flash.
     private final Object mEventsLock = new Object();
     @GuardedBy("mEventsLock")
@@ -136,12 +149,16 @@
     private final ContentResolver mContentResolver;
     private final Handler mBgHandler;
 
-    // mBroadcastReceiver,  mSensorListener, mSettingsObserver and mSensorRegistered
-    // should only be used on the mBgHandler thread.
+    // These members should only be accessed on the mBgHandler thread.
     private BroadcastReceiver mBroadcastReceiver;
     private SensorListener mSensorListener;
     private SettingsObserver mSettingsObserver;
+    private DisplayListener mDisplayListener;
     private boolean mSensorRegistered;
+    private boolean mColorSamplingEnabled;
+    private int mNoFramesToSample;
+    private float mFrameRate;
+    // End of block of members that should only be accessed on the mBgHandler thread.
 
     private @UserIdInt int mCurrentUserId = UserHandle.USER_NULL;
 
@@ -208,6 +225,7 @@
             mLastBrightness = initialBrightness;
             mStarted = true;
         }
+        enableColorSampling();
     }
 
     /** Stop listening for events */
@@ -226,6 +244,7 @@
         synchronized (mDataCollectionLock) {
             mStarted = false;
         }
+        disableColorSampling();
     }
 
     public void onSwitchUser(@UserIdInt int newUserId) {
@@ -367,6 +386,17 @@
         builder.setColorTemperature(mInjector.getColorTemperature(mContext,
                 UserHandle.USER_CURRENT));
 
+        if (mColorSamplingEnabled) {
+            DisplayedContentSample sample = mInjector.sampleColor(mNoFramesToSample);
+            if (sample != null && sample.getSampleComponent(
+                    DisplayedContentSample.ColorComponent.CHANNEL2) != null) {
+                float numMillis = (sample.getNumFrames() / mFrameRate) * 1000.0f;
+                builder.setColorValues(
+                        sample.getSampleComponent(DisplayedContentSample.ColorComponent.CHANNEL2),
+                        Math.round(numMillis));
+            }
+        }
+
         BrightnessChangeEvent event = builder.build();
         if (DEBUG) {
             Slog.d(TAG, "Event " + event.brightness + " " + event.packageName);
@@ -541,6 +571,19 @@
                 }
                 out.attribute(null, ATTR_LUX, luxValues.toString());
                 out.attribute(null, ATTR_LUX_TIMESTAMPS, luxTimestamps.toString());
+                if (toWrite[i].colorValueBuckets != null
+                        && toWrite[i].colorValueBuckets.length > 0) {
+                    out.attribute(null, ATTR_COLOR_SAMPLE_DURATION,
+                            Long.toString(toWrite[i].colorSampleDuration));
+                    StringBuilder buckets = new StringBuilder();
+                    for (int j = 0; j < toWrite[i].colorValueBuckets.length; ++j) {
+                        if (j > 0) {
+                            buckets.append(',');
+                        }
+                        buckets.append(Long.toString(toWrite[i].colorValueBuckets[j]));
+                    }
+                    out.attribute(null, ATTR_COLOR_VALUE_BUCKETS, buckets.toString());
+                }
                 out.endTag(null, TAG_EVENT);
             }
         }
@@ -628,6 +671,20 @@
                         builder.setUserBrightnessPoint(Boolean.parseBoolean(userPoint));
                     }
 
+                    String colorSampleDurationString =
+                            parser.getAttributeValue(null, ATTR_COLOR_SAMPLE_DURATION);
+                    String colorValueBucketsString =
+                            parser.getAttributeValue(null, ATTR_COLOR_VALUE_BUCKETS);
+                    if (colorSampleDurationString != null && colorValueBucketsString != null) {
+                        long colorSampleDuration = Long.parseLong(colorSampleDurationString);
+                        String[] buckets = colorValueBucketsString.split(",");
+                        long[] bucketValues = new long[buckets.length];
+                        for (int i = 0; i < bucketValues.length; ++i) {
+                            bucketValues[i] = Long.parseLong(buckets[i]);
+                        }
+                        builder.setColorValues(bucketValues, colorSampleDuration);
+                    }
+
                     BrightnessChangeEvent event = builder.build();
                     if (DEBUG) {
                         Slog.i(TAG, "Read event " + event.brightness
@@ -695,6 +752,73 @@
 
     private void dumpLocal(PrintWriter pw) {
         pw.println("  mSensorRegistered=" + mSensorRegistered);
+        pw.println("  mColorSamplingEnabled=" + mColorSamplingEnabled);
+        pw.println("  mNoFramesToSample=" + mNoFramesToSample);
+        pw.println("  mFrameRate=" + mFrameRate);
+    }
+
+    private void enableColorSampling() {
+        if (!mInjector.isBrightnessModeAutomatic(mContentResolver)
+                || !mInjector.isInteractive(mContext)
+                || mColorSamplingEnabled) {
+            return;
+        }
+
+        mFrameRate = mInjector.getFrameRate(mContext);
+        if (mFrameRate <= 0) {
+            Slog.wtf(TAG, "Default display has a zero or negative framerate.");
+            return;
+        }
+        mNoFramesToSample = (int) (mFrameRate * COLOR_SAMPLE_DURATION);
+
+        DisplayedContentSamplingAttributes attributes = mInjector.getSamplingAttributes();
+        if (DEBUG && attributes != null) {
+            Slog.d(TAG, "Color sampling"
+                    + " mask=0x" + Integer.toHexString(attributes.getComponentMask())
+                    + " dataSpace=0x" + Integer.toHexString(attributes.getDataspace())
+                    + " pixelFormat=0x" + Integer.toHexString(attributes.getPixelFormat()));
+        }
+        // Do we support sampling the Value component of HSV
+        if (attributes != null && attributes.getPixelFormat() == PixelFormat.HSV_888
+                && (attributes.getComponentMask() & COLOR_SAMPLE_COMPONENT_MASK) != 0) {
+
+            mColorSamplingEnabled = mInjector.enableColorSampling(/* enable= */true,
+                    mNoFramesToSample);
+            if (DEBUG) {
+                Slog.i(TAG, "turning on color sampling for "
+                        + mNoFramesToSample + " frames, success=" + mColorSamplingEnabled);
+            }
+        }
+        if (mColorSamplingEnabled && mDisplayListener == null) {
+            mDisplayListener = new DisplayListener();
+            mInjector.registerDisplayListener(mContext, mDisplayListener, mBgHandler);
+        }
+    }
+
+    private void disableColorSampling() {
+        if (!mColorSamplingEnabled) {
+            return;
+        }
+        mInjector.enableColorSampling(/* enable= */ false, /* noFrames= */ 0);
+        mColorSamplingEnabled = false;
+        if (mDisplayListener != null) {
+            mInjector.unRegisterDisplayListener(mContext, mDisplayListener);
+            mDisplayListener = null;
+        }
+        if (DEBUG) {
+            Slog.i(TAG, "turning off color sampling");
+        }
+    }
+
+    private void updateColorSampling() {
+        if (!mColorSamplingEnabled) {
+            return;
+        }
+        float frameRate = mInjector.getFrameRate(mContext);
+        if (frameRate != mFrameRate) {
+            disableColorSampling();
+            enableColorSampling();
+        }
     }
 
     public ParceledListSlice<AmbientBrightnessDayStats> getAmbientBrightnessStats(int userId) {
@@ -768,6 +892,26 @@
         }
     }
 
+    private final class DisplayListener implements DisplayManager.DisplayListener {
+
+        @Override
+        public void onDisplayAdded(int displayId) {
+            // Ignore
+        }
+
+        @Override
+        public void onDisplayRemoved(int displayId) {
+            // Ignore
+        }
+
+        @Override
+        public void onDisplayChanged(int displayId) {
+            if (displayId == Display.DEFAULT_DISPLAY) {
+                updateColorSampling();
+            }
+        }
+    }
+
     private final class SettingsObserver extends ContentObserver {
         public SettingsObserver(Handler handler) {
             super(handler);
@@ -828,9 +972,11 @@
                     break;
                 case MSG_START_SENSOR_LISTENER:
                     startSensorListener();
+                    enableColorSampling();
                     break;
                 case MSG_STOP_SENSOR_LISTENER:
                     stopSensorListener();
+                    disableColorSampling();
                     break;
             }
         }
@@ -957,5 +1103,44 @@
         public boolean isNightModeActive(Context context, int userId) {
             return new ColorDisplayController(context, userId).isActivated();
         }
+
+        public DisplayedContentSample sampleColor(int noFramesToSample) {
+            final DisplayManagerInternal displayManagerInternal =
+                    LocalServices.getService(DisplayManagerInternal.class);
+            return displayManagerInternal.getDisplayedContentSample(
+                   Display.DEFAULT_DISPLAY, noFramesToSample, 0);
+        }
+
+        public float getFrameRate(Context context) {
+            final DisplayManager displayManager = context.getSystemService(DisplayManager.class);
+            Display display = displayManager.getDisplay(Display.DEFAULT_DISPLAY);
+            return display.getRefreshRate();
+        }
+
+        public DisplayedContentSamplingAttributes getSamplingAttributes() {
+            final DisplayManagerInternal displayManagerInternal =
+                    LocalServices.getService(DisplayManagerInternal.class);
+            return displayManagerInternal.getDisplayedContentSamplingAttributes(
+                    Display.DEFAULT_DISPLAY);
+        }
+
+        public boolean enableColorSampling(boolean enable, int noFrames) {
+            final DisplayManagerInternal displayManagerInternal =
+                    LocalServices.getService(DisplayManagerInternal.class);
+            return displayManagerInternal.setDisplayedContentSamplingEnabled(
+                    Display.DEFAULT_DISPLAY, enable, COLOR_SAMPLE_COMPONENT_MASK, noFrames);
+        }
+
+        public void registerDisplayListener(Context context,
+                DisplayManager.DisplayListener listener, Handler handler) {
+            final DisplayManager displayManager = context.getSystemService(DisplayManager.class);
+            displayManager.registerDisplayListener(listener, handler);
+        }
+
+        public void unRegisterDisplayListener(Context context,
+                DisplayManager.DisplayListener listener) {
+            final DisplayManager displayManager = context.getSystemService(DisplayManager.class);
+            displayManager.unregisterDisplayListener(listener);
+        }
     }
 }
diff --git a/services/core/java/com/android/server/display/ColorDisplayService.java b/services/core/java/com/android/server/display/ColorDisplayService.java
index eb0ed0a..591ce8d 100644
--- a/services/core/java/com/android/server/display/ColorDisplayService.java
+++ b/services/core/java/com/android/server/display/ColorDisplayService.java
@@ -55,6 +55,7 @@
 import android.opengl.Matrix;
 import android.os.Binder;
 import android.os.Handler;
+import android.os.IBinder;
 import android.os.Looper;
 import android.os.Message;
 import android.os.SystemProperties;
@@ -66,6 +67,9 @@
 import android.view.SurfaceControl;
 import android.view.accessibility.AccessibilityManager;
 import android.view.animation.AnimationUtils;
+import android.view.SurfaceControl;
+import android.view.SurfaceControl.DisplayPrimaries;
+
 import com.android.internal.R;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.app.ColorDisplayController;
@@ -145,43 +149,20 @@
         @Override
         public void setUp(Context context, boolean needsLinear) {
             mSetUp = false;
+            final Resources res = context.getResources();
 
-            final Resources res = getContext().getResources();
-            final String[] displayPrimariesValues = res.getStringArray(
-                    R.array.config_displayWhiteBalanceDisplayPrimaries);
+            ColorSpace.Rgb displayColorSpaceRGB = getDisplayColorSpaceFromSurfaceControl();
+            if (displayColorSpaceRGB == null) {
+                Slog.w(TAG, "Failed to get display color space from SurfaceControl, trying res");
+                displayColorSpaceRGB = getDisplayColorSpaceFromResources(res);
+                if (displayColorSpaceRGB == null) {
+                    Slog.e(TAG, "Failed to get display color space from resources");
+                    return;
+                }
+            }
+
             final String[] nominalWhiteValues = res.getStringArray(
                     R.array.config_displayWhiteBalanceDisplayNominalWhite);
-
-            if (displayPrimariesValues.length != NUM_DISPLAY_PRIMARIES_VALS) {
-                Slog.e(TAG, "Unexpected display white balance primaries resource length " +
-                        displayPrimariesValues.length);
-                return;
-            }
-
-            if (nominalWhiteValues.length != NUM_VALUES_PER_PRIMARY) {
-                Slog.e(TAG, "Unexpected display white balance nominal white resource length " +
-                        nominalWhiteValues.length);
-                return;
-            }
-
-            float[] displayRedGreenBlueXYZ =
-                    new float[NUM_DISPLAY_PRIMARIES_VALS - NUM_VALUES_PER_PRIMARY];
-            float[] displayWhiteXYZ = new float[NUM_VALUES_PER_PRIMARY];
-            for (int i = 0; i < displayRedGreenBlueXYZ.length; i++) {
-                displayRedGreenBlueXYZ[i] = Float.parseFloat(displayPrimariesValues[i]);
-            }
-            for (int i = 0; i < displayWhiteXYZ.length; i++) {
-                displayWhiteXYZ[i] = Float.parseFloat(
-                        displayPrimariesValues[displayRedGreenBlueXYZ.length + i]);
-            }
-
-            final ColorSpace.Rgb displayColorSpaceRGB = new ColorSpace.Rgb(
-                    "Display Color Space",
-                    displayRedGreenBlueXYZ,
-                    displayWhiteXYZ,
-                    2.2f // gamma, unused for display white balance
-            );
-
             float[] displayNominalWhiteXYZ = new float[NUM_VALUES_PER_PRIMARY];
             for (int i = 0; i < nominalWhiteValues.length; i++) {
                 displayNominalWhiteXYZ[i] = Float.parseFloat(nominalWhiteValues[i]);
@@ -190,14 +171,14 @@
             final int colorTemperatureMin = res.getInteger(
                     R.integer.config_displayWhiteBalanceColorTemperatureMin);
             if (colorTemperatureMin <= 0) {
-                Slog.e(TAG, "display white balance minimum temperature must be greater than 0");
+                Slog.e(TAG, "Display white balance minimum temperature must be greater than 0");
                 return;
             }
 
             final int colorTemperatureMax = res.getInteger(
                     R.integer.config_displayWhiteBalanceColorTemperatureMax);
             if (colorTemperatureMax < colorTemperatureMin) {
-                Slog.e(TAG, "display white balance max temp must be greater or equal to min");
+                Slog.e(TAG, "Display white balance max temp must be greater or equal to min");
                 return;
             }
 
@@ -323,6 +304,57 @@
                         matrixToString(mMatrixDisplayWhiteBalance, 4));
             }
         }
+
+        private ColorSpace.Rgb makeRgbColorSpaceFromXYZ(float[] redGreenBlueXYZ, float[] whiteXYZ) {
+            return new ColorSpace.Rgb(
+                "Display Color Space",
+                redGreenBlueXYZ,
+                whiteXYZ,
+                2.2f // gamma, unused for display white balance
+            );
+        }
+
+        private ColorSpace.Rgb getDisplayColorSpaceFromSurfaceControl() {
+            IBinder displayToken = SurfaceControl.getBuiltInDisplay(
+                    SurfaceControl.BUILT_IN_DISPLAY_ID_MAIN);
+            if (displayToken == null) {
+                return null;
+            }
+
+            DisplayPrimaries primaries = SurfaceControl.getDisplayNativePrimaries(displayToken);
+            if (primaries == null || primaries.red == null || primaries.green == null ||
+                primaries.blue == null || primaries.white == null) {
+                return null;
+            }
+
+            return makeRgbColorSpaceFromXYZ(
+                    new float[] {
+                        primaries.red.X, primaries.red.Y, primaries.red.Z,
+                        primaries.green.X, primaries.green.Y, primaries.green.Z,
+                        primaries.blue.X, primaries.blue.Y, primaries.blue.Z,
+                    },
+                    new float[] { primaries.white.X, primaries.white.Y, primaries.white.Z }
+                    );
+        }
+
+        private ColorSpace.Rgb getDisplayColorSpaceFromResources(Resources res) {
+            final String[] displayPrimariesValues = res.getStringArray(
+                    R.array.config_displayWhiteBalanceDisplayPrimaries);
+            float[] displayRedGreenBlueXYZ =
+                    new float[NUM_DISPLAY_PRIMARIES_VALS - NUM_VALUES_PER_PRIMARY];
+            float[] displayWhiteXYZ = new float[NUM_VALUES_PER_PRIMARY];
+
+            for (int i = 0; i < displayRedGreenBlueXYZ.length; i++) {
+                displayRedGreenBlueXYZ[i] = Float.parseFloat(displayPrimariesValues[i]);
+            }
+
+            for (int i = 0; i < displayWhiteXYZ.length; i++) {
+                displayWhiteXYZ[i] = Float.parseFloat(
+                        displayPrimariesValues[displayRedGreenBlueXYZ.length + i]);
+            }
+
+            return makeRgbColorSpaceFromXYZ(displayRedGreenBlueXYZ, displayWhiteXYZ);
+        }
     };
 
     private final TintController mGlobalSaturationTintController = new TintController() {
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index b89768a..80ea1da 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -1241,27 +1241,59 @@
         }
     }
 
+    @Nullable
+    private IBinder getDisplayToken(int displayId) {
+        synchronized (mSyncRoot) {
+            final LogicalDisplay display = mLogicalDisplays.get(displayId);
+            if (display != null) {
+                final DisplayDevice device = display.getPrimaryDisplayDeviceLocked();
+                if (device != null) {
+                    return device.getDisplayTokenLocked();
+                }
+            }
+        }
+
+        return null;
+    }
+
+    private boolean screenshotInternal(int displayId, Surface outSurface) {
+        final IBinder token = getDisplayToken(displayId);
+        if (token == null) {
+            return false;
+        }
+        SurfaceControl.screenshot(token, outSurface);
+        return true;
+    }
+
     @VisibleForTesting
     DisplayedContentSamplingAttributes getDisplayedContentSamplingAttributesInternal(
             int displayId) {
-        IBinder displayToken = SurfaceControl.getBuiltInDisplay(displayId);
-        return SurfaceControl.getDisplayedContentSamplingAttributes(displayToken);
+        final IBinder token = getDisplayToken(displayId);
+        if (token == null) {
+            return null;
+        }
+        return SurfaceControl.getDisplayedContentSamplingAttributes(token);
     }
 
     @VisibleForTesting
     boolean setDisplayedContentSamplingEnabledInternal(
             int displayId, boolean enable, int componentMask, int maxFrames) {
-        IBinder displayToken = SurfaceControl.getBuiltInDisplay(displayId);
+        final IBinder token = getDisplayToken(displayId);
+        if (token == null) {
+            return false;
+        }
         return SurfaceControl.setDisplayedContentSamplingEnabled(
-                displayToken, enable, componentMask, maxFrames);
+                token, enable, componentMask, maxFrames);
     }
 
     @VisibleForTesting
     DisplayedContentSample getDisplayedContentSampleInternal(int displayId,
             long maxFrames, long timestamp) {
-        IBinder displayToken = SurfaceControl.getBuiltInDisplay(displayId);
-        return SurfaceControl.getDisplayedContentSample(
-            displayToken, maxFrames, timestamp);
+        final IBinder token = getDisplayToken(displayId);
+        if (token == null) {
+            return null;
+        }
+        return SurfaceControl.getDisplayedContentSample(token, maxFrames, timestamp);
     }
 
     private void clearViewportsLocked() {
@@ -2164,6 +2196,22 @@
             }
         }
 
+        void setDisplayWhiteBalanceLoggingEnabled(boolean enabled) {
+            if (mDisplayPowerController != null) {
+                synchronized (mSyncRoot) {
+                    mDisplayPowerController.setDisplayWhiteBalanceLoggingEnabled(enabled);
+                }
+            }
+        }
+
+        void setAmbientColorTemperatureOverride(float cct) {
+            if (mDisplayPowerController != null) {
+                synchronized (mSyncRoot) {
+                    mDisplayPowerController.setAmbientColorTemperatureOverride(cct);
+                }
+            }
+        }
+
         private boolean validatePackageName(int uid, String packageName) {
             if (packageName != null) {
                 String[] packageNames = mContext.getPackageManager().getPackagesForUid(uid);
@@ -2257,20 +2305,7 @@
 
         @Override
         public boolean screenshot(int displayId, Surface outSurface) {
-            synchronized (mSyncRoot) {
-                final LogicalDisplay display = mLogicalDisplays.get(displayId);
-                if (display != null) {
-                    final DisplayDevice device = display.getPrimaryDisplayDeviceLocked();
-                    if (device != null) {
-                        final IBinder token = device.getDisplayTokenLocked();
-                        if (token != null) {
-                            SurfaceControl.screenshot(token, outSurface);
-                            return true;
-                        }
-                    }
-                }
-            }
-            return false;
+            return screenshotInternal(displayId, outSurface);
         }
 
         @Override
diff --git a/services/core/java/com/android/server/display/DisplayManagerShellCommand.java b/services/core/java/com/android/server/display/DisplayManagerShellCommand.java
index abbfc7b..04d28ea 100644
--- a/services/core/java/com/android/server/display/DisplayManagerShellCommand.java
+++ b/services/core/java/com/android/server/display/DisplayManagerShellCommand.java
@@ -45,6 +45,12 @@
                 return setAutoBrightnessLoggingEnabled(true);
             case "ab-logging-disable":
                 return setAutoBrightnessLoggingEnabled(false);
+            case "dwb-logging-enable":
+                return setDisplayWhiteBalanceLoggingEnabled(true);
+            case "dwb-logging-disable":
+                return setDisplayWhiteBalanceLoggingEnabled(false);
+            case "dwb-set-cct":
+                return setAmbientColorTemperatureOverride();
             default:
                 return handleDefaultCommands(cmd);
         }
@@ -65,6 +71,12 @@
         pw.println("    Enable auto-brightness logging.");
         pw.println("  ab-logging-disable");
         pw.println("    Disable auto-brightness logging.");
+        pw.println("  dwb-logging-enable");
+        pw.println("    Enable display white-balance logging.");
+        pw.println("  dwb-logging-disable");
+        pw.println("    Disable display white-balance logging.");
+        pw.println("  dwb-set-cct CCT");
+        pw.println("    Sets the ambient color temperature override to CCT (use -1 to disable).");
         pw.println();
         Intent.printIntentArgsHelp(pw , "");
     }
@@ -75,7 +87,7 @@
             getErrPrintWriter().println("Error: no brightness specified");
             return 1;
         }
-        float brightness = -1;
+        float brightness = -1.0f;
         try {
             brightness = Float.parseFloat(brightnessText);
         } catch (NumberFormatException e) {
@@ -84,7 +96,7 @@
             getErrPrintWriter().println("Error: brightness should be a number between 0 and 1");
             return 1;
         }
-        mService.setBrightness((int) brightness * 255);
+        mService.setBrightness((int) (brightness * 255));
         return 0;
     }
 
@@ -97,4 +109,26 @@
         mService.setAutoBrightnessLoggingEnabled(enabled);
         return 0;
     }
+
+    private int setDisplayWhiteBalanceLoggingEnabled(boolean enabled) {
+        mService.setDisplayWhiteBalanceLoggingEnabled(enabled);
+        return 0;
+    }
+
+    private int setAmbientColorTemperatureOverride() {
+        String cctText = getNextArg();
+        if (cctText == null) {
+            getErrPrintWriter().println("Error: no cct specified");
+            return 1;
+        }
+        float cct;
+        try {
+            cct = Float.parseFloat(cctText);
+        } catch (NumberFormatException e) {
+            getErrPrintWriter().println("Error: cct should be a number");
+            return 1;
+        }
+        mService.setAmbientColorTemperatureOverride(cct);
+        return 0;
+    }
 }
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index db3928e..dc5be6a 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -52,6 +52,9 @@
 import com.android.internal.app.IBatteryStats;
 import com.android.server.LocalServices;
 import com.android.server.am.BatteryStatsService;
+import com.android.server.display.whitebalance.DisplayWhiteBalanceController;
+import com.android.server.display.whitebalance.DisplayWhiteBalanceFactory;
+import com.android.server.display.whitebalance.DisplayWhiteBalanceSettings;
 import com.android.server.policy.WindowManagerPolicy;
 
 import java.io.PrintWriter;
@@ -78,7 +81,8 @@
  * For debugging, you can make the color fade and brightness animations run
  * slower by changing the "animator duration scale" option in Development Settings.
  */
-final class DisplayPowerController implements AutomaticBrightnessController.Callbacks {
+final class DisplayPowerController implements AutomaticBrightnessController.Callbacks,
+        DisplayWhiteBalanceController.Callbacks {
     private static final String TAG = "DisplayPowerController";
     private static final String SCREEN_ON_BLOCKED_TRACE_NAME = "Screen on blocked";
     private static final String SCREEN_OFF_BLOCKED_TRACE_NAME = "Screen off blocked";
@@ -307,6 +311,12 @@
     // Whether or not to skip the initial brightness ramps into STATE_ON.
     private final boolean mSkipScreenOnBrightnessRamp;
 
+    // Display white balance components.
+    @Nullable
+    private final DisplayWhiteBalanceSettings mDisplayWhiteBalanceSettings;
+    @Nullable
+    private final DisplayWhiteBalanceController mDisplayWhiteBalanceController;
+
     // A record of state for skipping brightness ramps.
     private int mSkipRampState = RAMP_STATE_SKIP_NONE;
 
@@ -504,6 +514,20 @@
         mPendingScreenBrightnessSetting = -1;
         mTemporaryAutoBrightnessAdjustment = Float.NaN;
         mPendingAutoBrightnessAdjustment = Float.NaN;
+
+        DisplayWhiteBalanceSettings displayWhiteBalanceSettings = null;
+        DisplayWhiteBalanceController displayWhiteBalanceController = null;
+        try {
+            displayWhiteBalanceSettings = new DisplayWhiteBalanceSettings(mContext, mHandler);
+            displayWhiteBalanceController = DisplayWhiteBalanceFactory.create(mHandler,
+                    mSensorManager, resources);
+            displayWhiteBalanceSettings.setCallbacks(this);
+            displayWhiteBalanceController.setCallbacks(this);
+        } catch (Exception e) {
+            Slog.e(TAG, "failed to set up display white-balance: " + e);
+        }
+        mDisplayWhiteBalanceSettings = displayWhiteBalanceSettings;
+        mDisplayWhiteBalanceController = displayWhiteBalanceController;
     }
 
     /**
@@ -526,6 +550,9 @@
     public void onSwitchUser(@UserIdInt int newUserId) {
         handleSettingsChange(true /* userSwitch */);
         mBrightnessTracker.onSwitchUser(newUserId);
+        if (mDisplayWhiteBalanceSettings != null) {
+            mDisplayWhiteBalanceSettings.onSwitchUser();
+        }
     }
 
     public ParceledListSlice<AmbientBrightnessDayStats> getAmbientBrightnessStats(
@@ -592,6 +619,9 @@
     }
 
     public BrightnessConfiguration getDefaultBrightnessConfiguration() {
+        if (mAutomaticBrightnessController == null) {
+            return null;
+        }
         return mAutomaticBrightnessController.getDefaultConfig();
     }
 
@@ -985,6 +1015,16 @@
 
         }
 
+        // Update display white-balance.
+        if (mDisplayWhiteBalanceController != null) {
+            if (state == Display.STATE_ON && mDisplayWhiteBalanceSettings.isEnabled()) {
+                mDisplayWhiteBalanceController.setEnabled(true);
+                mDisplayWhiteBalanceController.updateScreenColorTemperature();
+            } else {
+                mDisplayWhiteBalanceController.setEnabled(false);
+            }
+        }
+
         // Determine whether the display is ready for use in the newly requested state.
         // Note that we do not wait for the brightness ramp animation to complete before
         // reporting the display is ready because we only need to ensure the screen is in the
@@ -1699,6 +1739,12 @@
             pw.println();
             mBrightnessTracker.dump(pw);
         }
+
+        pw.println();
+        if (mDisplayWhiteBalanceController != null) {
+            mDisplayWhiteBalanceController.dump(pw);
+            mDisplayWhiteBalanceSettings.dump(pw);
+        }
     }
 
     private static String proximityToString(int state) {
@@ -1845,4 +1891,26 @@
             mAutomaticBrightnessController.setLoggingEnabled(enabled);
         }
     }
+
+    @Override // DisplayWhiteBalanceController.Callbacks
+    public void updateWhiteBalance() {
+        sendUpdatePowerState();
+    }
+
+    void setDisplayWhiteBalanceLoggingEnabled(boolean enabled) {
+        if (mDisplayWhiteBalanceController != null) {
+            mDisplayWhiteBalanceController.setLoggingEnabled(enabled);
+            mDisplayWhiteBalanceSettings.setLoggingEnabled(enabled);
+        }
+    }
+
+    void setAmbientColorTemperatureOverride(float cct) {
+        if (mDisplayWhiteBalanceController != null) {
+            mDisplayWhiteBalanceController.setAmbientColorTemperatureOverride(cct);
+            // The ambient color temperature override is only applied when the ambient color
+            // temperature changes or is updated, so it doesn't necessarily change the screen color
+            // temperature immediately. So, let's make it!
+            sendUpdatePowerState();
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/display/LogicalDisplay.java b/services/core/java/com/android/server/display/LogicalDisplay.java
index 9566598..7414e55 100644
--- a/services/core/java/com/android/server/display/LogicalDisplay.java
+++ b/services/core/java/com/android/server/display/LogicalDisplay.java
@@ -418,10 +418,15 @@
         // Now add back the offset for the masked area.
         mTempDisplayRect.offset(maskingInsets.left, maskingInsets.top);
 
-        mTempDisplayRect.left += mDisplayOffsetX;
-        mTempDisplayRect.right += mDisplayOffsetX;
-        mTempDisplayRect.top += mDisplayOffsetY;
-        mTempDisplayRect.bottom += mDisplayOffsetY;
+        if (orientation == Surface.ROTATION_0) {
+            mTempDisplayRect.offset(mDisplayOffsetX, mDisplayOffsetY);
+        } else if (orientation == Surface.ROTATION_90) {
+            mTempDisplayRect.offset(mDisplayOffsetY, -mDisplayOffsetX);
+        } else if (orientation == Surface.ROTATION_180) {
+            mTempDisplayRect.offset(-mDisplayOffsetX, -mDisplayOffsetY);
+        } else {  // Surface.ROTATION_270
+            mTempDisplayRect.offset(-mDisplayOffsetY, mDisplayOffsetX);
+        }
         device.setProjectionLocked(t, orientation, mTempLayerStackRect, mTempDisplayRect);
     }
 
diff --git a/services/core/java/com/android/server/display/utils/History.java b/services/core/java/com/android/server/display/utils/History.java
new file mode 100644
index 0000000..ed171b8
--- /dev/null
+++ b/services/core/java/com/android/server/display/utils/History.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.display.utils;
+
+import java.time.Clock;
+
+/**
+ * A fixed-size buffer that keeps the most recent values and their times.
+ *
+ * This class is used for logging and debugging purposes only, so there's no way to retrieve the
+ * history other than toString(), and a non-monotonic clock is good enough.
+ */
+public class History {
+
+    private int mSize;
+    private int mCount;
+    private int mStart;
+    private int mEnd;
+
+    private long[] mTimes;
+    private float[] mValues;
+
+    private Clock mClock;
+
+    /**
+     * @param size
+     *      The maximum number of values kept.
+     */
+    public History(int size) {
+        this(size, Clock.systemUTC());
+    }
+
+    /**
+     * @param size
+     *    The maximum number of values kept.
+     * @param clock
+     *    The clock used.
+     */
+    public History(int size, Clock clock) {
+        mSize = size;
+        mCount = 0;
+        mStart = 0;
+        mEnd = 0;
+        mTimes = new long[size];
+        mValues = new float[size];
+        mClock = clock;
+    }
+
+    /**
+     * Add a value.
+     *
+     * @param value
+     *      The value.
+     */
+    public void add(float value) {
+        mTimes[mEnd] = mClock.millis();
+        mValues[mEnd] = value;
+        if (mCount < mSize) {
+            mCount++;
+        } else {
+            mStart = (mStart + 1) % mSize;
+        }
+        mEnd = (mEnd + 1) % mSize;
+    }
+
+    /**
+     * Convert the buffer to string.
+     *
+     * @return The buffer as string.
+     */
+    public String toString() {
+        StringBuffer sb = new StringBuffer();
+        sb.append("[");
+        for (int i = 0; i < mCount; i++) {
+            final int index = (mStart + i) % mSize;
+            final long time = mTimes[index];
+            final float value = mValues[index];
+            sb.append(value + " @ " + time);
+            if (i + 1 != mCount) {
+                sb.append(", ");
+            }
+        }
+        sb.append("]");
+        return sb.toString();
+    }
+
+}
diff --git a/services/core/java/com/android/server/display/utils/RollingBuffer.java b/services/core/java/com/android/server/display/utils/RollingBuffer.java
new file mode 100644
index 0000000..dd5b7ab
--- /dev/null
+++ b/services/core/java/com/android/server/display/utils/RollingBuffer.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.display.utils;
+
+/**
+ * A buffer that supports adding new values and truncating old ones.
+ */
+public class RollingBuffer {
+
+    private static final int INITIAL_SIZE = 50;
+
+    private int mSize;
+    private int mCount;
+    private int mStart;
+    private int mEnd;
+
+    private long[] mTimes; // Milliseconds
+    private float[] mValues;
+
+    public RollingBuffer() {
+        mSize = INITIAL_SIZE;
+        mTimes = new long[INITIAL_SIZE];
+        mValues = new float[INITIAL_SIZE];
+        clear();
+    }
+
+    /**
+     * Add a value at a given time.
+     *
+     * @param time
+     *      The time (in milliseconds).
+     * @param value
+     *      The value.
+     */
+    public void add(long time, float value) {
+        if (mCount >= mSize) {
+            expandBuffer();
+        }
+        mTimes[mEnd] = time;
+        mValues[mEnd] = value;
+        mEnd = (mEnd + 1) % mSize;
+        mCount++;
+    }
+
+    /**
+     * Get the size of the buffer.
+     *
+     * @return The size of the buffer.
+     */
+    public int size() {
+        return mCount;
+    }
+
+    /**
+     * Return whether the buffer is empty or not.
+     *
+     * @return Whether the buffer is empty or not.
+     */
+    public boolean isEmpty() {
+        return size() == 0;
+    }
+
+    /**
+     * Get a time.
+     *
+     * @param index
+     *      The index of the time.
+     *
+     * @return The time.
+     */
+    public long getTime(int index) {
+        return mTimes[offsetOf(index)];
+    }
+
+    /**
+     * Get a value.
+     *
+     * @param index
+     *      The index of the value.
+     *
+     * @return The value.
+     */
+    public float getValue(int index) {
+        return mValues[offsetOf(index)];
+    }
+
+    /**
+     * Truncate old values.
+     *
+     * @param minTime
+     *      The minimum time (all values older than this time are truncated).
+     */
+    public void truncate(long minTime) {
+        if (isEmpty() || getTime(0) >= minTime) {
+            return;
+        }
+        final int index = getLatestIndexBefore(minTime);
+        mStart = offsetOf(index);
+        mCount -= index;
+        // Remove everything that happened before mTimes[index], but set the index-th value time to
+        // minTime rather than dropping it, as that would've been the value between the minTime and
+        // mTimes[index+1].
+        //
+        // -*---*---|---*---*- => xxxxxxxxx|*--*---*- rather than xxxxxxxxx|???*---*-
+        //      ^       ^                   ^  ^                               ^
+        //      i      i+1                  i i+1                             i+1
+        mTimes[mStart] = minTime;
+    }
+
+    /**
+     * Clears the buffer.
+     */
+    public void clear() {
+        mCount = 0;
+        mStart = 0;
+        mEnd = 0;
+    }
+
+    /**
+     * Convert the buffer to string.
+     *
+     * @return The buffer as string.
+     */
+    public String toString() {
+        StringBuffer sb = new StringBuffer();
+        sb.append("[");
+        for (int i = 0; i < mCount; i++) {
+            final int index = offsetOf(i);
+            sb.append(mValues[index] + " @ " + mTimes[index]);
+            if (i + 1 != mCount) {
+                sb.append(", ");
+            }
+        }
+        sb.append("]");
+        return sb.toString();
+    }
+
+    private int offsetOf(int index) {
+        if (index < 0 || index >= mCount) {
+            throw new ArrayIndexOutOfBoundsException("invalid index: " + index + ", mCount= "
+                    + mCount);
+        }
+        return (mStart + index) % mSize;
+    }
+
+    private void expandBuffer() {
+        final int size = mSize * 2;
+        long[] times = new long[size];
+        float[] values = new float[size];
+        System.arraycopy(mTimes, mStart, times, 0, mCount - mStart);
+        System.arraycopy(mTimes, 0, times, mCount - mStart, mStart);
+        System.arraycopy(mValues, mStart, values, 0, mCount - mStart);
+        System.arraycopy(mValues, 0, values, mCount - mStart, mStart);
+        mSize = size;
+        mStart = 0;
+        mEnd = mCount;
+        mTimes = times;
+        mValues = values;
+    }
+
+    private int getLatestIndexBefore(long time) {
+        for (int i = 1; i < mCount; i++) {
+            if (mTimes[offsetOf(i)] > time) {
+                return i - 1;
+            }
+        }
+        return mCount - 1;
+    }
+
+}
diff --git a/services/core/java/com/android/server/display/whitebalance/AmbientFilter.java b/services/core/java/com/android/server/display/whitebalance/AmbientFilter.java
new file mode 100644
index 0000000..532bbed
--- /dev/null
+++ b/services/core/java/com/android/server/display/whitebalance/AmbientFilter.java
@@ -0,0 +1,256 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.display.whitebalance;
+
+import android.util.Slog;
+
+import com.android.server.display.utils.RollingBuffer;
+
+import java.io.PrintWriter;
+import java.util.Arrays;
+
+/**
+ * The DisplayWhiteBalanceController uses the AmbientFilter to average ambient changes over time,
+ * filter out the noise, and arrive at an estimate of the actual value.
+ *
+ * When the DisplayWhiteBalanceController detects a change in ambient brightness or color
+ * temperature, it passes it to the AmbientFilter, and when it needs the actual ambient value, it
+ * asks it for an estimate.
+ *
+ * Implementations:
+ * - {@link WeightedMovingAverageAmbientFilter}
+ *   A weighted average prioritising recent changes.
+ */
+abstract class AmbientFilter {
+
+    protected static final boolean DEBUG = false; // Enable for verbose logs.
+
+    protected final String mTag;
+    protected boolean mLoggingEnabled;
+
+    // How long ambient value changes are kept and taken into consideration.
+    private final int mHorizon; // Milliseconds
+
+    private final RollingBuffer mBuffer;
+
+    /**
+     * @param tag
+     *      The tag used for dumping and logging.
+     * @param horizon
+     *      How long ambient value changes are kept and taken into consideration.
+     *
+     * @throws IllegalArgumentException
+     *      - horizon is not positive.
+     */
+    AmbientFilter(String tag, int horizon) {
+        validateArguments(horizon);
+        mTag = tag;
+        mLoggingEnabled = false;
+        mHorizon = horizon;
+        mBuffer = new RollingBuffer();
+    }
+
+    /**
+     * Add an ambient value change.
+     *
+     * @param time
+     *      The time.
+     * @param value
+     *      The ambient value.
+     *
+     * @return Whether the method succeeded or not.
+     */
+    public boolean addValue(long time, float value) {
+        if (value < 0.0f) {
+            return false;
+        }
+        truncateOldValues(time);
+        if (mLoggingEnabled) {
+            Slog.d(mTag, "add value: " + value + " @ " + time);
+        }
+        mBuffer.add(time, value);
+        return true;
+    }
+
+    /**
+     * Get an estimate of the actual ambient color temperature.
+     *
+     * @param time
+     *      The time.
+     *
+     * @return An estimate of the actual ambient color temperature.
+     */
+    public float getEstimate(long time) {
+        truncateOldValues(time);
+        final float value = filter(time, mBuffer);
+        if (mLoggingEnabled) {
+            Slog.d(mTag, "get estimate: " + value + " @ " + time);
+        }
+        return value;
+    }
+
+    /**
+     * Clears the filter state.
+     */
+    public void clear() {
+        mBuffer.clear();
+    }
+
+    /**
+     * Enable/disable logging.
+     *
+     * @param loggingEnabled
+     *      Whether logging is on/off.
+     *
+     * @return Whether the method succeeded or not.
+     */
+    public boolean setLoggingEnabled(boolean loggingEnabled) {
+        if (mLoggingEnabled == loggingEnabled) {
+            return false;
+        }
+        mLoggingEnabled = loggingEnabled;
+        return true;
+    }
+
+    /**
+     * Dump the state.
+     *
+     * @param writer
+     *      The PrintWriter used to dump the state.
+     */
+    public void dump(PrintWriter writer) {
+        writer.println("  " + mTag);
+        writer.println("    mLoggingEnabled=" + mLoggingEnabled);
+        writer.println("    mHorizon=" + mHorizon);
+        writer.println("    mBuffer=" + mBuffer);
+    }
+
+    private void validateArguments(int horizon) {
+        if (horizon <= 0) {
+            throw new IllegalArgumentException("horizon must be positive");
+        }
+    }
+
+    private void truncateOldValues(long time) {
+        final long minTime = time - mHorizon;
+        mBuffer.truncate(minTime);
+    }
+
+    protected abstract float filter(long time, RollingBuffer buffer);
+
+    /**
+     * A weighted average prioritising recent changes.
+     */
+    static class WeightedMovingAverageAmbientFilter extends AmbientFilter {
+
+        // How long the latest ambient value change is predicted to last.
+        private static final int PREDICTION_TIME = 100; // Milliseconds
+
+        // Recent changes are prioritised by integrating their duration over y = x + mIntercept
+        // (the higher it is, the less prioritised recent changes are).
+        private final float mIntercept;
+
+        /**
+         * @param tag
+         *      The tag used for dumping and logging.
+         * @param horizon
+         *      How long ambient value changes are kept and taken into consideration.
+         * @param intercept
+         *      Recent changes are prioritised by integrating their duration over y = x + intercept
+         *      (the higher it is, the less prioritised recent changes are).
+         *
+         * @throws IllegalArgumentException
+         *      - horizon is not positive.
+         *      - intercept is NaN or negative.
+         */
+        WeightedMovingAverageAmbientFilter(String tag, int horizon, float intercept) {
+            super(tag, horizon);
+            validateArguments(intercept);
+            mIntercept = intercept;
+        }
+
+        /**
+         * See {@link AmbientFilter#dump base class}.
+         */
+        @Override
+        public void dump(PrintWriter writer) {
+            super.dump(writer);
+            writer.println("    mIntercept=" + mIntercept);
+        }
+
+        // Normalise the times to [t1=0, t2, ..., tN, now + PREDICTION_TIME], so the first change
+        // starts at 0 and the last change is predicted to last a bit, and divide them by 1000 as
+        // milliseconds are high enough to overflow.
+        // The weight of the value from t[i] to t[i+1] is the area under (A.K.A. the integral of)
+        // y = x + mIntercept from t[i] to t[i+1].
+        @Override
+        protected float filter(long time, RollingBuffer buffer) {
+            if (buffer.isEmpty()) {
+                return -1.0f;
+            }
+            float total = 0.0f;
+            float totalWeight = 0.0f;
+            final float[] weights = getWeights(time, buffer);
+            if (DEBUG && mLoggingEnabled) {
+                Slog.v(mTag, "filter: " + buffer + " => " + Arrays.toString(weights));
+            }
+            for (int i = 0; i < weights.length; i++) {
+                final float value = buffer.getValue(i);
+                final float weight = weights[i];
+                total += weight * value;
+                totalWeight += weight;
+            }
+            if (totalWeight == 0.0f) {
+                return buffer.getValue(buffer.size() - 1);
+            }
+            return total / totalWeight;
+        }
+
+        private void validateArguments(float intercept) {
+            if (Float.isNaN(intercept) || intercept < 0.0f) {
+                throw new IllegalArgumentException("intercept must be a non-negative number");
+            }
+        }
+
+        private float[] getWeights(long time, RollingBuffer buffer) {
+            float[] weights = new float[buffer.size()];
+            final long startTime = buffer.getTime(0);
+            float previousTime = 0.0f;
+            for (int i = 1; i < weights.length; i++) {
+                final float currentTime = (buffer.getTime(i) - startTime) / 1000.0f;
+                final float weight = calculateIntegral(previousTime, currentTime);
+                weights[i - 1] = weight;
+                previousTime = currentTime;
+            }
+            final float lastTime = (time + PREDICTION_TIME - startTime) / 1000.0f;
+            final float lastWeight = calculateIntegral(previousTime, lastTime);
+            weights[weights.length - 1] = lastWeight;
+            return weights;
+        }
+
+        private float calculateIntegral(float from, float to) {
+            return antiderivative(to) - antiderivative(from);
+        }
+
+        private float antiderivative(float x) {
+            // f(x) = x + c => F(x) = 1/2 * x^2 + c * x
+            return 0.5f * x * x + mIntercept * x;
+        }
+
+    }
+
+}
diff --git a/services/core/java/com/android/server/display/whitebalance/AmbientSensor.java b/services/core/java/com/android/server/display/whitebalance/AmbientSensor.java
new file mode 100644
index 0000000..1707a62
--- /dev/null
+++ b/services/core/java/com/android/server/display/whitebalance/AmbientSensor.java
@@ -0,0 +1,381 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.display.whitebalance;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
+import android.os.Handler;
+import android.util.Slog;
+
+import com.android.internal.util.Preconditions;
+import com.android.server.display.utils.History;
+
+import java.io.PrintWriter;
+
+/**
+ * The DisplayWhiteBalanceController uses the AmbientSensor to detect changes in the ambient
+ * brightness and color temperature.
+ *
+ * The AmbientSensor listens on an actual sensor, derives the ambient brightness or color
+ * temperature from its events, and calls back into the DisplayWhiteBalanceController to report it.
+ */
+abstract class AmbientSensor {
+
+    protected String mTag;
+    protected boolean mLoggingEnabled;
+
+    private final Handler mHandler;
+
+    protected final SensorManager mSensorManager;
+    protected Sensor mSensor;
+
+    private boolean mEnabled;
+
+    private int mRate; // Milliseconds
+
+    // The total events count and the most recent events are kept for debugging purposes.
+    private int mEventsCount;
+    private static final int HISTORY_SIZE = 50;
+    private History mEventsHistory;
+
+    /**
+     * @param tag
+     *      The tag used for dumping and logging.
+     * @param handler
+     *      The handler used to determine which thread to run on.
+     * @param sensorManager
+     *      The sensor manager used to acquire necessary sensors.
+     * @param rate
+     *      The sensor rate.
+     *
+     * @throws IllegalArgumentException
+     *      - rate is not positive.
+     * @throws NullPointerException
+     *      - handler is null;
+     *      - sensorManager is null.
+     * @throws IllegalStateException
+     *      - Cannot find the necessary sensor.
+     */
+    AmbientSensor(String tag, @NonNull Handler handler, @NonNull SensorManager sensorManager,
+            int rate) {
+        validateArguments(handler, sensorManager, rate);
+        mTag = tag;
+        mLoggingEnabled = false;
+        mHandler = handler;
+        mSensorManager = sensorManager;
+        mEnabled = false;
+        mRate = rate;
+        mEventsCount = 0;
+        mEventsHistory = new History(HISTORY_SIZE);
+    }
+
+    /**
+     * Enable/disable the sensor.
+     *
+     * @param enabled
+     *      Whether the sensor should be on/off.
+     *
+     * @return Whether the method succeeded or not.
+     */
+    public boolean setEnabled(boolean enabled) {
+        if (enabled) {
+            return enable();
+        } else {
+            return disable();
+        }
+    }
+
+    /**
+     * Enable/disable logging.
+     *
+     * @param loggingEnabled
+     *      Whether logging should be on/off.
+     *
+     * @return Whether the method succeeded or not.
+     */
+    public boolean setLoggingEnabled(boolean loggingEnabled) {
+        if (mLoggingEnabled == loggingEnabled) {
+            return false;
+        }
+        mLoggingEnabled = loggingEnabled;
+        return true;
+    }
+
+    /**
+     * Dump the state.
+     *
+     * @param writer
+     *      The PrintWriter used to dump the state.
+     */
+    public void dump(PrintWriter writer) {
+        writer.println("  " + mTag);
+        writer.println("    mLoggingEnabled=" + mLoggingEnabled);
+        writer.println("    mHandler=" + mHandler);
+        writer.println("    mSensorManager=" + mSensorManager);
+        writer.println("    mSensor=" + mSensor);
+        writer.println("    mEnabled=" + mEnabled);
+        writer.println("    mRate=" + mRate);
+        writer.println("    mEventsCount=" + mEventsCount);
+        writer.println("    mEventsHistory=" + mEventsHistory);
+    }
+
+
+    private static void validateArguments(Handler handler, SensorManager sensorManager, int rate) {
+        Preconditions.checkNotNull(handler, "handler cannot be null");
+        Preconditions.checkNotNull(sensorManager, "sensorManager cannot be null");
+        if (rate <= 0) {
+            throw new IllegalArgumentException("rate must be positive");
+        }
+    }
+
+    protected abstract void update(float value);
+
+    private boolean enable() {
+        if (mEnabled) {
+            return false;
+        }
+        if (mLoggingEnabled) {
+            Slog.d(mTag, "enabling");
+        }
+        mEnabled = true;
+        startListening();
+        return true;
+    }
+
+    private boolean disable() {
+        if (!mEnabled) {
+            return false;
+        }
+        if (mLoggingEnabled) {
+            Slog.d(mTag, "disabling");
+        }
+        mEnabled = false;
+        mEventsCount = 0;
+        stopListening();
+        return true;
+    }
+
+    private void startListening() {
+        if (mSensorManager == null) {
+            return;
+        }
+        mSensorManager.registerListener(mListener, mSensor, mRate * 1000, mHandler);
+    }
+
+    private void stopListening() {
+        if (mSensorManager == null) {
+            return;
+        }
+        mSensorManager.unregisterListener(mListener);
+    }
+
+    private void handleNewEvent(float value) {
+        // This shouldn't really happen, except for the race condition where the sensor is disabled
+        // with an event already in the handler queue, in which case we discard that event.
+        if (!mEnabled) {
+            return;
+        }
+        if (mLoggingEnabled) {
+            Slog.d(mTag, "handle new event: " + value);
+        }
+        mEventsCount++;
+        mEventsHistory.add(value);
+        update(value);
+    }
+
+    private SensorEventListener mListener = new SensorEventListener() {
+
+        @Override
+        public void onSensorChanged(SensorEvent event) {
+            final float value = event.values[0];
+            handleNewEvent(value);
+        }
+
+        @Override
+        public void onAccuracyChanged(Sensor sensor, int accuracy) {
+            // Not used.
+        }
+
+    };
+
+    /**
+     * A sensor that reports the ambient brightness.
+     */
+    static class AmbientBrightnessSensor extends AmbientSensor {
+
+        private static final String TAG = "AmbientBrightnessSensor";
+
+        // To decouple the DisplayWhiteBalanceController from the AmbientBrightnessSensor, the
+        // DWBC implements Callbacks and passes itself to the ABS so it can call back into it
+        // without knowing about it.
+        @Nullable
+        private Callbacks mCallbacks;
+
+        /**
+         * @param handler
+         *      The handler used to determine which thread to run on.
+         * @param sensorManager
+         *      The sensor manager used to acquire necessary sensors.
+         * @param rate
+         *      The sensor rate.
+         *
+         * @throws IllegalArgumentException
+         *      - rate is not positive.
+         * @throws NullPointerException
+         *      - handler is null;
+         *      - sensorManager is null.
+         * @throws IllegalStateException
+         *      - Cannot find the light sensor.
+         */
+        AmbientBrightnessSensor(@NonNull Handler handler, @NonNull SensorManager sensorManager,
+                int rate) {
+            super(TAG, handler, sensorManager, rate);
+            mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
+            if (mSensor == null) {
+                throw new IllegalStateException("cannot find light sensor");
+            }
+            mCallbacks = null;
+        }
+
+        /**
+         * Set an object to call back to when the ambient brightness changes.
+         *
+         * @param callbacks
+         *      The object to call back to.
+         *
+         * @return Whether the method succeeded or not.
+         */
+        public boolean setCallbacks(Callbacks callbacks) {
+            if (mCallbacks == callbacks) {
+                return false;
+            }
+            mCallbacks = callbacks;
+            return true;
+        }
+
+        /**
+         * See {@link AmbientSensor#dump base class}.
+         */
+        @Override
+        public void dump(PrintWriter writer) {
+            super.dump(writer);
+            writer.println("    mCallbacks=" + mCallbacks);
+        }
+
+        interface Callbacks {
+            void onAmbientBrightnessChanged(float value);
+        }
+
+        @Override
+        protected void update(float value) {
+            if (mCallbacks != null) {
+                mCallbacks.onAmbientBrightnessChanged(value);
+            }
+        }
+
+    }
+
+    /**
+     * A sensor that reports the ambient color temperature.
+     */
+    static class AmbientColorTemperatureSensor extends AmbientSensor {
+
+        private static final String TAG = "AmbientColorTemperatureSensor";
+
+        // To decouple the DisplayWhiteBalanceController from the
+        // AmbientColorTemperatureSensor, the DWBC implements Callbacks and passes itself to the
+        // ACTS so it can call back into it without knowing about it.
+        @Nullable
+        private Callbacks mCallbacks;
+
+        /**
+         * @param handler
+         *      The handler used to determine which thread to run on.
+         * @param sensorManager
+         *      The sensor manager used to acquire necessary sensors.
+         * @param name
+         *      The color sensor name.
+         * @param rate
+         *      The sensor rate.
+         *
+         * @throws IllegalArgumentException
+         *      - rate is not positive.
+         * @throws NullPointerException
+         *      - handler is null;
+         *      - sensorManager is null.
+         * @throws IllegalStateException
+         *      - Cannot find the color sensor.
+         */
+        AmbientColorTemperatureSensor(@NonNull Handler handler,
+                @NonNull SensorManager sensorManager, String name, int rate) {
+            super(TAG, handler, sensorManager, rate);
+            mSensor = null;
+            for (Sensor sensor : mSensorManager.getSensorList(Sensor.TYPE_ALL)) {
+                if (sensor.getStringType().equals(name)) {
+                    mSensor = sensor;
+                    break;
+                }
+            }
+            if (mSensor == null) {
+                throw new IllegalStateException("cannot find sensor " + name);
+            }
+            mCallbacks = null;
+        }
+
+        /**
+         * Set an object to call back to when the ambient color temperature changes.
+         *
+         * @param callbacks
+         *      The object to call back to.
+         *
+         * @return Whether the method succeeded or not.
+         */
+        public boolean setCallbacks(Callbacks callbacks) {
+            if (mCallbacks == callbacks) {
+                return false;
+            }
+            mCallbacks = callbacks;
+            return true;
+        }
+
+        /**
+         * See {@link AmbientSensor#dump base class}.
+         */
+        @Override
+        public void dump(PrintWriter writer) {
+            super.dump(writer);
+            writer.println("    mCallbacks=" + mCallbacks);
+        }
+
+        interface Callbacks {
+            void onAmbientColorTemperatureChanged(float value);
+        }
+
+        @Override
+        protected void update(float value) {
+            if (mCallbacks != null) {
+                mCallbacks.onAmbientColorTemperatureChanged(value);
+            }
+        }
+
+    }
+
+}
diff --git a/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java b/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java
new file mode 100644
index 0000000..7ae00af
--- /dev/null
+++ b/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java
@@ -0,0 +1,385 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.display.whitebalance;
+
+import android.annotation.NonNull;
+import android.util.Slog;
+
+import com.android.internal.util.Preconditions;
+import com.android.server.LocalServices;
+import com.android.server.display.ColorDisplayService.ColorDisplayServiceInternal;
+import com.android.server.display.utils.History;
+
+import java.io.PrintWriter;
+
+/**
+ * The DisplayWhiteBalanceController drives display white-balance (automatically correcting the
+ * screen color temperature depending on the ambient color temperature).
+ *
+ * The DisplayWhiteBalanceController:
+ * - Uses the AmbientColorTemperatureSensor to detect changes in the ambient color temperature;
+ * - Uses the AmbientColorTemperatureFilter to average these changes over time, filter out the
+ *   noise, and arrive at an estimate of the actual ambient color temperature;
+ * - Uses the DisplayWhiteBalanceThrottler to decide whether the screen color tempearture should be
+ *   updated, suppressing changes that are too frequent or too minor.
+ */
+public class DisplayWhiteBalanceController implements
+        AmbientSensor.AmbientBrightnessSensor.Callbacks,
+        AmbientSensor.AmbientColorTemperatureSensor.Callbacks {
+
+    protected static final String TAG = "DisplayWhiteBalanceController";
+    protected boolean mLoggingEnabled;
+
+    private boolean mEnabled;
+
+    // To decouple the DisplayPowerController from the DisplayWhiteBalanceController, the DPC
+    // implements Callbacks and passes itself to the DWBC so it can call back into it without
+    // knowing about it.
+    private Callbacks mCallbacks;
+
+    private AmbientSensor.AmbientBrightnessSensor mBrightnessSensor;
+    private AmbientFilter mBrightnessFilter;
+    private AmbientSensor.AmbientColorTemperatureSensor mColorTemperatureSensor;
+    private AmbientFilter mColorTemperatureFilter;
+    private DisplayWhiteBalanceThrottler mThrottler;
+
+    // When the brightness drops below a certain threshold, it affects the color temperature
+    // accuracy, so we fall back to a fixed ambient color temperature.
+    private final float mLowLightAmbientBrightnessThreshold;
+    private final float mLowLightAmbientColorTemperature;
+
+    private float mAmbientColorTemperature;
+    private float mPendingAmbientColorTemperature;
+    private float mLastAmbientColorTemperature;
+
+    private ColorDisplayServiceInternal mColorDisplayServiceInternal;
+
+    // The most recent ambient color temperature values are kept for debugging purposes.
+    private static final int HISTORY_SIZE = 50;
+    private History mAmbientColorTemperatureHistory;
+
+    // Override the ambient color temperature for debugging purposes.
+    private float mAmbientColorTemperatureOverride;
+
+    /**
+     * @param brightnessSensor
+     *      The sensor used to detect changes in the ambient brightness.
+     * @param brightnessFilter
+     *      The filter used to avergae ambient brightness changes over time, filter out the noise
+     *      and arrive at an estimate of the actual ambient brightness.
+     * @param colorTemperatureSensor
+     *      The sensor used to detect changes in the ambient color temperature.
+     * @param colorTemperatureFilter
+     *      The filter used to average ambient color temperature changes over time, filter out the
+     *      noise and arrive at an estimate of the actual ambient color temperature.
+     * @param throttler
+     *      The throttler used to determine whether the new screen color temperature should be
+     *      updated or not.
+     * @param lowLightAmbientBrightnessThreshold
+     *      The ambient brightness threshold beneath which we fall back to a fixed ambient color
+     *      temperature.
+     * @param lowLightAmbientColorTemperature
+     *      The ambient color temperature to which we fall back when the ambient brightness drops
+     *      beneath a certain threshold.
+     *
+     * @throws NullPointerException
+     *      - brightnessSensor is null;
+     *      - brightnessFilter is null;
+     *      - colorTemperatureSensor is null;
+     *      - colorTemperatureFilter is null;
+     *      - throttler is null.
+     */
+    public DisplayWhiteBalanceController(
+            @NonNull AmbientSensor.AmbientBrightnessSensor brightnessSensor,
+            @NonNull AmbientFilter brightnessFilter,
+            @NonNull AmbientSensor.AmbientColorTemperatureSensor colorTemperatureSensor,
+            @NonNull AmbientFilter colorTemperatureFilter,
+            @NonNull DisplayWhiteBalanceThrottler throttler,
+            float lowLightAmbientBrightnessThreshold, float lowLightAmbientColorTemperature) {
+        validateArguments(brightnessSensor, brightnessFilter, colorTemperatureSensor,
+                colorTemperatureFilter, throttler);
+        mLoggingEnabled = false;
+        mEnabled = false;
+        mCallbacks = null;
+        mBrightnessSensor = brightnessSensor;
+        mBrightnessFilter = brightnessFilter;
+        mColorTemperatureSensor = colorTemperatureSensor;
+        mColorTemperatureFilter = colorTemperatureFilter;
+        mThrottler = throttler;
+        mLowLightAmbientBrightnessThreshold = lowLightAmbientBrightnessThreshold;
+        mLowLightAmbientColorTemperature = lowLightAmbientColorTemperature;
+        mAmbientColorTemperature = -1.0f;
+        mPendingAmbientColorTemperature = -1.0f;
+        mLastAmbientColorTemperature = -1.0f;
+        mAmbientColorTemperatureHistory = new History(HISTORY_SIZE);
+        mAmbientColorTemperatureOverride = -1.0f;
+        mColorDisplayServiceInternal = LocalServices.getService(ColorDisplayServiceInternal.class);
+    }
+
+    /**
+     * Enable/disable the controller.
+     *
+     * @param enabled
+     *      Whether the controller should be on/off.
+     *
+     * @return Whether the method succeeded or not.
+     */
+    public boolean setEnabled(boolean enabled) {
+        if (enabled) {
+            return enable();
+        } else {
+            return disable();
+        }
+    }
+
+    /**
+     * Set an object to call back to when the screen color temperature should be updated.
+     *
+     * @param callbacks
+     *      The object to call back to.
+     *
+     * @return Whether the method succeeded or not.
+     */
+    public boolean setCallbacks(Callbacks callbacks) {
+        if (mCallbacks == callbacks) {
+            return false;
+        }
+        mCallbacks = callbacks;
+        return true;
+    }
+
+    /**
+     * Enable/disable logging.
+     *
+     * @param loggingEnabled
+     *      Whether logging should be on/off.
+     *
+     * @return Whether the method succeeded or not.
+     */
+    public boolean setLoggingEnabled(boolean loggingEnabled) {
+        if (mLoggingEnabled == loggingEnabled) {
+            return false;
+        }
+        mLoggingEnabled = loggingEnabled;
+        mBrightnessSensor.setLoggingEnabled(loggingEnabled);
+        mBrightnessFilter.setLoggingEnabled(loggingEnabled);
+        mColorTemperatureSensor.setLoggingEnabled(loggingEnabled);
+        mColorTemperatureFilter.setLoggingEnabled(loggingEnabled);
+        mThrottler.setLoggingEnabled(loggingEnabled);
+        return true;
+    }
+
+    /**
+     * Set the ambient color temperature override.
+     *
+     * This is only applied when the ambient color temperature changes or is updated (in which case
+     * it overrides the ambient color temperature estimate); in other words, it doesn't necessarily
+     * change the screen color temperature immediately.
+     *
+     * @param ambientColorTemperatureOverride
+     *      The ambient color temperature override.
+     *
+     * @return Whether the method succeeded or not.
+     */
+    public boolean setAmbientColorTemperatureOverride(float ambientColorTemperatureOverride) {
+        if (mAmbientColorTemperatureOverride == ambientColorTemperatureOverride) {
+            return false;
+        }
+        mAmbientColorTemperatureOverride = ambientColorTemperatureOverride;
+        return true;
+    }
+
+    /**
+     * Dump the state.
+     *
+     * @param writer
+     *      The writer used to dump the state.
+     */
+    public void dump(PrintWriter writer) {
+        writer.println("DisplayWhiteBalanceController");
+        writer.println("  mLoggingEnabled=" + mLoggingEnabled);
+        writer.println("  mEnabled=" + mEnabled);
+        writer.println("  mCallbacks=" + mCallbacks);
+        mBrightnessSensor.dump(writer);
+        mBrightnessFilter.dump(writer);
+        mColorTemperatureSensor.dump(writer);
+        mColorTemperatureFilter.dump(writer);
+        mThrottler.dump(writer);
+        writer.println("  mLowLightAmbientBrightnessThreshold="
+                + mLowLightAmbientBrightnessThreshold);
+        writer.println("  mLowLightAmbientColorTemperature=" + mLowLightAmbientColorTemperature);
+        writer.println("  mAmbientColorTemperature=" + mAmbientColorTemperature);
+        writer.println("  mPendingAmbientColorTemperature=" + mPendingAmbientColorTemperature);
+        writer.println("  mLastAmbientColorTemperature=" + mLastAmbientColorTemperature);
+        writer.println("  mAmbientColorTemperatureHistory=" + mAmbientColorTemperatureHistory);
+        writer.println("  mAmbientColorTemperatureOverride=" + mAmbientColorTemperatureOverride);
+    }
+
+    @Override // AmbientSensor.AmbientBrightnessSensor.Callbacks
+    public void onAmbientBrightnessChanged(float value) {
+        final long time = System.currentTimeMillis();
+        mBrightnessFilter.addValue(time, value);
+        updateAmbientColorTemperature();
+    }
+
+    @Override // AmbientSensor.AmbientColorTemperatureSensor.Callbacks
+    public void onAmbientColorTemperatureChanged(float value) {
+        final long time = System.currentTimeMillis();
+        mColorTemperatureFilter.addValue(time, value);
+        updateAmbientColorTemperature();
+    }
+
+    /**
+     * Updates the ambient color temperature.
+     */
+    public void updateAmbientColorTemperature() {
+        final long time = System.currentTimeMillis();
+        float ambientColorTemperature = mColorTemperatureFilter.getEstimate(time);
+
+        final float ambientBrightness = mBrightnessFilter.getEstimate(time);
+        if (ambientBrightness < mLowLightAmbientBrightnessThreshold) {
+            if (mLoggingEnabled) {
+                Slog.d(TAG, "low light ambient brightness: " + ambientBrightness + " < "
+                        + mLowLightAmbientBrightnessThreshold
+                        + ", falling back to fixed ambient color temperature: "
+                        + ambientColorTemperature + " => " + mLowLightAmbientColorTemperature);
+            }
+            ambientColorTemperature = mLowLightAmbientColorTemperature;
+        }
+
+        if (mAmbientColorTemperatureOverride != -1.0f) {
+            if (mLoggingEnabled) {
+                Slog.d(TAG, "override ambient color temperature: " + ambientColorTemperature
+                        + " => " + mAmbientColorTemperatureOverride);
+            }
+            ambientColorTemperature = mAmbientColorTemperatureOverride;
+        }
+
+        // When the screen color temperature needs to be updated, we call DisplayPowerController to
+        // call our updateColorTemperature. The reason we don't call it directly is that we want
+        // all changes to the system to happen in a predictable order in DPC's main loop
+        // (updatePowerState).
+        if (ambientColorTemperature == -1.0f || mThrottler.throttle(ambientColorTemperature)) {
+            return;
+        }
+
+        if (mLoggingEnabled) {
+            Slog.d(TAG, "pending ambient color temperature: " + ambientColorTemperature);
+        }
+        mPendingAmbientColorTemperature = ambientColorTemperature;
+        if (mCallbacks != null) {
+            mCallbacks.updateWhiteBalance();
+        }
+    }
+
+    /**
+     * Updates the screen color temperature.
+     */
+    public void updateScreenColorTemperature() {
+        float ambientColorTemperature = -1.0f;
+
+        // If both the pending and the current ambient color temperatures are -1, it means the DWBC
+        // was just enabled, and we use the last ambient color temperature until new sensor events
+        // give us a better estimate.
+        if (mAmbientColorTemperature == -1.0f && mPendingAmbientColorTemperature == -1.0f) {
+            ambientColorTemperature = mLastAmbientColorTemperature;
+        }
+
+        // Otherwise, we use the pending ambient color temperature, but only if it's non-trivial
+        // and different than the current one.
+        if (mPendingAmbientColorTemperature != -1.0f
+                && mPendingAmbientColorTemperature != mAmbientColorTemperature) {
+            ambientColorTemperature = mPendingAmbientColorTemperature;
+        }
+
+        if (ambientColorTemperature == -1.0f) {
+            return;
+        }
+
+        mAmbientColorTemperature = ambientColorTemperature;
+        if (mLoggingEnabled) {
+            Slog.d(TAG, "ambient color temperature: " + mAmbientColorTemperature);
+        }
+        mPendingAmbientColorTemperature = -1.0f;
+        mAmbientColorTemperatureHistory.add(mAmbientColorTemperature);
+        mColorDisplayServiceInternal.setDisplayWhiteBalanceColorTemperature(
+                (int) mAmbientColorTemperature);
+        mLastAmbientColorTemperature = mAmbientColorTemperature;
+    }
+
+    /**
+     * The DisplayWhiteBalanceController decouples itself from its parent (DisplayPowerController)
+     * by providing this interface to implement (and a method to set its callbacks object), and
+     * calling these methods.
+     */
+    public interface Callbacks {
+
+        /**
+         * Called whenever the display white-balance state has changed.
+         *
+         * Usually, this means the estimated ambient color temperature has changed enough, and the
+         * screen color temperature should be updated; but it is also called by
+         */
+        void updateWhiteBalance();
+    }
+
+    private void validateArguments(AmbientSensor.AmbientBrightnessSensor brightnessSensor,
+            AmbientFilter brightnessFilter,
+            AmbientSensor.AmbientColorTemperatureSensor colorTemperatureSensor,
+            AmbientFilter colorTemperatureFilter,
+            DisplayWhiteBalanceThrottler throttler) {
+        Preconditions.checkNotNull(brightnessSensor, "brightnessSensor must not be null");
+        Preconditions.checkNotNull(brightnessFilter, "brightnessFilter must not be null");
+        Preconditions.checkNotNull(colorTemperatureSensor,
+                "colorTemperatureSensor must not be null");
+        Preconditions.checkNotNull(colorTemperatureFilter,
+                "colorTemperatureFilter must not be null");
+        Preconditions.checkNotNull(throttler, "throttler cannot be null");
+    }
+
+    private boolean enable() {
+        if (mEnabled) {
+            return false;
+        }
+        if (mLoggingEnabled) {
+            Slog.d(TAG, "enabling");
+        }
+        mEnabled = true;
+        mBrightnessSensor.setEnabled(true);
+        mColorTemperatureSensor.setEnabled(true);
+        return true;
+    }
+
+    private boolean disable() {
+        if (!mEnabled) {
+            return false;
+        }
+        if (mLoggingEnabled) {
+            Slog.d(TAG, "disabling");
+        }
+        mEnabled = false;
+        mBrightnessSensor.setEnabled(false);
+        mBrightnessFilter.clear();
+        mColorTemperatureSensor.setEnabled(false);
+        mColorTemperatureFilter.clear();
+        mThrottler.clear();
+        mAmbientColorTemperature = -1.0f;
+        mPendingAmbientColorTemperature = -1.0f;
+        return true;
+    }
+
+}
diff --git a/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceFactory.java b/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceFactory.java
new file mode 100644
index 0000000..fd78ddb
--- /dev/null
+++ b/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceFactory.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.display.whitebalance;
+
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.hardware.SensorManager;
+import android.os.Handler;
+import android.util.TypedValue;
+
+/**
+ * The DisplayWhiteBalanceFactory creates and configures an DisplayWhiteBalanceController.
+ */
+public class DisplayWhiteBalanceFactory {
+
+    private static final String BRIGHTNESS_FILTER_TAG = "AmbientBrightnessFilter";
+    private static final String COLOR_TEMPERATURE_FILTER_TAG = "AmbientColorTemperatureFilter";
+
+    /**
+     * Create and configure an DisplayWhiteBalanceController.
+     *
+     * @param handler
+     *      The handler used to determine which thread to run on.
+     * @param sensorManager
+     *      The sensor manager used to acquire necessary sensors.
+     * @param resources
+     *      The resources used to configure the various components.
+     *
+     * @return An DisplayWhiteBalanceController.
+     *
+     * @throws NullPointerException
+     *      - handler is null;
+     *      - sensorManager is null.
+     * @throws Resources.NotFoundException
+     *      - Configurations are missing.
+     * @throws IllegalArgumentException
+     *      - Configurations are invalid.
+     * @throws IllegalStateException
+     *      - Cannot find the necessary sensors.
+     */
+    public static DisplayWhiteBalanceController create(Handler handler,
+            SensorManager sensorManager, Resources resources) {
+        final AmbientSensor.AmbientBrightnessSensor brightnessSensor =
+                createBrightnessSensor(handler, sensorManager, resources);
+        final AmbientFilter brightnessFilter = createBrightnessFilter(resources);
+        final AmbientSensor.AmbientColorTemperatureSensor colorTemperatureSensor =
+                createColorTemperatureSensor(handler, sensorManager, resources);
+        final AmbientFilter colorTemperatureFilter = createColorTemperatureFilter(resources);
+        final DisplayWhiteBalanceThrottler throttler = createThrottler(resources);
+        final float lowLightAmbientBrightnessThreshold = getFloat(resources,
+                com.android.internal.R.dimen
+                .config_displayWhiteBalanceLowLightAmbientBrightnessThreshold);
+        final float lowLightAmbientColorTemperature = getFloat(resources,
+                com.android.internal.R.dimen
+                .config_displayWhiteBalanceLowLightAmbientColorTemperature);
+        final DisplayWhiteBalanceController controller = new DisplayWhiteBalanceController(
+                brightnessSensor, brightnessFilter, colorTemperatureSensor, colorTemperatureFilter,
+                throttler, lowLightAmbientBrightnessThreshold, lowLightAmbientColorTemperature);
+        brightnessSensor.setCallbacks(controller);
+        colorTemperatureSensor.setCallbacks(controller);
+        return controller;
+    }
+
+    // Instantiation is disabled.
+    private DisplayWhiteBalanceFactory() { }
+
+    private static AmbientSensor.AmbientBrightnessSensor createBrightnessSensor(Handler handler,
+            SensorManager sensorManager, Resources resources) {
+        final int rate = resources.getInteger(
+                com.android.internal.R.integer.config_displayWhiteBalanceBrightnessSensorRate);
+        return new AmbientSensor.AmbientBrightnessSensor(handler, sensorManager, rate);
+    }
+
+    private static AmbientFilter createBrightnessFilter(Resources resources) {
+        final int horizon = resources.getInteger(
+                com.android.internal.R.integer.config_displayWhiteBalanceBrightnessFilterHorizon);
+        final float intercept = getFloat(resources,
+                com.android.internal.R.dimen.config_displayWhiteBalanceBrightnessFilterIntercept);
+        if (!Float.isNaN(intercept)) {
+            return new AmbientFilter.WeightedMovingAverageAmbientFilter(
+                    BRIGHTNESS_FILTER_TAG, horizon, intercept);
+        }
+        throw new IllegalArgumentException("missing configurations: "
+                + "expected config_displayWhiteBalanceBrightnessFilterIntercept");
+    }
+
+
+    private static AmbientSensor.AmbientColorTemperatureSensor createColorTemperatureSensor(
+            Handler handler, SensorManager sensorManager, Resources resources) {
+        final String name = resources.getString(
+                com.android.internal.R.string
+                .config_displayWhiteBalanceColorTemperatureSensorName);
+        final int rate = resources.getInteger(
+                com.android.internal.R.integer
+                .config_displayWhiteBalanceColorTemperatureSensorRate);
+        return new AmbientSensor.AmbientColorTemperatureSensor(handler, sensorManager, name, rate);
+    }
+
+    private static AmbientFilter createColorTemperatureFilter(Resources resources) {
+        final int horizon = resources.getInteger(
+                com.android.internal.R.integer
+                .config_displayWhiteBalanceColorTemperatureFilterHorizon);
+        final float intercept = getFloat(resources,
+                com.android.internal.R.dimen
+                .config_displayWhiteBalanceColorTemperatureFilterIntercept);
+        if (!Float.isNaN(intercept)) {
+            return new AmbientFilter.WeightedMovingAverageAmbientFilter(
+                    COLOR_TEMPERATURE_FILTER_TAG, horizon, intercept);
+        }
+        throw new IllegalArgumentException("missing configurations: "
+                + "expected config_displayWhiteBalanceColorTemperatureFilterIntercept");
+    }
+
+    private static DisplayWhiteBalanceThrottler createThrottler(Resources resources) {
+        final int increaseDebounce = resources.getInteger(
+                com.android.internal.R.integer.config_displayWhiteBalanceDecreaseDebounce);
+        final int decreaseDebounce = resources.getInteger(
+                com.android.internal.R.integer.config_displayWhiteBalanceIncreaseDebounce);
+        final float[] baseThresholds = getFloatArray(resources,
+                com.android.internal.R.array.config_displayWhiteBalanceBaseThresholds);
+        final float[] increaseThresholds = getFloatArray(resources,
+                com.android.internal.R.array.config_displayWhiteBalanceIncreaseThresholds);
+        final float[] decreaseThresholds = getFloatArray(resources,
+                com.android.internal.R.array.config_displayWhiteBalanceDecreaseThresholds);
+        return new DisplayWhiteBalanceThrottler(increaseDebounce, decreaseDebounce, baseThresholds,
+                increaseThresholds, decreaseThresholds);
+    }
+
+    private static float getFloat(Resources resources, int id) {
+        TypedValue value = new TypedValue();
+        resources.getValue(id, value, true /* resolveRefs */);
+        if (value.type != TypedValue.TYPE_FLOAT) {
+            return Float.NaN;
+        }
+        return value.getFloat();
+    }
+
+    private static float[] getFloatArray(Resources resources, int id) {
+        TypedArray array = resources.obtainTypedArray(id);
+        try {
+            if (array.length() == 0) {
+                return null;
+            }
+            float[] values = new float[array.length()];
+            for (int i = 0; i < values.length; i++) {
+                values[i] = array.getFloat(i, Float.NaN);
+                if (Float.isNaN(values[i])) {
+                    return null;
+                }
+            }
+            return values;
+        } finally {
+            array.recycle();
+        }
+    }
+
+}
diff --git a/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceSettings.java b/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceSettings.java
new file mode 100644
index 0000000..a53e91c
--- /dev/null
+++ b/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceSettings.java
@@ -0,0 +1,230 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.display.whitebalance;
+
+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.UserHandle;
+import android.provider.Settings.Secure;
+import android.util.Slog;
+
+import com.android.internal.util.Preconditions;
+import com.android.server.LocalServices;
+import com.android.server.display.ColorDisplayService;
+import com.android.server.display.ColorDisplayService.ColorDisplayServiceInternal;
+import com.android.server.display.whitebalance.DisplayWhiteBalanceController.Callbacks;
+
+import java.io.PrintWriter;
+
+/**
+ * The DisplayWhiteBalanceSettings holds the state of all the settings related to
+ * display white-balance, and can be used to decide whether to enable the
+ * DisplayWhiteBalanceController.
+ */
+public class DisplayWhiteBalanceSettings implements
+        ColorDisplayService.DisplayWhiteBalanceListener {
+
+    protected static final String TAG = "DisplayWhiteBalanceSettings";
+    protected boolean mLoggingEnabled;
+
+    private static final String SETTING_URI = Secure.DISPLAY_WHITE_BALANCE_ENABLED;
+    private static final int SETTING_DEFAULT = 0;
+    private static final int SETTING_ENABLED = 1;
+
+    private static final int MSG_SET_ACTIVE = 1;
+
+    private final Context mContext;
+    private final Handler mHandler;
+    private final SettingsObserver mSettingsObserver;
+
+    // To decouple the DisplayPowerController from the DisplayWhiteBalanceSettings, the DPC
+    // implements Callbacks and passes itself to the DWBS so it can call back into it without
+    // knowing about it.
+    private Callbacks mCallbacks;
+
+    private int mSetting;
+    private boolean mActive;
+
+    /**
+     * @param context
+     *      The context in which display white-balance is used.
+     * @param handler
+     *      The handler used to determine which thread to run on.
+     *
+     * @throws NullPointerException
+     *      - context is null;
+     *      - handler is null.
+     */
+    public DisplayWhiteBalanceSettings(@NonNull Context context, @NonNull Handler handler) {
+        validateArguments(context, handler);
+        mLoggingEnabled = false;
+        mContext = context;
+        mHandler = new DisplayWhiteBalanceSettingsHandler(handler.getLooper());
+        mSettingsObserver = new SettingsObserver(mHandler);
+        mSetting = getSetting();
+        mActive = false;
+        mCallbacks = null;
+
+        mContext.getContentResolver().registerContentObserver(
+                Secure.getUriFor(SETTING_URI), false /* notifyForDescendants */, mSettingsObserver,
+                UserHandle.USER_ALL);
+
+        ColorDisplayServiceInternal cds =
+                LocalServices.getService(ColorDisplayServiceInternal.class);
+        cds.setDisplayWhiteBalanceListener(this);
+    }
+
+    /**
+     * Set an object to call back to when the display white balance state should be updated.
+     *
+     * @param callbacks
+     *      The object to call back to.
+     *
+     * @return Whether the method suceeded or not.
+     */
+    public boolean setCallbacks(Callbacks callbacks) {
+        if (mCallbacks == callbacks) {
+            return false;
+        }
+        mCallbacks = callbacks;
+        return true;
+    }
+
+    /**
+     * Enable/disable logging.
+     *
+     * @param loggingEnabled
+     *      Whether logging should be on/off.
+     *
+     * @return Whether the method succeeded or not.
+     */
+    public boolean setLoggingEnabled(boolean loggingEnabled) {
+        if (mLoggingEnabled == loggingEnabled) {
+            return false;
+        }
+        mLoggingEnabled = loggingEnabled;
+        return true;
+    }
+
+    /**
+     * Returns whether display white-balance is enabled.
+     *
+     * @return Whether display white-balance is enabled.
+     */
+    public boolean isEnabled() {
+        return (mSetting == SETTING_ENABLED) && mActive;
+    }
+
+    /**
+     * Re-evaluate state after switching to a new user.
+     */
+    public void onSwitchUser() {
+        handleSettingChange();
+    }
+
+    /**
+     * Dump the state.
+     *
+     * @param writer
+     *      The writer used to dump the state.
+     */
+    public void dump(PrintWriter writer) {
+        writer.println("DisplayWhiteBalanceSettings");
+        writer.println("  mLoggingEnabled=" + mLoggingEnabled);
+        writer.println("  mContext=" + mContext);
+        writer.println("  mHandler=" + mHandler);
+        writer.println("  mSettingsObserver=" + mSettingsObserver);
+        writer.println("  mSetting=" + mSetting);
+        writer.println("  mActive=" + mActive);
+        writer.println("  mCallbacks=" + mCallbacks);
+    }
+
+    @Override
+    public void onDisplayWhiteBalanceStatusChanged(boolean active) {
+        Message msg = mHandler.obtainMessage(MSG_SET_ACTIVE, active ? 1 : 0, 0);
+        msg.sendToTarget();
+    }
+
+    private void validateArguments(Context context, Handler handler) {
+        Preconditions.checkNotNull(context, "context must not be null");
+        Preconditions.checkNotNull(handler, "handler must not be null");
+    }
+
+    private int getSetting() {
+        return Secure.getIntForUser(mContext.getContentResolver(), SETTING_URI, SETTING_DEFAULT,
+                UserHandle.USER_CURRENT);
+    }
+
+    private void handleSettingChange() {
+        final int setting = getSetting();
+        if (mSetting == setting) {
+            return;
+        }
+        if (mLoggingEnabled) {
+            Slog.d(TAG, "Setting: " + setting);
+        }
+        mSetting = setting;
+        if (mCallbacks != null) {
+            mCallbacks.updateWhiteBalance();
+        }
+    }
+
+    private void setActive(boolean active) {
+        if (mActive == active) {
+            return;
+        }
+        if (mLoggingEnabled) {
+            Slog.d(TAG, "Active: " + active);
+        }
+        mActive = active;
+        if (mCallbacks != null) {
+            mCallbacks.updateWhiteBalance();
+        }
+    }
+
+    private final class SettingsObserver extends ContentObserver {
+        SettingsObserver(Handler handler) {
+            super(handler);
+        }
+
+        @Override
+        public void onChange(boolean selfChange, Uri uri) {
+            handleSettingChange();
+        }
+    }
+
+    private final class DisplayWhiteBalanceSettingsHandler extends Handler {
+        DisplayWhiteBalanceSettingsHandler(Looper looper) {
+            super(looper, null, true /* async */);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case MSG_SET_ACTIVE:
+                    setActive(msg.arg1 != 0);
+                    break;
+            }
+        }
+    }
+
+}
diff --git a/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceThrottler.java b/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceThrottler.java
new file mode 100644
index 0000000..c1f0e98
--- /dev/null
+++ b/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceThrottler.java
@@ -0,0 +1,227 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.display.whitebalance;
+
+import android.util.Slog;
+
+import java.io.PrintWriter;
+import java.util.Arrays;
+
+/**
+ * The DisplayWhiteBalanceController uses the DisplayWhiteBalanceThrottler to decide whether the
+ * screen color temperature should be updated, suppressing changes that are too frequent or too
+ * minor.
+ */
+class DisplayWhiteBalanceThrottler {
+
+    protected static final String TAG = "DisplayWhiteBalanceThrottler";
+    protected boolean mLoggingEnabled;
+
+    private int mIncreaseDebounce;  // Milliseconds
+    private int mDecreaseDebounce;  // Milliseconds
+    private long mLastTime;         // Milliseconds
+
+    private float[] mBaseThresholds;
+    private float[] mIncreaseThresholds;
+    private float[] mDecreaseThresholds;
+    private float mIncreaseThreshold;
+    private float mDecreaseThreshold;
+    private float mLastValue;
+
+    /**
+     * @param increaseDebounce
+     *      The debounce time for increasing (throttled if {@code time < lastTime + debounce}).
+     * @param decreaseDebounce
+     *      The debounce time for decreasing (throttled if {@code time < lastTime + debounce}).
+     * @param baseThresholds
+     *      The ambient color temperature values used to determine the threshold as the
+     *      corresponding value in increaseThresholds/decreaseThresholds.
+     * @param increaseThresholds
+     *      The increase threshold values (throttled if {@code value < value * (1 + threshold)}).
+     * @param decreaseThresholds
+     *      The decrease threshold values (throttled if {@code value > value * (1 - threshold)}).
+     *
+     * @throws IllegalArgumentException
+     *      - increaseDebounce is negative;
+     *      - decreaseDebounce is negative;
+     *      - baseThresholds to increaseThresholds is not a valid mapping*;
+     *      - baseThresholds to decreaseThresholds is not a valid mapping*;
+     *
+     *      (*) The x to y mapping is valid if:
+     *          - x and y are not null;
+     *          - x and y are not empty;
+     *          - x and y contain only non-negative numbers;
+     *          - x is strictly increasing.
+     */
+    DisplayWhiteBalanceThrottler(int increaseDebounce, int decreaseDebounce,
+            float[] baseThresholds, float[] increaseThresholds, float[] decreaseThresholds) {
+        validateArguments(increaseDebounce, decreaseDebounce, baseThresholds, increaseThresholds,
+                decreaseThresholds);
+        mLoggingEnabled = false;
+        mIncreaseDebounce = increaseDebounce;
+        mDecreaseDebounce = decreaseDebounce;
+        mBaseThresholds = baseThresholds;
+        mIncreaseThresholds = increaseThresholds;
+        mDecreaseThresholds = decreaseThresholds;
+        clear();
+    }
+
+    /**
+     * Check whether the ambient color temperature should be throttled.
+     *
+     * @param value
+     *      The ambient color temperature value.
+     *
+     * @return Whether the ambient color temperature should be throttled.
+     */
+    public boolean throttle(float value) {
+        if (mLastTime != -1 && (tooSoon(value) || tooClose(value))) {
+            return true;
+        }
+        computeThresholds(value);
+        mLastTime = System.currentTimeMillis();
+        mLastValue = value;
+        return false;
+    }
+
+    /**
+     * Clears the throttler state.
+     */
+    public void clear() {
+        mLastTime = -1;
+        mIncreaseThreshold = -1.0f;
+        mDecreaseThreshold = -1.0f;
+        mLastValue = -1.0f;
+    }
+
+    /**
+     * Enable/disable logging.
+     *
+     * @param loggingEnabled
+     *      Whether logging is on/off.
+     *
+     * @return Whether the method succeeded or not.
+     */
+    public boolean setLoggingEnabled(boolean loggingEnabled) {
+        if (mLoggingEnabled == loggingEnabled) {
+            return false;
+        }
+        mLoggingEnabled = loggingEnabled;
+        return true;
+    }
+
+    /**
+     * Dump the state.
+     *
+     * @param writer
+     *      The PrintWriter used to dump the state.
+     */
+    public void dump(PrintWriter writer) {
+        writer.println("  DisplayWhiteBalanceThrottler");
+        writer.println("    mLoggingEnabled=" + mLoggingEnabled);
+        writer.println("    mIncreaseDebounce=" + mIncreaseDebounce);
+        writer.println("    mDecreaseDebounce=" + mDecreaseDebounce);
+        writer.println("    mLastTime=" + mLastTime);
+        writer.println("    mBaseThresholds=" + Arrays.toString(mBaseThresholds));
+        writer.println("    mIncreaseThresholds=" + Arrays.toString(mIncreaseThresholds));
+        writer.println("    mDecreaseThresholds=" + Arrays.toString(mDecreaseThresholds));
+        writer.println("    mIncreaseThreshold=" + mIncreaseThreshold);
+        writer.println("    mDecreaseThreshold=" + mDecreaseThreshold);
+        writer.println("    mLastValue=" + mLastValue);
+    }
+
+    private void validateArguments(float increaseDebounce, float decreaseDebounce,
+            float[] baseThresholds, float[] increaseThresholds, float[] decreaseThresholds) {
+        if (Float.isNaN(increaseDebounce) || increaseDebounce < 0.0f) {
+            throw new IllegalArgumentException("increaseDebounce must be a non-negative number.");
+        }
+        if (Float.isNaN(decreaseDebounce) || decreaseDebounce < 0.0f) {
+            throw new IllegalArgumentException("decreaseDebounce must be a non-negative number.");
+        }
+        if (!isValidMapping(baseThresholds, increaseThresholds)) {
+            throw new IllegalArgumentException(
+                    "baseThresholds to increaseThresholds is not a valid mapping.");
+        }
+        if (!isValidMapping(baseThresholds, decreaseThresholds)) {
+            throw new IllegalArgumentException(
+                    "baseThresholds to decreaseThresholds is not a valid mapping.");
+        }
+    }
+
+    private static boolean isValidMapping(float[] x, float[] y) {
+        if (x == null || y == null || x.length == 0 || y.length == 0 || x.length != y.length) {
+            return false;
+        }
+        float prevX = -1.0f;
+        for (int i = 0; i < x.length; i++) {
+            if (Float.isNaN(x[i]) || Float.isNaN(y[i]) || x[i] < 0 || prevX >= x[i]) {
+                return false;
+            }
+            prevX = x[i];
+        }
+        return true;
+    }
+
+    private boolean tooSoon(float value) {
+        final long time = System.currentTimeMillis();
+        final long earliestTime;
+        if (value > mLastValue) {
+            earliestTime = mLastTime + mIncreaseDebounce;
+        } else { // value <= mLastValue
+            earliestTime = mLastTime + mDecreaseDebounce;
+        }
+        final boolean tooSoon = time < earliestTime;
+        if (mLoggingEnabled) {
+            Slog.d(TAG, (tooSoon ? "too soon: " : "late enough: ") + time
+                    + (tooSoon ? " < " : " > ") + earliestTime);
+        }
+        return tooSoon;
+    }
+
+    private boolean tooClose(float value) {
+        final float threshold;
+        final boolean tooClose;
+        if (value > mLastValue) {
+            threshold = mIncreaseThreshold;
+            tooClose = value < threshold;
+        } else { // value <= mLastValue
+            threshold = mDecreaseThreshold;
+            tooClose = value > threshold;
+        }
+        if (mLoggingEnabled) {
+            Slog.d(TAG, (tooClose ? "too close: " : "far enough: ") + value
+                    + (value > threshold ? " > " : " < ") + threshold);
+        }
+        return tooClose;
+    }
+
+    private void computeThresholds(float value) {
+        final int index = getHighestIndexBefore(value, mBaseThresholds);
+        mIncreaseThreshold = value * (1.0f + mIncreaseThresholds[index]);
+        mDecreaseThreshold = value * (1.0f - mDecreaseThresholds[index]);
+    }
+
+    private int getHighestIndexBefore(float value, float[] values) {
+        for (int i = 0; i < values.length; i++) {
+            if (values[i] >= value) {
+                return i;
+            }
+        }
+        return values.length - 1;
+    }
+
+}
diff --git a/services/core/java/com/android/server/dreams/OWNERS b/services/core/java/com/android/server/dreams/OWNERS
index 3c9bbf8..426f002 100644
--- a/services/core/java/com/android/server/dreams/OWNERS
+++ b/services/core/java/com/android/server/dreams/OWNERS
@@ -1,3 +1,3 @@
-dsandler@google.com
+dsandler@android.com
 michaelwr@google.com
 roosa@google.com
diff --git a/services/core/java/com/android/server/gpu/GpuService.java b/services/core/java/com/android/server/gpu/GpuService.java
new file mode 100644
index 0000000..a68ceed
--- /dev/null
+++ b/services/core/java/com/android/server/gpu/GpuService.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.gpu;
+
+import static android.content.Intent.ACTION_PACKAGE_ADDED;
+import static android.content.Intent.ACTION_PACKAGE_CHANGED;
+import static android.content.Intent.ACTION_PACKAGE_REMOVED;
+
+import android.annotation.NonNull;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.os.Build;
+import android.os.SystemProperties;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.util.Slog;
+
+import com.android.server.SystemService;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+
+/**
+ * Service to manage GPU related features.
+ *
+ * <p>GPU service is a core service that monitors, coordinates all GPU related features,
+ * as well as collect metrics about the GPU and GPU driver.</p>
+ */
+public class GpuService extends SystemService {
+    public static final String TAG = "GpuService";
+    public static final boolean DEBUG = false;
+
+    private static final String PROPERTY_GFX_DRIVER = "ro.gfx.driver.0";
+    private static final String WHITELIST_FILENAME = "whitelist.txt";
+
+    private final Context mContext;
+    private final String mDriverPackageName;
+    private final PackageManager mPackageManager;
+
+    public GpuService(Context context) {
+        super(context);
+
+        mContext = context;
+        mDriverPackageName = SystemProperties.get(PROPERTY_GFX_DRIVER);
+        mPackageManager = context.getPackageManager();
+        if (mDriverPackageName != null && !mDriverPackageName.isEmpty()) {
+            final IntentFilter packageFilter = new IntentFilter();
+            packageFilter.addAction(ACTION_PACKAGE_ADDED);
+            packageFilter.addAction(ACTION_PACKAGE_CHANGED);
+            packageFilter.addAction(ACTION_PACKAGE_REMOVED);
+            packageFilter.addDataScheme("package");
+            getContext().registerReceiverAsUser(new PackageReceiver(), UserHandle.ALL,
+                                                packageFilter, null, null);
+        }
+    }
+
+    @Override
+    public void onStart() {
+    }
+
+    @Override
+    public void onBootPhase(int phase) {
+        if (phase == PHASE_BOOT_COMPLETED) {
+            if (mDriverPackageName == null || mDriverPackageName.isEmpty()) {
+                return;
+            }
+            fetchGameDriverPackageProperties();
+        }
+    }
+
+    private final class PackageReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(@NonNull final Context context, @NonNull final Intent intent) {
+            final Uri data = intent.getData();
+            if (data == null && DEBUG) {
+                Slog.e(TAG, "Cannot handle package broadcast with null data");
+                return;
+            }
+            final String packageName = data.getSchemeSpecificPart();
+            if (!packageName.equals(mDriverPackageName)) {
+                return;
+            }
+
+            final boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false);
+
+            switch (intent.getAction()) {
+                case ACTION_PACKAGE_ADDED:
+                case ACTION_PACKAGE_CHANGED:
+                case ACTION_PACKAGE_REMOVED:
+                    fetchGameDriverPackageProperties();
+                    break;
+                default:
+                    // do nothing
+                    break;
+            }
+        }
+    }
+
+    private void fetchGameDriverPackageProperties() {
+        final ApplicationInfo driverInfo;
+        try {
+            driverInfo = mPackageManager.getApplicationInfo(mDriverPackageName,
+                                                            PackageManager.MATCH_SYSTEM_ONLY);
+        } catch (PackageManager.NameNotFoundException e) {
+            if (DEBUG) {
+                Slog.e(TAG, "driver package '" + mDriverPackageName + "' not installed");
+            }
+            return;
+        }
+
+        // O drivers are restricted to the sphal linker namespace, so don't try to use
+        // packages unless they declare they're compatible with that restriction.
+        if (driverInfo.targetSdkVersion < Build.VERSION_CODES.O) {
+            if (DEBUG) {
+                Slog.w(TAG, "Driver package is not known to be compatible with O");
+            }
+            return;
+        }
+
+        try {
+            final Context driverContext = mContext.createPackageContext(mDriverPackageName,
+                                                                        Context.CONTEXT_RESTRICTED);
+            final BufferedReader reader = new BufferedReader(
+                    new InputStreamReader(driverContext.getAssets().open(WHITELIST_FILENAME)));
+            final ArrayList<String> whitelistedPackageNames = new ArrayList<>();
+            for (String packageName; (packageName = reader.readLine()) != null; ) {
+                whitelistedPackageNames.add(packageName);
+            }
+            Settings.Global.putString(mContext.getContentResolver(),
+                                      Settings.Global.GAME_DRIVER_WHITELIST,
+                                      String.join(",", whitelistedPackageNames));
+        } catch (PackageManager.NameNotFoundException e) {
+            if (DEBUG) {
+                Slog.w(TAG, "driver package '" + mDriverPackageName + "' not installed");
+            }
+        } catch (IOException e) {
+            if (DEBUG) {
+                Slog.w(TAG, "Failed to load whitelist driver package, abort.");
+            }
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/incident/IncidentCompanionService.java b/services/core/java/com/android/server/incident/IncidentCompanionService.java
new file mode 100644
index 0000000..6f2bfc3
--- /dev/null
+++ b/services/core/java/com/android/server/incident/IncidentCompanionService.java
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.incident;
+
+import android.content.Context;
+import android.os.Binder;
+import android.os.IIncidentAuthListener;
+import android.os.IIncidentCompanion;
+
+import com.android.internal.util.DumpUtils;
+import com.android.server.SystemService;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.util.List;
+
+/**
+ * Helper service for incidentd and dumpstated to provide user feedback
+ * and authorization for bug and inicdent reports to be taken.
+ */
+public class IncidentCompanionService extends SystemService {
+    static final String TAG = "IncidentCompanionService";
+
+    /**
+     * Tracker for reports pending approval.
+     */
+    private PendingReports mPendingReports;
+
+    /**
+     * Implementation of the IIncidentCompanion binder interface.
+     */
+    private final class BinderService extends IIncidentCompanion.Stub {
+        /**
+         * ONEWAY binder call to initiate authorizing the report.
+         */
+        @Override
+        public void authorizeReport(int callingUid, final String callingPackage, int flags,
+                final IIncidentAuthListener listener) {
+            enforceRequestAuthorizationPermission();
+
+            final long ident = Binder.clearCallingIdentity();
+            try {
+                mPendingReports.authorizeReport(callingUid, callingPackage, flags, listener);
+            } finally {
+                Binder.restoreCallingIdentity(ident);
+            }
+        }
+
+        /**
+         * ONEWAY binder call to cancel the inbound authorization request.
+         * <p>
+         * This is a oneway call, and so is authorizeReport, so the
+         * caller's ordering is preserved.  The other calls on this object are synchronous, so
+         * their ordering is not guaranteed with respect to these calls.  So the implementation
+         * sends out extra broadcasts to allow for eventual consistency.
+         */
+        public void cancelAuthorization(final IIncidentAuthListener listener) {
+            enforceRequestAuthorizationPermission();
+
+            // Caller can cancel if they don't want it anymore, and mRequestQueue elides
+            // authorize/cancel pairs.
+            final long ident = Binder.clearCallingIdentity();
+            try {
+                mPendingReports.cancelAuthorization(listener);
+            } finally {
+                Binder.restoreCallingIdentity(ident);
+            }
+        }
+
+        /**
+         * SYNCHRONOUS binder call to get the list of reports that are pending confirmation
+         * by the user.
+         */
+        @Override
+        public List<String> getPendingReports() {
+            enforceAuthorizePermission();
+            return mPendingReports.getPendingReports();
+        }
+
+        /**
+         * SYNCHRONOUS binder call to mark a report as approved.
+         */
+        @Override
+        public void approveReport(String uri) {
+            enforceAuthorizePermission();
+
+            final long ident = Binder.clearCallingIdentity();
+            try {
+                mPendingReports.approveReport(uri);
+            } finally {
+                Binder.restoreCallingIdentity(ident);
+            }
+        }
+
+        /**
+         * SYNCHRONOUS binder call to mark a report as NOT approved.
+         */
+        @Override
+        public void denyReport(String uri) {
+            enforceAuthorizePermission();
+
+            final long ident = Binder.clearCallingIdentity();
+            try {
+                mPendingReports.denyReport(uri);
+            } finally {
+                Binder.restoreCallingIdentity(ident);
+            }
+        }
+
+        /**
+         * Implementation of adb shell dumpsys debugreportcompanion.
+         */
+        @Override
+        protected void dump(FileDescriptor fd, final PrintWriter writer, String[] args) {
+            if (!DumpUtils.checkDumpPermission(getContext(), TAG, writer)) {
+                return;
+            }
+            mPendingReports.dump(fd, writer, args);
+        }
+
+        /**
+         * Inside the binder interface class because we want to do all of the authorization
+         * here, before calling out to the helper objects.
+         */
+        private void enforceRequestAuthorizationPermission() {
+            getContext().enforceCallingOrSelfPermission(
+                    android.Manifest.permission.REQUEST_INCIDENT_REPORT_APPROVAL, null);
+        }
+
+        /**
+         * Inside the binder interface class because we want to do all of the authorization
+         * here, before calling out to the helper objects.
+         */
+        private void enforceAuthorizePermission() {
+            getContext().enforceCallingOrSelfPermission(
+                    android.Manifest.permission.APPROVE_INCIDENT_REPORTS, null);
+        }
+
+    }
+
+    /**
+     * Construct new IncidentCompanionService with the context.
+     */
+    public IncidentCompanionService(Context context) {
+        super(context);
+        mPendingReports = new PendingReports(context);
+    }
+
+    /**
+     * Initialize the service.  It is still not safe to do UI until
+     * onBootPhase(SystemService.PHASE_BOOT_COMPLETED).
+     */
+    @Override
+    public void onStart() {
+        publishBinderService(Context.INCIDENT_COMPANION_SERVICE, new BinderService());
+    }
+
+    /**
+     * Handle the boot process... Starts everything running once the system is
+     * up enough for us to do UI.
+     */
+    @Override
+    public void onBootPhase(int phase) {
+        super.onBootPhase(phase);
+        switch (phase) {
+            case SystemService.PHASE_BOOT_COMPLETED:
+                mPendingReports.onBootCompleted();
+                break;
+        }
+    }
+}
+
diff --git a/services/core/java/com/android/server/incident/PendingReports.java b/services/core/java/com/android/server/incident/PendingReports.java
new file mode 100644
index 0000000..519ed41
--- /dev/null
+++ b/services/core/java/com/android/server/incident/PendingReports.java
@@ -0,0 +1,477 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.incident;
+
+import android.app.ActivityManager;
+import android.app.AppOpsManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.UserInfo;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.IIncidentAuthListener;
+import android.os.IncidentManager;
+import android.os.RemoteException;
+import android.os.SystemClock;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.util.Log;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+// TODO: User changes should deny everything that's pending.
+
+/**
+ * Tracker for reports pending approval.
+ */
+class PendingReports {
+    static final String TAG = IncidentCompanionService.TAG;
+
+    private final Handler mHandler = new Handler();
+    private final RequestQueue mRequestQueue = new RequestQueue(mHandler);
+    private final Context mContext;
+    private final PackageManager mPackageManager;
+    private final AppOpsManager mAppOpsManager;
+
+    //
+    // All fields below must be protected by mLock
+    //
+    private final Object mLock = new Object();
+    private final ArrayList<PendingReportRec> mPending = new ArrayList();
+
+    /**
+     * The next ID we'll use when we make a PendingReportRec.
+     */
+    private int mNextPendingId = 1;
+
+    /**
+     * One for each authorization that's pending.
+     */
+    private final class PendingReportRec {
+        public int id;
+        public String callingPackage;
+        public int flags;
+        public IIncidentAuthListener listener;
+        public long addedRealtime;
+        public long addedWalltime;
+
+        /**
+         * Construct a PendingReportRec, with an auto-incremented id.
+         */
+        PendingReportRec(String callingPackage, int flags, IIncidentAuthListener listener) {
+            this.id = mNextPendingId++;
+            this.callingPackage = callingPackage;
+            this.flags = flags;
+            this.listener = listener;
+            this.addedRealtime = SystemClock.elapsedRealtime();
+            this.addedWalltime = System.currentTimeMillis();
+        }
+
+        /**
+         * Get the Uri that contains the flattened data.
+         */
+        Uri getUri() {
+            return (new Uri.Builder())
+                    .scheme(IncidentManager.URI_SCHEME)
+                    .authority(IncidentManager.URI_AUTHORITY)
+                    .path(IncidentManager.URI_PATH)
+                    .appendQueryParameter(IncidentManager.URI_PARAM_ID, Integer.toString(id))
+                    .appendQueryParameter(IncidentManager.URI_PARAM_CALLING_PACKAGE, callingPackage)
+                    .appendQueryParameter(IncidentManager.URI_PARAM_FLAGS, Integer.toString(flags))
+                    .appendQueryParameter(IncidentManager.URI_PARAM_TIMESTAMP,
+                            Long.toString(addedWalltime))
+                    .build();
+        }
+    }
+
+    /**
+     * Construct new PendingReports with the context.
+     */
+    PendingReports(Context context) {
+        mContext = context;
+        mPackageManager = context.getPackageManager();
+        mAppOpsManager = context.getSystemService(AppOpsManager.class);
+    }
+
+    /**
+     * ONEWAY binder call to initiate authorizing the report.  The actual logic is posted
+     * to mRequestQueue, and may happen later.
+     * <p>
+     * The security checks are handled by IncidentCompanionService.
+     */
+    public void authorizeReport(int callingUid, final String callingPackage, final int flags,
+            final IIncidentAuthListener listener) {
+        // Starting the system server is complicated, and rather than try to
+        // have a complicated lifecycle that we share with dumpstated and incidentd,
+        // we will accept the request, and then display it whenever it becomes possible to.
+        mRequestQueue.enqueue(listener.asBinder(), true, () -> {
+            authorizeReportImpl(callingUid, callingPackage, flags, listener);
+        });
+    }
+
+    /**
+     * ONEWAY binder call to cancel the inbound authorization request.
+     * <p>
+     * This is a oneway call, and so is authorizeReport, so the
+     * caller's ordering is preserved.  The other calls on this object are synchronous, so
+     * their ordering is not guaranteed with respect to these calls.  So the implementation
+     * sends out extra broadcasts to allow for eventual consistency.
+     * <p>
+     * The security checks are handled by IncidentCompanionService.
+     */
+    public void cancelAuthorization(final IIncidentAuthListener listener) {
+        mRequestQueue.enqueue(listener.asBinder(), false, () -> {
+            cancelReportImpl(listener);
+        });
+    }
+
+    /**
+     * SYNCHRONOUS binder call to get the list of reports that are pending confirmation
+     * by the user.
+     * <p>
+     * The security checks are handled by IncidentCompanionService.
+     */
+    public List<String> getPendingReports() {
+        synchronized (mLock) {
+            final int size = mPending.size();
+            final ArrayList<String> result = new ArrayList(size);
+            for (int i = 0; i < size; i++) {
+                result.add(mPending.get(i).getUri().toString());
+            }
+            return result;
+        }
+    }
+
+    /**
+     * SYNCHRONOUS binder call to mark a report as approved.
+     * <p>
+     * The security checks are handled by IncidentCompanionService.
+     */
+    public void approveReport(String uri) {
+        final PendingReportRec rec;
+        synchronized (mLock) {
+            rec = findAndRemovePendingReportRecLocked(uri);
+            if (rec == null) {
+                Log.e(TAG, "confirmApproved: Couldn't find record for uri: " + uri);
+                return;
+            }
+        }
+
+        // Re-do the broadcast, so whoever is listening knows the list changed,
+        // in case another one was added in the meantime.
+        sendBroadcast();
+
+        Log.i(TAG, "Approved report: " + uri);
+        try {
+            rec.listener.onReportApproved();
+        } catch (RemoteException ex) {
+            Log.w(TAG, "Failed calling back for approval for: " + uri, ex);
+        }
+    }
+
+    /**
+     * SYNCHRONOUS binder call to mark a report as NOT approved.
+     */
+    public void denyReport(String uri) {
+        final PendingReportRec rec;
+        synchronized (mLock) {
+            rec = findAndRemovePendingReportRecLocked(uri);
+            if (rec == null) {
+                Log.e(TAG, "confirmDenied: Couldn't find record for uri: " + uri);
+                return;
+            }
+        }
+
+        // Re-do the broadcast, so whoever is listening knows the list changed,
+        // in case another one was added in the meantime.
+        sendBroadcast();
+
+        Log.i(TAG, "Denied report: " + uri);
+        try {
+            rec.listener.onReportDenied();
+        } catch (RemoteException ex) {
+            Log.w(TAG, "Failed calling back for denial for: " + uri, ex);
+        }
+    }
+
+    /**
+     * Implementation of adb shell dumpsys debugreportcompanion.
+     */
+    protected void dump(FileDescriptor fd, final PrintWriter writer, String[] args) {
+        if (args.length == 0) {
+            // Standard text dumpsys
+            final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
+            synchronized (mLock) {
+                final int size = mPending.size();
+                writer.println("mPending: (" + size + ")");
+                for (int i = 0; i < size; i++) {
+                    final PendingReportRec entry = mPending.get(i);
+                    writer.println(String.format("  %11d %s: %s", entry.addedRealtime,
+                                df.format(new Date(entry.addedWalltime)),
+                                entry.getUri().toString()));
+                }
+            }
+        }
+    }
+
+    /**
+     * Handle the boot process... Starts everything running once the system is
+     * up enough for us to do UI.
+     */
+    public void onBootCompleted() {
+        // Release the enqueued work.
+        mRequestQueue.start();
+    }
+
+    /**
+     * Start the confirmation process.
+     */
+    private void authorizeReportImpl(int callingUid, final String callingPackage, int flags,
+            final IIncidentAuthListener listener) {
+        // Enforce that the calling package pertains to the callingUid.
+        if (!isPackageInUid(callingUid, callingPackage)) {
+            Log.w(TAG, "Calling uid " + callingUid + " doesn't match package "
+                    + callingPackage);
+            denyReportBeforeAddingRec(listener, callingPackage);
+            return;
+        }
+
+        // Find the primary user of this device.
+        final int primaryUser = getAndValidateUser();
+        if (primaryUser == UserHandle.USER_NULL) {
+            denyReportBeforeAddingRec(listener, callingPackage);
+            return;
+        }
+
+        // Find the approver app (hint: it's PermissionController).
+        final ComponentName receiver = getApproverComponent(primaryUser);
+        if (receiver == null) {
+            // We couldn't find an approver... so deny the request here and now, before we
+            // do anything else.
+            denyReportBeforeAddingRec(listener, callingPackage);
+            return;
+        }
+
+        // Save the record for when the PermissionController comes back to authorize it.
+        PendingReportRec rec = null;
+        synchronized (mLock) {
+            rec = new PendingReportRec(callingPackage, flags, listener);
+            mPending.add(rec);
+        }
+
+        try {
+            listener.asBinder().linkToDeath(() -> {
+                Log.i(TAG, "Got death notification listener=" + listener);
+                cancelReportImpl(listener, receiver, primaryUser);
+            }, 0);
+        } catch (RemoteException ex) {
+            Log.e(TAG, "Remote died while trying to register death listener: " + rec.getUri());
+            // First, remove from our list.
+            cancelReportImpl(listener, receiver, primaryUser);
+        }
+
+        // Go tell Permission controller to start asking the user.
+        sendBroadcast(receiver, primaryUser);
+    }
+
+    /**
+     * Cancel a pending report request (because of an explicit call to cancel)
+     */
+    private void cancelReportImpl(IIncidentAuthListener listener) {
+        final int primaryUser = getAndValidateUser();
+        final ComponentName receiver = getApproverComponent(primaryUser);
+        if (primaryUser != UserHandle.USER_NULL && receiver != null) {
+            cancelReportImpl(listener, receiver, primaryUser);
+        }
+    }
+
+    /**
+     * Cancel a pending report request (either because of an explicit call to cancel
+     * by the calling app, or because of a binder death).
+     */
+    private void cancelReportImpl(IIncidentAuthListener listener, ComponentName receiver,
+            int primaryUser) {
+        // First, remove from our list.
+        synchronized (mLock) {
+            removePendingReportRecLocked(listener);
+        }
+        // Second, call back to PermissionController to say it's canceled.
+        sendBroadcast(receiver, primaryUser);
+    }
+
+    /**
+     * Send an extra copy of the broadcast, to tell them that the list has changed
+     * because of an addition or removal.  This function is less aggressive than
+     * authorizeReportImpl in logging about failures, because this is for use in
+     * cleanup cases to keep the apps' list in sync with ours.
+     */
+    private void sendBroadcast() {
+        final int primaryUser = getAndValidateUser();
+        if (primaryUser == UserHandle.USER_NULL) {
+            return;
+        }
+        final ComponentName receiver = getApproverComponent(primaryUser);
+        if (receiver == null) {
+            return;
+        }
+        sendBroadcast(receiver, primaryUser);
+    }
+
+    /**
+     * Send the confirmation broadcast.
+     */
+    private void sendBroadcast(ComponentName receiver, int primaryUser) {
+        final Intent intent = new Intent(Intent.ACTION_PENDING_INCIDENT_REPORTS_CHANGED);
+        intent.setComponent(receiver);
+
+        // Send it to the primary user.
+        mContext.sendBroadcastAsUser(intent, UserHandle.getUserHandleForUid(primaryUser),
+                android.Manifest.permission.APPROVE_INCIDENT_REPORTS);
+    }
+
+    /**
+     * Remove a PendingReportRec keyed by uri, and return it.
+     */
+    private PendingReportRec findAndRemovePendingReportRecLocked(String uriString) {
+        final Uri uri = Uri.parse(uriString);
+        final int id;
+        try {
+            final String idStr = uri.getQueryParameter(IncidentManager.URI_PARAM_ID);
+            id = Integer.parseInt(idStr);
+        } catch (NumberFormatException ex) {
+            Log.w(TAG, "Can't parse id from: " + uriString);
+            return null;
+        }
+        final int size = mPending.size();
+        for (int i = 0; i < size; i++) {
+            final PendingReportRec rec = mPending.get(i);
+            if (rec.id == id) {
+                mPending.remove(i);
+                return rec;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Remove a PendingReportRec keyed by listener.
+     */
+    private void removePendingReportRecLocked(IIncidentAuthListener listener) {
+        final int size = mPending.size();
+        for (int i = 0; i < size; i++) {
+            final PendingReportRec rec = mPending.get(i);
+            if (rec.listener.asBinder() == listener.asBinder()) {
+                Log.i(TAG, "  ...Removed PendingReportRec index=" + i + ": " + rec.getUri());
+                mPending.remove(i);
+            }
+        }
+    }
+
+    /**
+     * Just call listener.deny() (wrapping the RemoteException), without try to
+     * add it to the list.
+     */
+    private void denyReportBeforeAddingRec(IIncidentAuthListener listener, String pkg) {
+        try {
+            listener.onReportDenied();
+        } catch (RemoteException ex) {
+            Log.w(TAG, "Failed calling back for denial for " + pkg, ex);
+        }
+    }
+
+    /**
+     * Check whether the current user is the primary user, and return the user id if they are.
+     * Returns UserHandle.USER_NULL if not valid.
+     */
+    private int getAndValidateUser() {
+        // Current user
+        UserInfo currentUser;
+        try {
+            currentUser = ActivityManager.getService().getCurrentUser();
+        } catch (RemoteException ex) {
+            // We're already inside the system process.
+            throw new RuntimeException(ex);
+        }
+
+        // Primary user
+        final UserManager um = UserManager.get(mContext);
+        final UserInfo primaryUser = um.getPrimaryUser();
+
+        // Check that we're using the right user.
+        if (currentUser == null) {
+            Log.w(TAG, "No current user.  Nobody to approve the report."
+                    + " The report will be denied.");
+            return UserHandle.USER_NULL;
+        }
+        if (primaryUser == null) {
+            Log.w(TAG, "No primary user.  Nobody to approve the report."
+                    + " The report will be denied.");
+            return UserHandle.USER_NULL;
+        }
+        if (primaryUser.id != currentUser.id) {
+            Log.w(TAG, "Only the primary user can approve bugreports, but they are not"
+                    + " the current user. The report will be denied.");
+            return UserHandle.USER_NULL;
+        }
+
+        return primaryUser.id;
+    }
+
+    /**
+     * Return the ComponentName of the BroadcastReceiver that will approve reports.
+     * The system must have zero or one of these installed.  We only look on the
+     * system partition.  When the broadcast happens, the component will also need
+     * have the APPROVE_INCIDENT_REPORTS permission.
+     */
+    private ComponentName getApproverComponent(int userId) {
+        // Find the one true BroadcastReceiver
+        final Intent intent = new Intent(Intent.ACTION_PENDING_INCIDENT_REPORTS_CHANGED);
+        final List<ResolveInfo> matches = mPackageManager.queryBroadcastReceiversAsUser(intent,
+                PackageManager.MATCH_SYSTEM_ONLY | PackageManager.MATCH_DIRECT_BOOT_AWARE
+                | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, userId);
+        if (matches.size() == 1) {
+            return matches.get(0).getComponentInfo().getComponentName();
+        } else {
+            Log.w(TAG, "Didn't find exactly one BroadcastReceiver to handle "
+                    + Intent.ACTION_PENDING_INCIDENT_REPORTS_CHANGED
+                    + ". The report will be denied. size="
+                    + matches.size() + ": matches=" + matches);
+            return null;
+        }
+    }
+
+    /**
+     * Return whether the package is one of the packages installed for the uid.
+     */
+    private boolean isPackageInUid(int uid, String packageName) {
+        try {
+            mAppOpsManager.checkPackage(uid, packageName);
+            return true;
+        } catch (SecurityException ex) {
+            return false;
+        }
+    }
+}
+
diff --git a/services/core/java/com/android/server/incident/RequestQueue.java b/services/core/java/com/android/server/incident/RequestQueue.java
new file mode 100644
index 0000000..85758e2
--- /dev/null
+++ b/services/core/java/com/android/server/incident/RequestQueue.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package com.android.server.incident;
+
+import android.os.Handler;
+import android.os.IBinder;
+
+import java.util.ArrayList;
+
+/**
+ * Class to enqueue work until the system is ready.
+ */
+class RequestQueue {
+    /*
+     * All fields are protected by synchronized (mPending)
+     */
+
+    /**
+     * Requests that we can't start yet because system server isn't booted enough yet.
+     * Set to null when we have started.
+     */
+    private ArrayList<Rec> mPending = new ArrayList();
+
+    /**
+     * Where to run the requests.
+     */
+    private final Handler mHandler;
+
+    /**
+     * Whether someone has called start() yet.
+     */
+    private boolean mStarted;
+
+    /**
+     * Queue item.
+     */
+    private class Rec {
+        /**
+         * Key for the record.
+         */
+        public final IBinder key;
+
+        /**
+         * True / false pairs will be elided by enqueue().
+         */
+        public final boolean value;
+
+        /**
+         * The runnable to run.
+         */
+        public final Runnable runnable;
+
+        /**
+         * Constructor
+         */
+        Rec(IBinder key, boolean value, Runnable runnable) {
+            this.key = key;
+            this.value = value;
+            this.runnable = runnable;
+        }
+    }
+
+    /**
+     * Handler on the main thread.
+     */
+    private final Runnable mWorker = new Runnable() {
+        @Override
+        public void run() {
+            ArrayList<Rec> copy = null;
+            synchronized (mPending) {
+                if (mPending.size() > 0) {
+                    copy = new ArrayList<Rec>(mPending);
+                    mPending.clear();
+                }
+            }
+            if (copy != null) {
+                final int size = copy.size();
+                for (int i = 0; i < size; i++) {
+                    copy.get(i).runnable.run();
+                }
+            }
+        }
+    };
+
+    /**
+     * Construct RequestQueue.
+     *
+     * @param handler Handler to use.
+     */
+    RequestQueue(Handler handler) {
+        mHandler = handler;
+    }
+
+    /**
+     * We're now ready to go.  Start any previously pending runnables.
+     */
+    public void start() {
+        synchronized (mPending) {
+            if (!mStarted) {
+                if (mPending.size() > 0) {
+                    mHandler.post(mWorker);
+                }
+                mStarted = true;
+            }
+        }
+    }
+
+    /**
+     * If we can run this now, then do it on the Handler provided in the constructor.
+     * If not, then enqueue it until start is called.
+     *
+     * The queue will elide keys with pairs of true/false values, so the user doesn't
+     * see confirmations that were previously canceled.
+     */
+    public void enqueue(IBinder key, boolean value, Runnable runnable) {
+        synchronized (mPending) {
+            boolean skip = false;
+            if (!value) {
+                for (int i = mPending.size() - 1; i >= 0; i--) {
+                    final Rec r = mPending.get(i);
+                    if (r.key == key) {
+                        if (r.value) {
+                            skip = true;
+                            mPending.remove(i);
+                            break;
+                        }
+                    }
+                }
+            }
+            if (!skip) {
+                mPending.add(new Rec(key, value, runnable));
+            }
+            if (mStarted) {
+                // Already started. Post now.
+                mHandler.post(mWorker);
+            }
+        }
+    }
+}
+
diff --git a/services/core/java/com/android/server/infra/AbstractMasterSystemService.java b/services/core/java/com/android/server/infra/AbstractMasterSystemService.java
index 8e26097..532aa01 100644
--- a/services/core/java/com/android/server/infra/AbstractMasterSystemService.java
+++ b/services/core/java/com/android/server/infra/AbstractMasterSystemService.java
@@ -117,7 +117,7 @@
      */
     @GuardedBy("mLock")
     @Nullable
-    private final SparseBooleanArray mDisabledUsers;
+    private final SparseBooleanArray mDisabledByUserRestriction;
 
     /**
      * Cache of services per user id.
@@ -148,9 +148,9 @@
 
         }
         if (disallowProperty == null) {
-            mDisabledUsers = null;
+            mDisabledByUserRestriction = null;
         } else {
-            mDisabledUsers = new SparseBooleanArray();
+            mDisabledByUserRestriction = new SparseBooleanArray();
             // Hookup with UserManager to disable service when necessary.
             final UserManager um = context.getSystemService(UserManager.class);
             final UserManagerInternal umi = LocalServices.getService(UserManagerInternal.class);
@@ -159,15 +159,15 @@
                 final int userId = users.get(i).id;
                 final boolean disabled = umi.getUserRestriction(userId, disallowProperty);
                 if (disabled) {
-                    Slog.i(mTag, "Disabling for user " + userId);
-                    mDisabledUsers.put(userId, disabled);
+                    Slog.i(mTag, "Disabling by restrictions user " + userId);
+                    mDisabledByUserRestriction.put(userId, disabled);
                 }
             }
             umi.addUserRestrictionsListener((userId, newRestrictions, prevRestrictions) -> {
                 final boolean disabledNow =
                         newRestrictions.getBoolean(disallowProperty, false);
                 synchronized (mLock) {
-                    final boolean disabledBefore = mDisabledUsers.get(userId);
+                    final boolean disabledBefore = mDisabledByUserRestriction.get(userId);
                     if (disabledBefore == disabledNow) {
                         // Nothing changed, do nothing.
                         if (debug) {
@@ -176,7 +176,7 @@
                         }
                     }
                     Slog.i(mTag, "Updating for user " + userId + ": disabled=" + disabledNow);
-                    mDisabledUsers.put(userId, disabledNow);
+                    mDisabledByUserRestriction.put(userId, disabledNow);
                     updateCachedServiceLocked(userId, disabledNow);
                 }
             });
@@ -414,7 +414,7 @@
      * given user.
      */
     protected boolean isDisabledLocked(@UserIdInt int userId) {
-        return mDisabledUsers == null ? false : mDisabledUsers.get(userId);
+        return mDisabledByUserRestriction == null ? false : mDisabledByUserRestriction.get(userId);
     }
 
     /**
@@ -523,7 +523,8 @@
                     mServiceNameResolver.dumpShort(pw, userId); pw.println();
                 }
             }
-            pw.print(prefix); pw.print("Disabled users: "); pw.println(mDisabledUsers);
+            pw.print(prefix); pw.print("Users disabled by restriction: ");
+            pw.println(mDisabledByUserRestriction);
             pw.print(prefix); pw.print("Allow instant service: "); pw.println(mAllowInstantService);
             final String settingsProperty = getServiceSettingsProperty();
             if (settingsProperty != null) {
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java
index 669ff2b..5e7ea05 100644
--- a/services/core/java/com/android/server/input/InputManagerService.java
+++ b/services/core/java/com/android/server/input/InputManagerService.java
@@ -234,6 +234,7 @@
     private static native void nativeReloadPointerIcons(long ptr);
     private static native void nativeSetCustomPointerIcon(long ptr, PointerIcon icon);
     private static native void nativeSetPointerCapture(long ptr, boolean detached);
+    private static native boolean nativeCanDispatchToDisplay(long ptr, int deviceId, int displayId);
 
     // Input event injection constants defined in InputDispatcher.h.
     private static final int INPUT_EVENT_INJECTION_SUCCEEDED = 0;
@@ -1890,6 +1891,16 @@
         return new String[0];
     }
 
+    /**
+     * Gets if an input device could dispatch to the given display".
+     * @param deviceId The input device id.
+     * @param displayId The specific display id.
+     * @return True if the device could dispatch to the given display, false otherwise.
+     */
+    public boolean canDispatchToDisplay(int deviceId, int displayId) {
+        return nativeCanDispatchToDisplay(mPtr, deviceId, displayId);
+    }
+
     // Native callback.
     private int getKeyRepeatTimeout() {
         return ViewConfiguration.getKeyRepeatTimeout();
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index 99bed73..d20508a 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -17,9 +17,6 @@
 
 import static android.view.Display.DEFAULT_DISPLAY;
 import static android.view.Display.INVALID_DISPLAY;
-import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
-import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
-import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG;
 import static android.view.inputmethod.InputMethodSystemProperty.PER_PROFILE_IME_ENABLED;
 
 import static java.lang.annotation.RetentionPolicy.SOURCE;
@@ -110,7 +107,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.Window;
-import android.view.WindowManager;
+import android.view.WindowManager.LayoutParams;
 import android.view.WindowManager.LayoutParams.SoftInputModeFlags;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputBinding;
@@ -483,7 +480,7 @@
     IBinder mLastImeTargetWindow;
 
     /**
-     * {@link WindowManager.LayoutParams#softInputMode} of {@link #mCurFocusedWindow}.
+     * {@link LayoutParams#softInputMode} of {@link #mCurFocusedWindow}.
      *
      * @see #mCurFocusedWindow
      */
@@ -2042,7 +2039,8 @@
                     Slog.v(TAG, "Adding window token: " + mCurToken + " for display: "
                             + mCurTokenDisplayId);
                 }
-                mIWindowManager.addWindowToken(mCurToken, TYPE_INPUT_METHOD, mCurTokenDisplayId);
+                mIWindowManager.addWindowToken(mCurToken, LayoutParams.TYPE_INPUT_METHOD,
+                        mCurTokenDisplayId);
             } catch (RemoteException e) {
             }
             return new InputBindResult(
@@ -2757,9 +2755,34 @@
             Slog.e(TAG, "windowToken cannot be null.");
             return InputBindResult.NULL;
         }
-        final InputBindResult result = startInputOrWindowGainedFocusInternal(startInputReason,
-                client, windowToken, startInputFlags, softInputMode, windowFlags, attribute,
-                inputContext, missingMethods, unverifiedTargetSdkVersion);
+        final int callingUserId = UserHandle.getCallingUserId();
+        final int userId;
+        if (attribute != null && attribute.targetInputMethodUser != null
+                && attribute.targetInputMethodUser.getIdentifier() != callingUserId) {
+            mContext.enforceCallingPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL,
+                    "Using EditorInfo.targetInputMethodUser requires INTERACT_ACROSS_USERS_FULL.");
+            userId = attribute.targetInputMethodUser.getIdentifier();
+            if (!mUserManagerInternal.isUserRunning(userId)) {
+                // There is a chance that we hit here because of race condition.  Let's just return
+                // an error code instead of crashing the caller process, which at least has
+                // INTERACT_ACROSS_USERS_FULL permission thus is likely to be an important process.
+                Slog.e(TAG, "User #" + userId + " is not running.");
+                return InputBindResult.INVALID_USER;
+            }
+        } else {
+            userId = callingUserId;
+        }
+        final InputBindResult result;
+        synchronized (mMethodMap) {
+            final long ident = Binder.clearCallingIdentity();
+            try {
+                result = startInputOrWindowGainedFocusInternalLocked(startInputReason, client,
+                        windowToken, startInputFlags, softInputMode, windowFlags, attribute,
+                        inputContext, missingMethods, unverifiedTargetSdkVersion, userId);
+            } finally {
+                Binder.restoreCallingIdentity(ident);
+            }
+        }
         if (result == null) {
             // This must never happen, but just in case.
             Slog.wtf(TAG, "InputBindResult is @NonNull. startInputReason="
@@ -2772,242 +2795,212 @@
     }
 
     @NonNull
-    private InputBindResult startInputOrWindowGainedFocusInternal(
+    private InputBindResult startInputOrWindowGainedFocusInternalLocked(
             @StartInputReason int startInputReason, IInputMethodClient client,
             @NonNull IBinder windowToken, @StartInputFlags int startInputFlags,
             @SoftInputModeFlags int softInputMode, int windowFlags, EditorInfo attribute,
             IInputContext inputContext, @MissingMethodFlags int missingMethods,
-            int unverifiedTargetSdkVersion) {
-        final int callingUserId = UserHandle.getCallingUserId();
-        final int userId;
-        if (attribute != null && attribute.targetInputMethodUser != null
-                && attribute.targetInputMethodUser.getIdentifier() != callingUserId) {
-            mContext.enforceCallingPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL,
-                    "Using EditorInfo.user requires INTERACT_ACROSS_USERS_FULL.");
-            userId = attribute.targetInputMethodUser.getIdentifier();
-            if (!mUserManagerInternal.isUserRunning(userId)) {
-                // There is a chance that we hit here because of race condition.  Let's just return
-                // an error code instead of crashing the caller process, which at least has
-                // INTERACT_ACROSS_USERS_FULL permission thus is likely to be an important process.
-                Slog.e(TAG, "User #" + userId + " is not running.");
-                return InputBindResult.INVALID_USER;
-            }
-        } else {
-            userId = callingUserId;
+            int unverifiedTargetSdkVersion, @UserIdInt int userId) {
+        if (DEBUG) {
+            Slog.v(TAG, "startInputOrWindowGainedFocusInternalLocked: reason="
+                    + InputMethodDebug.startInputReasonToString(startInputReason)
+                    + " client=" + client.asBinder()
+                    + " inputContext=" + inputContext
+                    + " missingMethods="
+                    + InputConnectionInspector.getMissingMethodFlagsAsString(missingMethods)
+                    + " attribute=" + attribute
+                    + " startInputFlags="
+                    + InputMethodDebug.startInputFlagsToString(startInputFlags)
+                    + " softInputMode=" + InputMethodDebug.softInputModeToString(softInputMode)
+                    + " windowFlags=#" + Integer.toHexString(windowFlags)
+                    + " unverifiedTargetSdkVersion=" + unverifiedTargetSdkVersion);
         }
+
+        final int windowDisplayId = mWindowManagerInternal.getDisplayIdForWindow(windowToken);
+
+        final ClientState cs = mClients.get(client.asBinder());
+        if (cs == null) {
+            throw new IllegalArgumentException("unknown client " + client.asBinder());
+        }
+        if (cs.selfReportedDisplayId != windowDisplayId) {
+            Slog.e(TAG, "startInputOrWindowGainedFocusInternal: display ID mismatch."
+                    + " from client:" + cs.selfReportedDisplayId
+                    + " from window:" + windowDisplayId);
+            return InputBindResult.DISPLAY_ID_MISMATCH;
+        }
+
+        if (!mWindowManagerInternal.isInputMethodClientFocus(cs.uid, cs.pid,
+                cs.selfReportedDisplayId)) {
+            // Check with the window manager to make sure this client actually
+            // has a window with focus.  If not, reject.  This is thread safe
+            // because if the focus changes some time before or after, the
+            // next client receiving focus that has any interest in input will
+            // be calling through here after that change happens.
+            if (DEBUG) {
+                Slog.w(TAG, "Focus gain on non-focused client " + cs.client
+                        + " (uid=" + cs.uid + " pid=" + cs.pid + ")");
+            }
+            return InputBindResult.NOT_IME_TARGET_WINDOW;
+        }
+
+        // cross-profile access is always allowed here to allow profile-switching.
+        if (!mSettings.isCurrentProfile(userId)) {
+            Slog.w(TAG, "A background user is requesting window. Hiding IME.");
+            Slog.w(TAG, "If you need to impersonate a foreground user/profile from"
+                    + " a background user, use EditorInfo.targetInputMethodUser with"
+                    + " INTERACT_ACROSS_USERS_FULL permission.");
+            hideCurrentInputLocked(0, null);
+            return InputBindResult.INVALID_USER;
+        }
+
+        if (PER_PROFILE_IME_ENABLED && userId != mSettings.getCurrentUserId()) {
+            switchUserLocked(userId);
+        }
+        // Master feature flag that overrides other conditions and forces IME preRendering.
+        if (DEBUG) {
+            Slog.v(TAG, "IME PreRendering MASTER flag: "
+                    + DebugFlags.FLAG_PRE_RENDER_IME_VIEWS.value() + ", LowRam: " + mIsLowRam);
+        }
+        // pre-rendering not supported on low-ram devices.
+        cs.shouldPreRenderIme = DebugFlags.FLAG_PRE_RENDER_IME_VIEWS.value() && !mIsLowRam;
+
+        if (mCurFocusedWindow == windowToken) {
+            if (DEBUG) {
+                Slog.w(TAG, "Window already focused, ignoring focus gain of: " + client
+                        + " attribute=" + attribute + ", token = " + windowToken);
+            }
+            if (attribute != null) {
+                return startInputUncheckedLocked(cs, inputContext, missingMethods,
+                        attribute, startInputFlags, startInputReason);
+            }
+            return new InputBindResult(
+                    InputBindResult.ResultCode.SUCCESS_REPORT_WINDOW_FOCUS_ONLY,
+                    null, null, null, -1);
+        }
+        mCurFocusedWindow = windowToken;
+        mCurFocusedWindowSoftInputMode = softInputMode;
+        mCurFocusedWindowClient = cs;
+
+        // Should we auto-show the IME even if the caller has not
+        // specified what should be done with it?
+        // We only do this automatically if the window can resize
+        // to accommodate the IME (so what the user sees will give
+        // them good context without input information being obscured
+        // by the IME) or if running on a large screen where there
+        // is more room for the target window + IME.
+        final boolean doAutoShow =
+                (softInputMode & LayoutParams.SOFT_INPUT_MASK_ADJUST)
+                        == LayoutParams.SOFT_INPUT_ADJUST_RESIZE
+                || mRes.getConfiguration().isLayoutSizeAtLeast(
+                        Configuration.SCREENLAYOUT_SIZE_LARGE);
+        final boolean isTextEditor = (startInputFlags & StartInputFlags.IS_TEXT_EDITOR) != 0;
+
+        // We want to start input before showing the IME, but after closing
+        // it.  We want to do this after closing it to help the IME disappear
+        // more quickly (not get stuck behind it initializing itself for the
+        // new focused input, even if its window wants to hide the IME).
+        boolean didStart = false;
+
         InputBindResult res = null;
-        synchronized (mMethodMap) {
-            final int windowDisplayId =
-                    mWindowManagerInternal.getDisplayIdForWindow(windowToken);
-            final long ident = Binder.clearCallingIdentity();
-            try {
-                if (DEBUG) Slog.v(TAG, "startInputOrWindowGainedFocusInternal: reason="
-                        + InputMethodDebug.startInputReasonToString(startInputReason)
-                        + " client=" + client.asBinder()
-                        + " inputContext=" + inputContext
-                        + " missingMethods="
-                        + InputConnectionInspector.getMissingMethodFlagsAsString(missingMethods)
-                        + " attribute=" + attribute
-                        + " startInputFlags="
-                        + InputMethodDebug.startInputFlagsToString(startInputFlags)
-                        + " softInputMode=" + InputMethodDebug.softInputModeToString(softInputMode)
-                        + " windowFlags=#" + Integer.toHexString(windowFlags)
-                        + " unverifiedTargetSdkVersion=" + unverifiedTargetSdkVersion);
+        switch (softInputMode & LayoutParams.SOFT_INPUT_MASK_STATE) {
+            case LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED:
+                if (!isTextEditor || !doAutoShow) {
+                    if (LayoutParams.mayUseInputMethod(windowFlags)) {
+                        // There is no focus view, and this window will
+                        // be behind any soft input window, so hide the
+                        // soft input window if it is shown.
+                        if (DEBUG) Slog.v(TAG, "Unspecified window will hide input");
+                        hideCurrentInputLocked(InputMethodManager.HIDE_NOT_ALWAYS, null);
 
-                ClientState cs = mClients.get(client.asBinder());
-                if (cs == null) {
-                    throw new IllegalArgumentException("unknown client "
-                            + client.asBinder());
-                }
-                if (cs.selfReportedDisplayId != windowDisplayId) {
-                    Slog.e(TAG, "startInputOrWindowGainedFocusInternal: display ID mismatch."
-                            + " from client:" + cs.selfReportedDisplayId
-                            + " from window:" + windowDisplayId);
-                    return InputBindResult.DISPLAY_ID_MISMATCH;
-                }
-
-                if (!mWindowManagerInternal.isInputMethodClientFocus(cs.uid, cs.pid,
-                        cs.selfReportedDisplayId)) {
-                    // Check with the window manager to make sure this client actually
-                    // has a window with focus.  If not, reject.  This is thread safe
-                    // because if the focus changes some time before or after, the
-                    // next client receiving focus that has any interest in input will
-                    // be calling through here after that change happens.
-                    if (DEBUG) {
-                        Slog.w(TAG, "Focus gain on non-focused client " + cs.client
-                                + " (uid=" + cs.uid + " pid=" + cs.pid + ")");
+                        // If focused display changed, we should unbind current method
+                        // to make app window in previous display relayout after Ime
+                        // window token removed.
+                        // Note that we can trust client's display ID as long as it matches
+                        // to the display ID obtained from the window.
+                        if (cs.selfReportedDisplayId != mCurTokenDisplayId) {
+                            unbindCurrentMethodLocked();
+                        }
                     }
-                    return InputBindResult.NOT_IME_TARGET_WINDOW;
-                }
-
-                // cross-profile access is always allowed here to allow profile-switching.
-                if (!mSettings.isCurrentProfile(userId)) {
-                    Slog.w(TAG, "A background user is requesting window. Hiding IME.");
-                    Slog.w(TAG, "If you need to impersonate a foreground user/profile from"
-                            + " a background user, use EditorInfo.targetInputMethodUser with"
-                            + " INTERACT_ACROSS_USERS_FULL permission.");
-                    hideCurrentInputLocked(0, null);
-                    return InputBindResult.INVALID_USER;
-                }
-
-                if (PER_PROFILE_IME_ENABLED && userId != mSettings.getCurrentUserId()) {
-                    switchUserLocked(userId);
-                }
-                // Master feature flag that overrides other conditions and forces IME preRendering.
-                if (DEBUG) {
-                    Slog.v(TAG, "IME PreRendering MASTER flag: "
-                            + DebugFlags.FLAG_PRE_RENDER_IME_VIEWS.value()
-                            + ", LowRam: " + mIsLowRam);
-                }
-                // pre-rendering not supported on low-ram devices.
-                cs.shouldPreRenderIme = DebugFlags.FLAG_PRE_RENDER_IME_VIEWS.value() && !mIsLowRam;
-
-                if (mCurFocusedWindow == windowToken) {
-                    if (DEBUG) {
-                        Slog.w(TAG, "Window already focused, ignoring focus gain of: " + client
-                                + " attribute=" + attribute + ", token = " + windowToken);
-                    }
+                } else if (isTextEditor && doAutoShow
+                        && (softInputMode & LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) != 0) {
+                    // There is a focus view, and we are navigating forward
+                    // into the window, so show the input window for the user.
+                    // We only do this automatically if the window can resize
+                    // to accommodate the IME (so what the user sees will give
+                    // them good context without input information being obscured
+                    // by the IME) or if running on a large screen where there
+                    // is more room for the target window + IME.
+                    if (DEBUG) Slog.v(TAG, "Unspecified window will show input");
                     if (attribute != null) {
-                        return startInputUncheckedLocked(cs, inputContext, missingMethods,
+                        res = startInputUncheckedLocked(cs, inputContext, missingMethods,
                                 attribute, startInputFlags, startInputReason);
+                        didStart = true;
                     }
-                    return new InputBindResult(
-                            InputBindResult.ResultCode.SUCCESS_REPORT_WINDOW_FOCUS_ONLY,
-                            null, null, null, -1);
+                    showCurrentInputLocked(InputMethodManager.SHOW_IMPLICIT, null);
                 }
-                mCurFocusedWindow = windowToken;
-                mCurFocusedWindowSoftInputMode = softInputMode;
-                mCurFocusedWindowClient = cs;
-
-                // Should we auto-show the IME even if the caller has not
-                // specified what should be done with it?
-                // We only do this automatically if the window can resize
-                // to accommodate the IME (so what the user sees will give
-                // them good context without input information being obscured
-                // by the IME) or if running on a large screen where there
-                // is more room for the target window + IME.
-                final boolean doAutoShow =
-                        (softInputMode & WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST)
-                                == WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE
-                        || mRes.getConfiguration().isLayoutSizeAtLeast(
-                                Configuration.SCREENLAYOUT_SIZE_LARGE);
-                final boolean isTextEditor =
-                        (startInputFlags & StartInputFlags.IS_TEXT_EDITOR) != 0;
-
-                // We want to start input before showing the IME, but after closing
-                // it.  We want to do this after closing it to help the IME disappear
-                // more quickly (not get stuck behind it initializing itself for the
-                // new focused input, even if its window wants to hide the IME).
-                boolean didStart = false;
-
-                switch (softInputMode&WindowManager.LayoutParams.SOFT_INPUT_MASK_STATE) {
-                    case WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED:
-                        if (!isTextEditor || !doAutoShow) {
-                            if (WindowManager.LayoutParams.mayUseInputMethod(windowFlags)) {
-                                // There is no focus view, and this window will
-                                // be behind any soft input window, so hide the
-                                // soft input window if it is shown.
-                                if (DEBUG) Slog.v(TAG, "Unspecified window will hide input");
-                                hideCurrentInputLocked(InputMethodManager.HIDE_NOT_ALWAYS, null);
-
-                                // If focused display changed, we should unbind current method
-                                // to make app window in previous display relayout after Ime
-                                // window token removed.
-                                // Note that we can trust client's display ID as long as it matches
-                                // to the display ID obtained from the window.
-                                if (cs.selfReportedDisplayId != mCurTokenDisplayId) {
-                                    unbindCurrentMethodLocked();
-                                }
-                            }
-                        } else if (isTextEditor && doAutoShow && (softInputMode &
-                                WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) != 0) {
-                            // There is a focus view, and we are navigating forward
-                            // into the window, so show the input window for the user.
-                            // We only do this automatically if the window can resize
-                            // to accommodate the IME (so what the user sees will give
-                            // them good context without input information being obscured
-                            // by the IME) or if running on a large screen where there
-                            // is more room for the target window + IME.
-                            if (DEBUG) Slog.v(TAG, "Unspecified window will show input");
-                            if (attribute != null) {
-                                res = startInputUncheckedLocked(cs, inputContext, missingMethods,
-                                        attribute, startInputFlags, startInputReason);
-                                didStart = true;
-                            }
-                            showCurrentInputLocked(InputMethodManager.SHOW_IMPLICIT, null);
-                        }
-                        break;
-                    case WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED:
-                        // Do nothing.
-                        break;
-                    case WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN:
-                        if ((softInputMode &
-                                WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) != 0) {
-                            if (DEBUG) Slog.v(TAG, "Window asks to hide input going forward");
-                            hideCurrentInputLocked(0, null);
-                        }
-                        break;
-                    case WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN:
-                        if (DEBUG) Slog.v(TAG, "Window asks to hide input");
-                        hideCurrentInputLocked(0, null);
-                        break;
-                    case WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE:
-                        if ((softInputMode &
-                                WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) != 0) {
-                            if (DEBUG) Slog.v(TAG, "Window asks to show input going forward");
-                            if (InputMethodUtils.isSoftInputModeStateVisibleAllowed(
-                                    unverifiedTargetSdkVersion, startInputFlags)) {
-                                if (attribute != null) {
-                                    res = startInputUncheckedLocked(cs, inputContext,
-                                            missingMethods, attribute, startInputFlags,
-                                            startInputReason);
-                                    didStart = true;
-                                }
-                                showCurrentInputLocked(InputMethodManager.SHOW_IMPLICIT, null);
-                            } else {
-                                Slog.e(TAG, "SOFT_INPUT_STATE_VISIBLE is ignored because"
-                                        + " there is no focused view that also returns true from"
-                                        + " View#onCheckIsTextEditor()");
-                            }
-                        }
-                        break;
-                    case WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE:
-                        if (DEBUG) Slog.v(TAG, "Window asks to always show input");
-                        if (InputMethodUtils.isSoftInputModeStateVisibleAllowed(
-                                unverifiedTargetSdkVersion, startInputFlags)) {
-                            if (attribute != null) {
-                                res = startInputUncheckedLocked(cs, inputContext, missingMethods,
-                                        attribute, startInputFlags, startInputReason);
-                                didStart = true;
-                            }
-                            showCurrentInputLocked(InputMethodManager.SHOW_IMPLICIT, null);
-                        } else {
-                            Slog.e(TAG, "SOFT_INPUT_STATE_ALWAYS_VISIBLE is ignored because"
-                                    + " there is no focused view that also returns true from"
-                                    + " View#onCheckIsTextEditor()");
-                        }
-                        break;
+                break;
+            case LayoutParams.SOFT_INPUT_STATE_UNCHANGED:
+                // Do nothing.
+                break;
+            case LayoutParams.SOFT_INPUT_STATE_HIDDEN:
+                if ((softInputMode & LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) != 0) {
+                    if (DEBUG) Slog.v(TAG, "Window asks to hide input going forward");
+                    hideCurrentInputLocked(0, null);
                 }
-
-                if (!didStart) {
-                    if (attribute != null) {
-                        if (!DebugFlags.FLAG_OPTIMIZE_START_INPUT.value()
-                                || (startInputFlags & StartInputFlags.IS_TEXT_EDITOR) != 0) {
+                break;
+            case LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN:
+                if (DEBUG) Slog.v(TAG, "Window asks to hide input");
+                hideCurrentInputLocked(0, null);
+                break;
+            case LayoutParams.SOFT_INPUT_STATE_VISIBLE:
+                if ((softInputMode & LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) != 0) {
+                    if (DEBUG) Slog.v(TAG, "Window asks to show input going forward");
+                    if (InputMethodUtils.isSoftInputModeStateVisibleAllowed(
+                            unverifiedTargetSdkVersion, startInputFlags)) {
+                        if (attribute != null) {
                             res = startInputUncheckedLocked(cs, inputContext, missingMethods,
-                                    attribute,
-                                    startInputFlags, startInputReason);
-                        } else {
-                            res = InputBindResult.NO_EDITOR;
+                                    attribute, startInputFlags, startInputReason);
+                            didStart = true;
                         }
+                        showCurrentInputLocked(InputMethodManager.SHOW_IMPLICIT, null);
                     } else {
-                        res = InputBindResult.NULL_EDITOR_INFO;
+                        Slog.e(TAG, "SOFT_INPUT_STATE_VISIBLE is ignored because"
+                                + " there is no focused view that also returns true from"
+                                + " View#onCheckIsTextEditor()");
                     }
                 }
-            } finally {
-                Binder.restoreCallingIdentity(ident);
-            }
+                break;
+            case LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE:
+                if (DEBUG) Slog.v(TAG, "Window asks to always show input");
+                if (InputMethodUtils.isSoftInputModeStateVisibleAllowed(
+                        unverifiedTargetSdkVersion, startInputFlags)) {
+                    if (attribute != null) {
+                        res = startInputUncheckedLocked(cs, inputContext, missingMethods,
+                                attribute, startInputFlags, startInputReason);
+                        didStart = true;
+                    }
+                    showCurrentInputLocked(InputMethodManager.SHOW_IMPLICIT, null);
+                } else {
+                    Slog.e(TAG, "SOFT_INPUT_STATE_ALWAYS_VISIBLE is ignored because"
+                            + " there is no focused view that also returns true from"
+                            + " View#onCheckIsTextEditor()");
+                }
+                break;
         }
 
+        if (!didStart) {
+            if (attribute != null) {
+                if (!DebugFlags.FLAG_OPTIMIZE_START_INPUT.value()
+                        || (startInputFlags & StartInputFlags.IS_TEXT_EDITOR) != 0) {
+                    res = startInputUncheckedLocked(cs, inputContext, missingMethods, attribute,
+                            startInputFlags, startInputReason);
+                } else {
+                    res = InputBindResult.NO_EDITOR;
+                }
+            } else {
+                res = InputBindResult.NULL_EDITOR_INFO;
+            }
+        }
         return res;
     }
 
@@ -3975,13 +3968,13 @@
             mSwitchingDialog = mDialogBuilder.create();
             mSwitchingDialog.setCanceledOnTouchOutside(true);
             final Window w = mSwitchingDialog.getWindow();
-            final WindowManager.LayoutParams attrs = w.getAttributes();
-            w.setType(TYPE_INPUT_METHOD_DIALOG);
+            final LayoutParams attrs = w.getAttributes();
+            w.setType(LayoutParams.TYPE_INPUT_METHOD_DIALOG);
             // Use an alternate token for the dialog for that window manager can group the token
             // with other IME windows based on type vs. grouping based on whichever token happens
             // to get selected by the system later on.
             attrs.token = mSwitchingDialogToken;
-            attrs.privateFlags |= PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
+            attrs.privateFlags |= LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
             attrs.setTitle("Select input method");
             w.setAttributes(attrs);
             updateSystemUiLocked(mImeWindowVis, mBackDisposition);
diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java
index 7625aaf..cefe583 100644
--- a/services/core/java/com/android/server/job/JobSchedulerService.java
+++ b/services/core/java/com/android/server/job/JobSchedulerService.java
@@ -508,8 +508,8 @@
         private static final int DEFAULT_STANDBY_RARE_BEATS = 130; // ~ 24 hours
         private static final float DEFAULT_CONN_CONGESTION_DELAY_FRAC = 0.5f;
         private static final float DEFAULT_CONN_PREFETCH_RELAX_FRAC = 0.5f;
-        private static final boolean DEFAULT_USE_HEARTBEATS = true;
-        private static final boolean DEFAULT_TIME_CONTROLLER_SKIP_NOT_READY_JOBS = false;
+        private static final boolean DEFAULT_USE_HEARTBEATS = false;
+        private static final boolean DEFAULT_TIME_CONTROLLER_SKIP_NOT_READY_JOBS = true;
         private static final long DEFAULT_QUOTA_CONTROLLER_ALLOWED_TIME_PER_PERIOD_MS =
                 10 * 60 * 1000L; // 10 minutes
         private static final long DEFAULT_QUOTA_CONTROLLER_IN_QUOTA_BUFFER_MS =
@@ -810,6 +810,8 @@
             MAX_JOB_COUNTS_SCREEN_OFF.low.parse(mParser);
             MAX_JOB_COUNTS_SCREEN_OFF.critical.parse(mParser);
 
+            SCREEN_OFF_JOB_CONCURRENCY_INCREASE_DELAY_MS.parse(mParser);
+
             MAX_STANDARD_RESCHEDULE_COUNT = mParser.getInt(KEY_MAX_STANDARD_RESCHEDULE_COUNT,
                     DEFAULT_MAX_STANDARD_RESCHEDULE_COUNT);
             MAX_WORK_RESCHEDULE_COUNT = mParser.getInt(KEY_MAX_WORK_RESCHEDULE_COUNT,
@@ -2040,6 +2042,7 @@
                         if (DEBUG) {
                             Slog.d(TAG, "MSG_CHECK_JOB");
                         }
+                        removeMessages(MSG_CHECK_JOB);
                         if (mReportedActive) {
                             // if jobs are currently being run, queue all ready jobs for execution.
                             queueReadyJobsForExecutionLocked();
@@ -2099,7 +2102,6 @@
                 }
                 maybeRunPendingJobsLocked();
                 // Don't remove JOB_EXPIRED in case one came along while processing the queue.
-                removeMessages(MSG_CHECK_JOB);
             }
         }
     }
diff --git a/services/core/java/com/android/server/job/controllers/JobStatus.java b/services/core/java/com/android/server/job/controllers/JobStatus.java
index ed1a6d0..06db8b8 100644
--- a/services/core/java/com/android/server/job/controllers/JobStatus.java
+++ b/services/core/java/com/android/server/job/controllers/JobStatus.java
@@ -78,9 +78,9 @@
     static final int CONSTRAINT_DEADLINE = 1<<30;
     static final int CONSTRAINT_CONNECTIVITY = 1<<28;
     static final int CONSTRAINT_CONTENT_TRIGGER = 1<<26;
-    static final int CONSTRAINT_DEVICE_NOT_DOZING = 1<<25;
-    static final int CONSTRAINT_WITHIN_QUOTA = 1 << 24;
-    static final int CONSTRAINT_BACKGROUND_NOT_RESTRICTED = 1<<22;
+    static final int CONSTRAINT_DEVICE_NOT_DOZING = 1 << 25; // Implicit constraint
+    static final int CONSTRAINT_WITHIN_QUOTA = 1 << 24;      // Implicit constraint
+    static final int CONSTRAINT_BACKGROUND_NOT_RESTRICTED = 1 << 22; // Implicit constraint
 
     /**
      * The constraints that we want to log to statsd.
@@ -1044,8 +1044,48 @@
      * @return Whether or not this job would be ready to run if it had the specified constraint
      * granted, based on its requirements.
      */
-    public boolean wouldBeReadyWithConstraint(int constraint) {
-        return isReady(mSatisfiedConstraintsOfInterest | constraint);
+    boolean wouldBeReadyWithConstraint(int constraint) {
+        boolean oldValue = false;
+        int satisfied = mSatisfiedConstraintsOfInterest;
+        switch (constraint) {
+            case CONSTRAINT_BACKGROUND_NOT_RESTRICTED:
+                oldValue = mReadyNotRestrictedInBg;
+                mReadyNotRestrictedInBg = true;
+                break;
+            case CONSTRAINT_DEADLINE:
+                oldValue = mReadyDeadlineSatisfied;
+                mReadyDeadlineSatisfied = true;
+                break;
+            case CONSTRAINT_DEVICE_NOT_DOZING:
+                oldValue = mReadyNotDozing;
+                mReadyNotDozing = true;
+                break;
+            case CONSTRAINT_WITHIN_QUOTA:
+                oldValue = mReadyWithinQuota;
+                mReadyWithinQuota = true;
+                break;
+            default:
+                satisfied |= constraint;
+                break;
+        }
+
+        boolean toReturn = isReady(satisfied);
+
+        switch (constraint) {
+            case CONSTRAINT_BACKGROUND_NOT_RESTRICTED:
+                mReadyNotRestrictedInBg = oldValue;
+                break;
+            case CONSTRAINT_DEADLINE:
+                mReadyDeadlineSatisfied = oldValue;
+                break;
+            case CONSTRAINT_DEVICE_NOT_DOZING:
+                mReadyNotDozing = oldValue;
+                break;
+            case CONSTRAINT_WITHIN_QUOTA:
+                mReadyWithinQuota = oldValue;
+                break;
+        }
+        return toReturn;
     }
 
     private boolean isReady(int satisfiedConstraints) {
diff --git a/services/core/java/com/android/server/location/ActivityRecognitionProxy.java b/services/core/java/com/android/server/location/ActivityRecognitionProxy.java
index 22fabb2..80ab790 100644
--- a/services/core/java/com/android/server/location/ActivityRecognitionProxy.java
+++ b/services/core/java/com/android/server/location/ActivityRecognitionProxy.java
@@ -24,7 +24,7 @@
 import android.os.RemoteException;
 import android.util.Log;
 
-import com.android.internal.os.BackgroundThread;
+import com.android.server.FgThread;
 import com.android.server.ServiceWatcher;
 
 /**
@@ -84,7 +84,7 @@
                 overlaySwitchResId,
                 defaultServicePackageNameResId,
                 initialPackageNameResId,
-                BackgroundThread.getHandler()) {
+                FgThread.getHandler()) {
             @Override
             protected void onBind() {
                 runOnBinder(ActivityRecognitionProxy.this::initializeService);
diff --git a/services/core/java/com/android/server/location/GeocoderProxy.java b/services/core/java/com/android/server/location/GeocoderProxy.java
index e6f0ed9..d9602b8 100644
--- a/services/core/java/com/android/server/location/GeocoderProxy.java
+++ b/services/core/java/com/android/server/location/GeocoderProxy.java
@@ -21,7 +21,7 @@
 import android.location.GeocoderParams;
 import android.location.IGeocodeProvider;
 
-import com.android.internal.os.BackgroundThread;
+import com.android.server.FgThread;
 import com.android.server.ServiceWatcher;
 
 import java.util.List;
@@ -53,7 +53,7 @@
             int initialPackageNamesResId) {
         mServiceWatcher = new ServiceWatcher(context, TAG, SERVICE_ACTION, overlaySwitchResId,
                 defaultServicePackageNameResId, initialPackageNamesResId,
-                BackgroundThread.getHandler());
+                FgThread.getHandler());
     }
 
     private boolean bind() {
diff --git a/services/core/java/com/android/server/location/GeofenceProxy.java b/services/core/java/com/android/server/location/GeofenceProxy.java
index 38c7d49..ce93661 100644
--- a/services/core/java/com/android/server/location/GeofenceProxy.java
+++ b/services/core/java/com/android/server/location/GeofenceProxy.java
@@ -30,7 +30,7 @@
 import android.os.UserHandle;
 import android.util.Log;
 
-import com.android.internal.os.BackgroundThread;
+import com.android.server.FgThread;
 import com.android.server.ServiceWatcher;
 
 /**
@@ -82,7 +82,7 @@
         mContext = context;
         mServiceWatcher = new ServiceWatcher(context, TAG, SERVICE_ACTION, overlaySwitchResId,
                 defaultServicePackageNameResId, initialPackageNamesResId,
-                BackgroundThread.getHandler()) {
+                FgThread.getHandler()) {
             @Override
             protected void onBind() {
                 runOnBinder(mUpdateGeofenceHardware);
diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java
index d346ddc..ab9f711 100644
--- a/services/core/java/com/android/server/location/GnssLocationProvider.java
+++ b/services/core/java/com/android/server/location/GnssLocationProvider.java
@@ -332,9 +332,6 @@
     // true if we started navigation
     private boolean mStarted;
 
-    // true if single shot request is in progress
-    private boolean mSingleShot;
-
     // capabilities of the GPS engine
     private int mEngineCapabilities;
 
@@ -455,7 +452,7 @@
 
             switch (action) {
                 case ALARM_WAKEUP:
-                    startNavigating(false);
+                    startNavigating();
                     break;
                 case ALARM_TIMEOUT:
                     hibernate();
@@ -852,10 +849,9 @@
      * allowed mode from properties.
      *
      * @param agpsEnabled whether AGPS is enabled by settings value
-     * @param singleShot  whether "singleshot" is needed
      * @return SUPL mode (MSA vs MSB vs STANDALONE)
      */
-    private int getSuplMode(boolean agpsEnabled, boolean singleShot) {
+    private int getSuplMode(boolean agpsEnabled) {
         if (agpsEnabled) {
             int suplMode = mGnssConfiguration.getSuplMode(0);
             if (suplMode == 0) {
@@ -867,14 +863,6 @@
             if (hasCapability(GPS_CAPABILITY_MSB) && (suplMode & AGPS_SUPL_MODE_MSB) != 0) {
                 return GPS_POSITION_MODE_MS_BASED;
             }
-            // for now, just as the legacy code did, we fallback to MS-Assisted if it is available,
-            // do fallback only for single-shot requests, because it is too expensive to do for
-            // periodic requests as well
-            if (singleShot
-                    && hasCapability(GPS_CAPABILITY_MSA)
-                    && (suplMode & AGPS_SUPL_MODE_MSA) != 0) {
-                return GPS_POSITION_MODE_MS_ASSISTED;
-            }
         }
         return GPS_POSITION_MODE_STANDALONE;
     }
@@ -965,22 +953,6 @@
             return;
         }
 
-        boolean singleShot = false;
-
-        // see if the request is for a single update
-        if (mProviderRequest.locationRequests != null
-                && mProviderRequest.locationRequests.size() > 0) {
-            // if any request has zero or more than one updates
-            // requested, then this is not single-shot mode
-            singleShot = true;
-
-            for (LocationRequest lr : mProviderRequest.locationRequests) {
-                if (lr.getNumUpdates() != 1) {
-                    singleShot = false;
-                }
-            }
-        }
-
         if (DEBUG) Log.d(TAG, "setRequest " + mProviderRequest);
         if (mProviderRequest.reportLocation && !mDisableGps && isEnabled()) {
             // update client uids
@@ -1003,7 +975,7 @@
                 }
             } else if (!mStarted) {
                 // start GPS
-                startNavigating(singleShot);
+                startNavigating();
             } else {
                 // GNSS Engine is already ON, but no GPS_CAPABILITY_SCHEDULING
                 mAlarmManager.cancel(mTimeoutIntent);
@@ -1148,13 +1120,12 @@
         }
     }
 
-    private void startNavigating(boolean singleShot) {
+    private void startNavigating() {
         if (!mStarted) {
-            if (DEBUG) Log.d(TAG, "startNavigating, singleShot is " + singleShot);
+            if (DEBUG) Log.d(TAG, "startNavigating");
             mTimeToFirstFix = 0;
             mLastFixTime = 0;
             mStarted = true;
-            mSingleShot = singleShot;
             mPositionMode = GPS_POSITION_MODE_STANDALONE;
             // Notify about suppressed output, if speed limit was previously exceeded.
             // Elsewhere, we check again with every speed output reported.
@@ -1166,7 +1137,7 @@
             boolean agpsEnabled =
                     (Settings.Global.getInt(mContext.getContentResolver(),
                             Settings.Global.ASSISTED_GPS_ENABLED, 1) != 0);
-            mPositionMode = getSuplMode(agpsEnabled, singleShot);
+            mPositionMode = getSuplMode(agpsEnabled);
 
             if (DEBUG) {
                 String mode;
@@ -1221,7 +1192,6 @@
         if (DEBUG) Log.d(TAG, "stopNavigating");
         if (mStarted) {
             mStarted = false;
-            mSingleShot = false;
             native_stop();
             mLastFixTime = 0;
             // native_stop() may reset the position mode in hardware.
@@ -1300,10 +1270,6 @@
             mGnssStatusListenerHelper.onFirstFix(mTimeToFirstFix);
         }
 
-        if (mSingleShot) {
-            stopNavigating();
-        }
-
         if (mStarted && mStatus != LocationProvider.AVAILABLE) {
             // For devices that use framework scheduling, a timer may be set to ensure we don't
             // spend too much power searching for a location, when the requested update rate is
diff --git a/services/core/java/com/android/server/location/GnssNetworkConnectivityHandler.java b/services/core/java/com/android/server/location/GnssNetworkConnectivityHandler.java
index c38373f..90d16cb 100644
--- a/services/core/java/com/android/server/location/GnssNetworkConnectivityHandler.java
+++ b/services/core/java/com/android/server/location/GnssNetworkConnectivityHandler.java
@@ -34,7 +34,6 @@
 import java.net.UnknownHostException;
 import java.util.Arrays;
 import java.util.HashMap;
-import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * Handles network connection requests and network state change updates for AGPS data download.
@@ -80,10 +79,11 @@
 
     private static final int HASH_MAP_INITIAL_CAPACITY_TO_TRACK_CONNECTED_NETWORKS = 5;
 
-    // keeps track of networks and their state as notified by the network request callbacks.
+    // Keeps track of networks and their state as notified by the network request callbacks.
     // Limit initial capacity to 5 as the number of connected networks will likely be small.
-    private ConcurrentHashMap<Network, NetworkAttributes> mAvailableNetworkAttributes =
-            new ConcurrentHashMap<>(HASH_MAP_INITIAL_CAPACITY_TO_TRACK_CONNECTED_NETWORKS);
+    // NOTE: Must be accessed/modified only through the mHandler thread.
+    private HashMap<Network, NetworkAttributes> mAvailableNetworkAttributes =
+            new HashMap<>(HASH_MAP_INITIAL_CAPACITY_TO_TRACK_CONNECTED_NETWORKS);
 
     private final ConnectivityManager mConnMgr;
 
@@ -159,7 +159,7 @@
     /**
      * Interface to listen for network availability changes.
      */
-    public interface GnssNetworkListener {
+    interface GnssNetworkListener {
         void onNetworkAvailable();
     }
 
@@ -177,12 +177,7 @@
         mSuplConnectivityCallback = createSuplConnectivityCallback();
     }
 
-    public void registerNetworkCallbacks() {
-        mAvailableNetworkAttributes.clear();
-        if (mNetworkConnectivityCallback != null) {
-            mConnMgr.unregisterNetworkCallback(mNetworkConnectivityCallback);
-        }
-
+    void registerNetworkCallbacks() {
         // register for connectivity change events.
         NetworkRequest.Builder networkRequestBuilder = new NetworkRequest.Builder();
         networkRequestBuilder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
@@ -190,14 +185,14 @@
         networkRequestBuilder.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN);
         NetworkRequest networkRequest = networkRequestBuilder.build();
         mNetworkConnectivityCallback = createNetworkConnectivityCallback();
-        mConnMgr.registerNetworkCallback(networkRequest, mNetworkConnectivityCallback);
+        mConnMgr.registerNetworkCallback(networkRequest, mNetworkConnectivityCallback, mHandler);
     }
 
     /**
      * @return {@code true} if there is a data network available for outgoing connections,
      * {@code false} otherwise.
      */
-    public boolean isDataNetworkConnected() {
+    boolean isDataNetworkConnected() {
         NetworkInfo activeNetworkInfo = mConnMgr.getActiveNetworkInfo();
         return activeNetworkInfo != null && activeNetworkInfo.isConnected();
     }
@@ -205,15 +200,15 @@
     /**
      * called from native code to update AGPS status
      */
-    public void onReportAGpsStatus(int agpsType, int agpsStatus, byte[] suplIpAddr) {
+    void onReportAGpsStatus(int agpsType, int agpsStatus, byte[] suplIpAddr) {
         switch (agpsStatus) {
             case GPS_REQUEST_AGPS_DATA_CONN:
                 if (DEBUG) Log.d(TAG, "GPS_REQUEST_AGPS_DATA_CONN");
-                requestSuplConnection(agpsType, suplIpAddr);
+                runOnHandler(() -> handleRequestSuplConnection(agpsType, suplIpAddr));
                 break;
             case GPS_RELEASE_AGPS_DATA_CONN:
                 if (DEBUG) Log.d(TAG, "GPS_RELEASE_AGPS_DATA_CONN");
-                releaseSuplConnection(GPS_RELEASE_AGPS_DATA_CONN);
+                runOnHandler(() -> handleReleaseSuplConnection(GPS_RELEASE_AGPS_DATA_CONN));
                 break;
             case GPS_AGPS_DATA_CONNECTED:
                 if (DEBUG) Log.d(TAG, "GPS_AGPS_DATA_CONNECTED");
@@ -263,7 +258,7 @@
                 mGnssNetworkListener.onNetworkAvailable();
 
                 // Always on, notify HAL so it can get data it needs
-                updateNetworkState(network, true, capabilities);
+                handleUpdateNetworkState(network, true, capabilities);
             }
 
             @Override
@@ -276,7 +271,7 @@
 
                 Log.i(TAG, "Network connection lost. Available networks count: "
                         + mAvailableNetworkCapabilities.size());
-                updateNetworkState(network, false, null);
+                handleUpdateNetworkState(network, false, null);
             }
         };
     }
@@ -287,42 +282,25 @@
             public void onAvailable(Network network) {
                 if (DEBUG) Log.d(TAG, "SUPL network connection available.");
                 // Specific to a change to a SUPL enabled network becoming ready
-                suplConnectionAvailable(network);
+                handleSuplConnectionAvailable(network);
             }
 
             @Override
             public void onLost(Network network) {
                 Log.i(TAG, "SUPL network connection lost.");
-                releaseSuplConnection(GPS_RELEASE_AGPS_DATA_CONN);
+                handleReleaseSuplConnection(GPS_RELEASE_AGPS_DATA_CONN);
             }
 
             @Override
             public void onUnavailable() {
                 Log.i(TAG, "SUPL network connection request timed out.");
                 // Could not setup the connection to the network in the specified time duration.
-                releaseSuplConnection(GPS_AGPS_DATA_CONN_FAILED);
+                handleReleaseSuplConnection(GPS_AGPS_DATA_CONN_FAILED);
             }
         };
     }
 
-    private void requestSuplConnection(int agpsType, byte[] suplIpAddr) {
-        postEvent(() -> handleRequestSuplConnection(agpsType, suplIpAddr));
-    }
-
-    private void suplConnectionAvailable(Network network) {
-        postEvent(() -> handleSuplConnectionAvailable(network));
-    }
-
-    private void releaseSuplConnection(int connStatus) {
-        postEvent(() -> handleReleaseSuplConnection(connStatus));
-    }
-
-    private void updateNetworkState(Network network, boolean isConnected,
-            NetworkCapabilities capabilities) {
-        postEvent(() -> handleUpdateNetworkState(network, isConnected, capabilities));
-    }
-
-    private void postEvent(Runnable event) {
+    private void runOnHandler(Runnable event) {
         // hold a wake lock until this message is delivered
         // note that this assumes the message will not be removed from the queue before
         // it is handled (otherwise the wake lock would be leaked).
@@ -486,6 +464,7 @@
         mConnMgr.requestNetwork(
                 request,
                 mSuplConnectivityCallback,
+                mHandler,
                 SUPL_NETWORK_REQUEST_TIMEOUT_MILLIS);
     }
 
diff --git a/services/core/java/com/android/server/location/GnssVisibilityControl.java b/services/core/java/com/android/server/location/GnssVisibilityControl.java
index ca9c0e0..c3f25bf 100644
--- a/services/core/java/com/android/server/location/GnssVisibilityControl.java
+++ b/services/core/java/com/android/server/location/GnssVisibilityControl.java
@@ -24,10 +24,6 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.PackageManager;
-import android.net.ConnectivityManager;
-import android.net.Network;
-import android.net.NetworkCapabilities;
-import android.net.NetworkRequest;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.PowerManager;
@@ -75,7 +71,6 @@
     private final Context mContext;
 
     private boolean mIsMasterLocationSettingsEnabled = true;
-    private boolean mIsOnRoamingNetwork = false;
 
     // Number of non-framework location access proxy apps is expected to be small (< 5).
     private static final int HASH_MAP_INITIAL_CAPACITY_PROXY_APP_TO_LOCATION_PERMISSIONS = 7;
@@ -98,7 +93,6 @@
 
         // Listen for proxy app package installation, removal events.
         listenForProxyAppsPackageUpdates();
-        listenForRoamingNetworkUpdate();
 
         // TODO(b/122855984): Handle global location settings on/off.
     }
@@ -348,8 +342,7 @@
     }
 
     private boolean shouldDisableNfwLocationAccess() {
-        // TODO(b/122856189): Add disableWhenRoaming configuration per proxy app.
-        return mIsOnRoamingNetwork || !mIsMasterLocationSettingsEnabled;
+        return !mIsMasterLocationSettingsEnabled;
     }
 
     private String[] getLocationPermissionEnabledProxyApps() {
@@ -459,30 +452,6 @@
                 isPermissionMismatched);
     }
 
-    private void listenForRoamingNetworkUpdate() {
-        // Register for network capabilities changes to monitor roaming changes.
-        ConnectivityManager mConnMgr = (ConnectivityManager) mContext.getSystemService(
-                Context.CONNECTIVITY_SERVICE);
-        NetworkRequest.Builder networkRequestBuilder = new NetworkRequest.Builder();
-        networkRequestBuilder.addCapability(NetworkCapabilities.TRANSPORT_CELLULAR);
-        NetworkRequest networkRequest = networkRequestBuilder.build();
-        mConnMgr.registerNetworkCallback(networkRequest,
-                new ConnectivityManager.NetworkCallback() {
-                    @Override
-                    public void onCapabilitiesChanged(Network network,
-                            NetworkCapabilities capabilities) {
-                        boolean isRoaming = !capabilities.hasTransport(
-                                NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING);
-                        // No locking required for this test and set because the callback
-                        // runs in mHandler thread.
-                        if (mIsOnRoamingNetwork != isRoaming) {
-                            mIsOnRoamingNetwork = isRoaming;
-                            updateNfwLocationAccessProxyAppsInGnssHal();
-                        }
-                    }
-                }, mHandler);
-    }
-
     private void runOnHandler(Runnable event) {
         // Hold a wake lock until this message is delivered.
         // Note that this assumes the message will not be removed from the queue before
diff --git a/services/core/java/com/android/server/location/LocationProviderProxy.java b/services/core/java/com/android/server/location/LocationProviderProxy.java
index 6b5b1be..776beb5 100644
--- a/services/core/java/com/android/server/location/LocationProviderProxy.java
+++ b/services/core/java/com/android/server/location/LocationProviderProxy.java
@@ -31,8 +31,8 @@
 import com.android.internal.location.ILocationProviderManager;
 import com.android.internal.location.ProviderProperties;
 import com.android.internal.location.ProviderRequest;
-import com.android.internal.os.BackgroundThread;
 import com.android.internal.os.TransferPipe;
+import com.android.server.FgThread;
 import com.android.server.LocationManagerService;
 import com.android.server.ServiceWatcher;
 
@@ -105,7 +105,7 @@
 
         mServiceWatcher = new ServiceWatcher(context, TAG, action, overlaySwitchResId,
                 defaultServicePackageNameResId, initialPackageNamesResId,
-                BackgroundThread.getHandler()) {
+                FgThread.getHandler()) {
 
             @Override
             protected void onBind() {
diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java
index af790f2..b6ef180 100644
--- a/services/core/java/com/android/server/media/MediaSessionRecord.java
+++ b/services/core/java/com/android/server/media/MediaSessionRecord.java
@@ -283,6 +283,10 @@
                 Log.w(TAG, "Muting remote playback is not supported");
                 return;
             }
+            if (DEBUG) {
+                Log.w(TAG, "adjusting volume, pkg=" + packageName + ", asSystemService="
+                        + asSystemService + ", dir=" + direction);
+            }
             mSessionCb.adjustVolume(packageName, pid, uid, caller, asSystemService, direction);
 
             int volumeBefore = (mOptimisticVolume < 0 ? mCurrentVolume : mOptimisticVolume);
@@ -456,9 +460,25 @@
         return mSessionCb.mCb;
     }
 
-    public void sendMediaButton(String packageName, int pid, int uid, boolean asSystemService,
+    /**
+     * Sends media button.
+     *
+     * @param packageName caller package name
+     * @param pid caller pid
+     * @param uid caller uid
+     * @param asSystemService {@code true} if the event sent to the session as if it was come from
+     *          the system service instead of the app process.
+     * @param ke key events
+     * @param sequenceId (optional) sequence id. Use this only when a wake lock is needed.
+     * @param cb (optional) result receiver to receive callback. Use this only when a wake lock is
+     *           needed.
+     * @return {@code true} if the attempt to send media button was successfuly.
+     *         {@code false} otherwise.
+     */
+    public boolean sendMediaButton(String packageName, int pid, int uid, boolean asSystemService,
             KeyEvent ke, int sequenceId, ResultReceiver cb) {
-        mSessionCb.sendMediaButton(packageName, pid, uid, asSystemService, ke, sequenceId, cb);
+        return mSessionCb.sendMediaButton(packageName, pid, uid, asSystemService, ke, sequenceId,
+                cb);
     }
 
     public void dump(PrintWriter pw, String prefix) {
@@ -492,6 +512,10 @@
             final String callingOpPackageName, final int callingPid, final int callingUid,
             final boolean asSystemService, final boolean useSuggested,
             final int previousFlagPlaySound) {
+        if (DEBUG) {
+            Log.w(TAG, "adjusting local volume, stream=" + stream + ", dir=" + direction
+                    + ", asSystemService=" + asSystemService + ", useSuggested=" + useSuggested);
+        }
         // Must use opPackageName for adjusting volumes with UID.
         final String opPackageName;
         final int uid;
@@ -1223,9 +1247,9 @@
 
         @Override
         public boolean sendMediaButton(String packageName, ControllerCallbackLink cb,
-                boolean asSystemService, KeyEvent keyEvent) {
+                KeyEvent keyEvent) {
             return mSessionCb.sendMediaButton(packageName, Binder.getCallingPid(),
-                    Binder.getCallingUid(), cb, asSystemService, keyEvent);
+                    Binder.getCallingUid(), cb, false, keyEvent);
         }
 
         @Override
@@ -1292,14 +1316,13 @@
 
         @Override
         public void adjustVolume(String packageName, String opPackageName,
-                ControllerCallbackLink caller, boolean asSystemService, int direction,
-                int flags) {
+                ControllerCallbackLink caller, int direction, int flags) {
             int pid = Binder.getCallingPid();
             int uid = Binder.getCallingUid();
             final long token = Binder.clearCallingIdentity();
             try {
                 MediaSessionRecord.this.adjustVolume(packageName, opPackageName, pid, uid, caller,
-                        asSystemService, direction, flags, false /* useSuggested */);
+                        false, direction, flags, false /* useSuggested */);
             } finally {
                 Binder.restoreCallingIdentity(token);
             }
diff --git a/services/core/java/com/android/server/media/MediaSessionServiceImpl.java b/services/core/java/com/android/server/media/MediaSessionServiceImpl.java
index dd26a29..5c73178 100644
--- a/services/core/java/com/android/server/media/MediaSessionServiceImpl.java
+++ b/services/core/java/com/android/server/media/MediaSessionServiceImpl.java
@@ -42,8 +42,9 @@
 import android.media.AudioSystem;
 import android.media.IAudioService;
 import android.media.IRemoteVolumeController;
+import android.media.MediaController2;
+import android.media.Session2CommandGroup;
 import android.media.Session2Token;
-import android.media.session.ControllerLink;
 import android.media.session.IActiveSessionsListener;
 import android.media.session.ICallback;
 import android.media.session.IOnMediaKeyListener;
@@ -58,6 +59,7 @@
 import android.os.Binder;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.HandlerExecutor;
 import android.os.IBinder;
 import android.os.Message;
 import android.os.PowerManager;
@@ -708,6 +710,14 @@
         return mUserRecords.get(fullUserId);
     }
 
+    private MediaSessionRecord getMediaSessionRecordLocked(MediaSession.Token sessionToken) {
+        FullUserRecord user = getFullUserRecordLocked(UserHandle.getUserId(sessionToken.getUid()));
+        if (user != null) {
+            return user.mPriorityStack.getMediaSessionRecord(sessionToken);
+        }
+        return null;
+    }
+
     /**
      * Information about a full user and its corresponding managed profiles.
      *
@@ -1004,71 +1014,38 @@
                 if (DEBUG) {
                     Log.d(TAG, "Session2 is created " + sessionToken);
                 }
-                if (pid != sessionToken.getPid()) {
-                    throw new SecurityException("Unexpected Session2Token's PID, expected=" + pid
-                            + " but actually=" + sessionToken.getPid());
-                }
                 if (uid != sessionToken.getUid()) {
                     throw new SecurityException("Unexpected Session2Token's UID, expected=" + uid
                             + " but actually=" + sessionToken.getUid());
                 }
-                int userId = UserHandle.getUserId(uid);
-                List<Session2Token> session2Tokens = mSession2TokensPerUser.get(userId);
-                if (session2Tokens.contains(sessionToken)) {
-                    if (DEBUG) {
-                        Log.d(TAG, "notifySession2Created(): Ignoring already existing token "
-                                + sessionToken);
-                    }
-                    return;
-                }
-                session2Tokens.add(sessionToken);
-                pushSession2TokensChangedLocked(userId);
+                Controller2Callback callback = new Controller2Callback(sessionToken);
+                // Note: It's safe not to keep controller here because it wouldn't be GC'ed until
+                //       it's closed.
+                // TODO: Keep controller as well for better readability
+                //       because the GC behavior isn't straightforward.
+                MediaController2 controller = new MediaController2(mContext, sessionToken,
+                        new HandlerExecutor(mHandler), callback);
             } finally {
                 Binder.restoreCallingIdentity(token);
             }
         }
 
         @Override
-        public void notifySession2Destroyed(Session2Token sessionToken) throws RemoteException {
-            final int pid = Binder.getCallingPid();
-            final int uid = Binder.getCallingUid();
-            final long token = Binder.clearCallingIdentity();
-            try {
-                if (DEBUG) {
-                    Log.d(TAG, "Session2 is destroyed " + sessionToken);
-                }
-                if (pid != sessionToken.getPid()) {
-                    throw new SecurityException("Unexpected Session2Token's PID, expected=" + pid
-                            + " but actually=" + sessionToken.getPid());
-                }
-                if (uid != sessionToken.getUid()) {
-                    throw new SecurityException("Unexpected Session2Token's UID, expected=" + uid
-                            + " but actually=" + sessionToken.getUid());
-                }
-                int userId = UserHandle.getUserId(uid);
-                mSession2TokensPerUser.get(userId).remove(sessionToken);
-                pushSession2TokensChangedLocked(userId);
-            } finally {
-                Binder.restoreCallingIdentity(token);
-            }
-        }
-
-        @Override
-        public List<ControllerLink> getSessions(ComponentName componentName, int userId) {
+        public List<MediaSession.Token> getSessions(ComponentName componentName, int userId) {
             final int pid = Binder.getCallingPid();
             final int uid = Binder.getCallingUid();
             final long token = Binder.clearCallingIdentity();
 
             try {
                 int resolvedUserId = verifySessionsRequest(componentName, userId, pid, uid);
-                ArrayList<ControllerLink> binders = new ArrayList<>();
+                ArrayList<MediaSession.Token> tokens = new ArrayList<>();
                 synchronized (mLock) {
                     List<MediaSessionRecord> records = getActiveSessionsLocked(resolvedUserId);
                     for (MediaSessionRecord record : records) {
-                        binders.add(record.getControllerLink());
+                        tokens.add(record.getSessionToken());
                     }
                 }
-                return binders;
+                return tokens;
             } finally {
                 Binder.restoreCallingIdentity(token);
             }
@@ -1273,6 +1250,34 @@
         }
 
         @Override
+        public boolean dispatchMediaKeyEventToSessionAsSystemService(String packageName,
+                MediaSession.Token sessionToken, KeyEvent keyEvent) {
+            final int pid = Binder.getCallingPid();
+            final int uid = Binder.getCallingUid();
+            final long token = Binder.clearCallingIdentity();
+            try {
+                synchronized (mLock) {
+                    MediaSessionRecord record = getMediaSessionRecordLocked(sessionToken);
+                    if (record == null) {
+                        if (DEBUG) {
+                            Log.d(TAG, "Failed to find session to dispatch key event.");
+                        }
+                        return false;
+                    }
+                    if (DEBUG) {
+                        Log.d(TAG, "dispatchMediaKeyEventToSessionAsSystemService, pkg="
+                                + packageName + ", pid=" + pid + ", uid=" + uid + ", sessionToken="
+                                + sessionToken + ", event=" + keyEvent + ", session=" + record);
+                    }
+                    return record.sendMediaButton(packageName, pid, uid, true /* asSystemService */,
+                            keyEvent, 0, null);
+                }
+            } finally {
+                Binder.restoreCallingIdentity(token);
+            }
+        }
+
+        @Override
         public void setCallback(ICallback callback) {
             final int pid = Binder.getCallingPid();
             final int uid = Binder.getCallingUid();
@@ -1578,6 +1583,62 @@
         }
 
         @Override
+        public void dispatchVolumeKeyEventToSessionAsSystemService(String packageName,
+                String opPackageName, MediaSession.Token sessionToken, KeyEvent keyEvent) {
+            int pid = Binder.getCallingPid();
+            int uid = Binder.getCallingUid();
+            final long token = Binder.clearCallingIdentity();
+            try {
+                synchronized (mLock) {
+                    MediaSessionRecord record = getMediaSessionRecordLocked(sessionToken);
+                    if (record == null) {
+                        if (DEBUG) {
+                            Log.d(TAG, "Failed to find session to dispatch key event.");
+                        }
+                        return;
+                    }
+                    if (DEBUG) {
+                        Log.d(TAG, "dispatchVolumeKeyEventToSessionAsSystemService, pkg="
+                                + packageName + ", opPkg=" + opPackageName + ", pid=" + pid
+                                + ", uid=" + uid + ", sessionToken=" + sessionToken + ", event="
+                                + keyEvent + ", session=" + record);
+                    }
+                    switch (keyEvent.getAction()) {
+                        case KeyEvent.ACTION_DOWN: {
+                            int direction = 0;
+                            switch (keyEvent.getKeyCode()) {
+                                case KeyEvent.KEYCODE_VOLUME_UP:
+                                    direction = AudioManager.ADJUST_RAISE;
+                                    break;
+                                case KeyEvent.KEYCODE_VOLUME_DOWN:
+                                    direction = AudioManager.ADJUST_LOWER;
+                                    break;
+                                case KeyEvent.KEYCODE_VOLUME_MUTE:
+                                    direction = AudioManager.ADJUST_TOGGLE_MUTE;
+                                    break;
+                            }
+                            record.adjustVolume(packageName, opPackageName, pid, uid,
+                                    null /* caller */, true /* asSystemService */, direction,
+                                    AudioManager.FLAG_SHOW_UI, false /* useSuggested */);
+                            break;
+                        }
+
+                        case KeyEvent.ACTION_UP: {
+                            final int flags =
+                                    AudioManager.FLAG_PLAY_SOUND | AudioManager.FLAG_VIBRATE
+                                            | AudioManager.FLAG_FROM_KEY;
+                            record.adjustVolume(packageName, opPackageName, pid, uid,
+                                    null /* caller */, true /* asSystemService */, 0,
+                                    flags, false /* useSuggested */);
+                        }
+                    }
+                }
+            } finally {
+                Binder.restoreCallingIdentity(token);
+            }
+        }
+
+        @Override
         public void dispatchAdjustVolume(String packageName, String opPackageName,
                 int suggestedStream, int delta, int flags) {
             final int pid = Binder.getCallingPid();
@@ -2144,4 +2205,30 @@
             obtainMessage(MSG_SESSIONS_CHANGED, userIdInteger).sendToTarget();
         }
     }
+
+    private class Controller2Callback extends MediaController2.ControllerCallback {
+        private final Session2Token mToken;
+
+        Controller2Callback(Session2Token token) {
+            mToken = token;
+        }
+
+        @Override
+        public void onConnected(MediaController2 controller, Session2CommandGroup allowedCommands) {
+            synchronized (mLock) {
+                int userId = UserHandle.getUserId(mToken.getUid());
+                mSession2TokensPerUser.get(userId).add(mToken);
+                pushSession2TokensChangedLocked(userId);
+            }
+        }
+
+        @Override
+        public void onDisconnected(MediaController2 controller) {
+            synchronized (mLock) {
+                int userId = UserHandle.getUserId(mToken.getUid());
+                mSession2TokensPerUser.get(userId).remove(mToken);
+                pushSession2TokensChangedLocked(userId);
+            }
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/media/MediaSessionStack.java b/services/core/java/com/android/server/media/MediaSessionStack.java
index 719ec36..9ba50ee 100644
--- a/services/core/java/com/android/server/media/MediaSessionStack.java
+++ b/services/core/java/com/android/server/media/MediaSessionStack.java
@@ -28,6 +28,7 @@
 import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * Keeps track of media sessions and their priority for notifications, media
@@ -136,6 +137,21 @@
     }
 
     /**
+     * Gets the {@link MediaSessionRecord} with the {@link MediaSession.Token}.
+     *
+     * @param sessionToken session token
+     * @return the MediaSessionRecord. Can be {@code null} if the session is gone meanwhile.
+     */
+    public MediaSessionRecord getMediaSessionRecord(MediaSession.Token sessionToken) {
+        for (MediaSessionRecord record : mSessions) {
+            if (Objects.equals(record.getControllerLink(), sessionToken.getControllerLink())) {
+                return record;
+            }
+        }
+        return null;
+    }
+
+    /**
      * Notify the priority tracker that a session's playback state changed.
      *
      * @param record The record that changed.
diff --git a/services/core/java/com/android/server/notification/NotificationDelegate.java b/services/core/java/com/android/server/notification/NotificationDelegate.java
index c2dc554..be15fda 100644
--- a/services/core/java/com/android/server/notification/NotificationDelegate.java
+++ b/services/core/java/com/android/server/notification/NotificationDelegate.java
@@ -60,7 +60,8 @@
      * @param clickedIndex the index of clicked reply
      * @param reply the reply that is sent
      * @param generatedByAssistant specifies is the reply generated by NAS
+     * @param notificationLocation the location of the notification containing the smart reply
      */
     void onNotificationSmartReplySent(String key, int clickedIndex, CharSequence reply,
-            boolean generatedByAssistant);
+            boolean generatedByAssistant, int notificationLocation);
 }
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index de3f50a..ba187c0 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -121,6 +121,7 @@
 import android.content.pm.IPackageManager;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.PackageManagerInternal;
 import android.content.pm.ParceledListSlice;
 import android.content.pm.UserInfo;
 import android.content.res.Resources;
@@ -197,6 +198,7 @@
 import com.android.internal.os.SomeArgs;
 import com.android.internal.statusbar.NotificationVisibility;
 import com.android.internal.util.ArrayUtils;
+import com.android.internal.util.CollectionUtils;
 import com.android.internal.util.DumpUtils;
 import com.android.internal.util.FastXmlSerializer;
 import com.android.internal.util.Preconditions;
@@ -769,7 +771,10 @@
                                 action.isContextual() ? 1 : 0)
                         .addTaggedData(
                                 MetricsEvent.NOTIFICATION_SMART_SUGGESTION_ASSISTANT_GENERATED,
-                                generatedByAssistant ? 1 : 0));
+                                generatedByAssistant ? 1 : 0)
+                        .addTaggedData(MetricsEvent.NOTIFICATION_LOCATION,
+                                nv.location.toMetricsEventEnum()));
+
                 EventLogTags.writeNotificationActionClicked(key, actionIndex,
                         r.getLifespanMs(now), r.getFreshnessMs(now), r.getExposureMs(now),
                         nv.rank, nv.count);
@@ -925,14 +930,19 @@
 
         @Override
         public void onNotificationSmartReplySent(String key, int replyIndex, CharSequence reply,
-                boolean generatedByAssistant) {
+                boolean generatedByAssistant, int notificationLocation) {
 
             synchronized (mNotificationLock) {
                 NotificationRecord r = mNotificationsByKey.get(key);
                 if (r != null) {
                     LogMaker logMaker = r.getLogMaker()
                             .setCategory(MetricsEvent.SMART_REPLY_ACTION)
-                            .setSubtype(replyIndex);
+                            .setSubtype(replyIndex)
+                            .addTaggedData(
+                                    MetricsEvent.NOTIFICATION_SMART_SUGGESTION_ASSISTANT_GENERATED,
+                                    generatedByAssistant ? 1 : 0)
+                            .addTaggedData(MetricsEvent.NOTIFICATION_LOCATION,
+                                    notificationLocation);
                     mMetricsLogger.write(logMaker);
                     // Treat clicking on a smart reply as a user interaction.
                     reportUserInteraction(r);
@@ -2339,18 +2349,46 @@
         public boolean areBubblesAllowedForPackage(String pkg, int uid) {
             enforceSystemOrSystemUIOrSamePackage(pkg,
                     "Caller not system or systemui or same package");
-            return mPreferencesHelper.areBubblessAllowed(pkg, uid);
+            return mPreferencesHelper.areBubblesAllowed(pkg, uid);
         }
 
         @Override
         public void setBubblesAllowed(String pkg, int uid, boolean allowed) {
-            checkCallerIsSystem();
-
+            enforceSystemOrSystemUI("Caller not system or systemui");
             mPreferencesHelper.setBubblesAllowed(pkg, uid, allowed);
             handleSavePolicyFile();
         }
 
         @Override
+        public boolean hasUserApprovedBubblesForPackage(String pkg, int uid) {
+            enforceSystemOrSystemUI("Caller not system or systemui");
+            int lockedFields = mPreferencesHelper.getAppLockedFields(pkg, uid);
+            return (lockedFields & PreferencesHelper.LockableAppFields.USER_LOCKED_BUBBLE) != 0;
+        }
+
+        @Override
+        public boolean shouldHideSilentStatusIcons(String callingPkg) {
+            checkCallerIsSameApp(callingPkg);
+
+            if (isCallerSystemOrPhone()
+                    || mListeners.isListenerPackage(callingPkg)) {
+                return mPreferencesHelper.shouldHideSilentStatusIcons();
+            } else {
+                throw new SecurityException("Only available for notification listeners");
+            }
+        }
+
+        @Override
+        public void setHideSilentStatusIcons(boolean hide) {
+            checkCallerIsSystem();
+
+            mPreferencesHelper.setHideSilentStatusIcons(hide);
+            handleSavePolicyFile();
+
+            mListeners.onStatusBarIconsBehaviorChanged(hide);
+        }
+
+        @Override
         public int getPackageImportance(String pkg) {
             checkCallerIsSystemOrSameApp(pkg);
             return mPreferencesHelper.getImportance(pkg, Binder.getCallingUid());
@@ -3618,6 +3656,22 @@
         }
 
         @Override
+        public ComponentName getAllowedNotificationAssistantForUser(int userId) {
+            checkCallerIsSystem();
+            List<ComponentName> allowedComponents = mAssistants.getAllowedComponents(userId);
+            if (allowedComponents.size() > 1) {
+                throw new IllegalStateException(
+                        "At most one NotificationAssistant: " + allowedComponents.size());
+            }
+            return CollectionUtils.firstOrNull(allowedComponents);
+        }
+
+        @Override
+        public ComponentName getAllowedNotificationAssistant() {
+            return getAllowedNotificationAssistantForUser(getCallingUserHandle().getIdentifier());
+        }
+
+        @Override
         public boolean isNotificationListenerAccessGranted(ComponentName listener) {
             Preconditions.checkNotNull(listener);
             checkCallerIsSystemOrSameApp(listener.getPackageName());
@@ -3685,8 +3739,15 @@
         @Override
         public void setNotificationAssistantAccessGrantedForUser(ComponentName assistant,
                 int userId, boolean granted) throws RemoteException {
-            Preconditions.checkNotNull(assistant);
             checkCallerIsSystemOrShell();
+            if (assistant == null) {
+                ComponentName allowedAssistant = CollectionUtils.firstOrNull(
+                        mAssistants.getAllowedComponents(userId));
+                if (allowedAssistant != null) {
+                    setNotificationAssistantAccessGrantedForUser(allowedAssistant, userId, false);
+                }
+                return;
+            }
             final long identity = Binder.clearCallingIdentity();
             try {
                 if (mAllowedManagedServicePackages.test(assistant.getPackageName())) {
@@ -3859,6 +3920,24 @@
             return mLockScreenAllowSecureNotifications;
         }
 
+        @Override
+        public boolean isPackagePaused(String pkg) {
+            Preconditions.checkNotNull(pkg);
+            checkCallerIsSameApp(pkg);
+
+            boolean isPaused;
+
+            final PackageManagerInternal pmi = LocalServices.getService(
+                    PackageManagerInternal.class);
+            int flags = pmi.getDistractingPackageRestrictions(
+                    pkg, Binder.getCallingUserHandle().getIdentifier());
+            isPaused = ((flags & PackageManager.RESTRICTION_HIDE_NOTIFICATIONS) != 0);
+
+            isPaused |= isPackageSuspendedForUser(pkg, Binder.getCallingUid());
+
+            return isPaused;
+        }
+
         private void verifyPrivilegedListener(INotificationListener token, UserHandle user,
                 boolean assistantAllowed) {
             ManagedServiceInfo info;
@@ -7209,6 +7288,26 @@
                 }
             }
         }
+
+        @Override
+        protected void setPackageOrComponentEnabled(String pkgOrComponent, int userId,
+                boolean isPrimary, boolean enabled) {
+            // Ensures that only one component is enabled at a time
+            if (enabled) {
+                List<ComponentName> allowedComponents = getAllowedComponents(userId);
+                if (!allowedComponents.isEmpty()) {
+                    ComponentName currentComponent = CollectionUtils.firstOrNull(allowedComponents);
+                    if (currentComponent.flattenToString().equals(pkgOrComponent)) return;
+                    try {
+                        getBinderService().setNotificationAssistantAccessGrantedForUser(
+                                currentComponent, userId, false);
+                    } catch (RemoteException e) {
+                        e.rethrowFromSystemServer();
+                    }
+                }
+            }
+            super.setPackageOrComponentEnabled(pkgOrComponent, userId, isPrimary, enabled);
+        }
     }
 
     public class NotificationListeners extends ManagedServices {
@@ -7291,6 +7390,20 @@
             return mLightTrimListeners.contains(info) ? TRIM_LIGHT : TRIM_FULL;
         }
 
+        public void onStatusBarIconsBehaviorChanged(boolean hideSilentStatusIcons) {
+            for (final ManagedServiceInfo info : getServices()) {
+                mHandler.post(() -> {
+                    final INotificationListener listener = (INotificationListener) info.service;
+                     try {
+                        listener.onStatusBarIconsBehaviorChanged(hideSilentStatusIcons);
+                    } catch (RemoteException ex) {
+                        Log.e(TAG, "unable to notify listener "
+                                + "(hideSilentStatusIcons): " + listener, ex);
+                    }
+                });
+            }
+        }
+
         /**
          * asynchronously notify all listeners about a new notification
          *
diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java
index 7a21aa2..6ed4f5c 100644
--- a/services/core/java/com/android/server/notification/PreferencesHelper.java
+++ b/services/core/java/com/android/server/notification/PreferencesHelper.java
@@ -76,6 +76,7 @@
     private static final String TAG_CHANNEL = "channel";
     private static final String TAG_GROUP = "channelGroup";
     private static final String TAG_DELEGATE = "delegate";
+    private static final String TAG_STATUS_ICONS = "status_icons";
 
     private static final String ATT_VERSION = "version";
     private static final String ATT_NAME = "name";
@@ -89,10 +90,13 @@
     private static final String ATT_APP_USER_LOCKED_FIELDS = "app_user_locked_fields";
     private static final String ATT_ENABLED = "enabled";
     private static final String ATT_USER_ALLOWED = "allowed";
+    private static final String ATT_HIDE_SILENT = "hide_silent";
 
     private static final int DEFAULT_PRIORITY = Notification.PRIORITY_DEFAULT;
     private static final int DEFAULT_VISIBILITY = NotificationManager.VISIBILITY_NO_OVERRIDE;
     private static final int DEFAULT_IMPORTANCE = NotificationManager.IMPORTANCE_UNSPECIFIED;
+    @VisibleForTesting
+    static final boolean DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS = false;
     private static final boolean DEFAULT_SHOW_BADGE = true;
     private static final boolean DEFAULT_ALLOW_BUBBLE = true;
     private static final boolean DEFAULT_OEM_LOCKED_IMPORTANCE  = false;
@@ -124,6 +128,7 @@
 
     private SparseBooleanArray mBadgingEnabled;
     private boolean mAreChannelsBypassingDnd;
+    private boolean mHideSilentStatusBarIcons;
 
     public PreferencesHelper(Context context, PackageManager pm, RankingHandler rankingHandler,
             ZenModeHelper zenHelper) {
@@ -143,9 +148,8 @@
         String tag = parser.getName();
         if (!TAG_RANKING.equals(tag)) return;
         synchronized (mPackagePreferences) {
-            // Clobber groups and channels with the xml, but don't delete other data that wasn't present
-
-            // at the time of serialization.
+            // Clobber groups and channels with the xml, but don't delete other data that wasn't
+            // present at the time of serialization.
             mRestoredWithoutUids.clear();
             while ((type = parser.next()) != XmlPullParser.END_DOCUMENT) {
                 tag = parser.getName();
@@ -153,7 +157,10 @@
                     return;
                 }
                 if (type == XmlPullParser.START_TAG) {
-                    if (TAG_PACKAGE.equals(tag)) {
+                    if (TAG_STATUS_ICONS.equals(tag)) {
+                        mHideSilentStatusBarIcons = XmlUtils.readBooleanAttribute(
+                                parser, ATT_HIDE_SILENT, DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS);
+                    } else if (TAG_PACKAGE.equals(tag)) {
                         int uid = XmlUtils.readIntAttribute(parser, ATT_UID, UNKNOWN_UID);
                         String name = parser.getAttributeValue(null, ATT_NAME);
                         if (!TextUtils.isEmpty(name)) {
@@ -375,6 +382,11 @@
     public void writeXml(XmlSerializer out, boolean forBackup) throws IOException {
         out.startTag(null, TAG_RANKING);
         out.attribute(null, ATT_VERSION, Integer.toString(XML_VERSION));
+        if (mHideSilentStatusBarIcons != DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS) {
+            out.startTag(null, TAG_STATUS_ICONS);
+            out.attribute(null, ATT_HIDE_SILENT, String.valueOf(mHideSilentStatusBarIcons));
+            out.endTag(null, TAG_STATUS_ICONS);
+        }
 
         synchronized (mPackagePreferences) {
             final int N = mPackagePreferences.size();
@@ -473,7 +485,7 @@
      * @param uid the uid to check if bubbles are allowed for.
      * @return whether bubbles are allowed.
      */
-    public boolean areBubblessAllowed(String pkg, int uid) {
+    public boolean areBubblesAllowed(String pkg, int uid) {
         return getOrCreatePackagePreferences(pkg, uid).allowBubble;
     }
 
@@ -489,7 +501,6 @@
         return getOrCreatePackagePreferences(packageName, uid).importance;
     }
 
-
     /**
      * Returns whether the importance of the corresponding notification is user-locked and shouldn't
      * be adjusted by an assistant (via means of a blocking helper, for example). For the channel
@@ -782,6 +793,14 @@
         }
     }
 
+    public boolean shouldHideSilentStatusIcons() {
+        return mHideSilentStatusBarIcons;
+    }
+
+    public void setHideSilentStatusIcons(boolean hide) {
+        mHideSilentStatusBarIcons = hide;
+    }
+
     public void lockChannelsForOEM(String[] appOrChannelList) {
         if (appOrChannelList == null) {
             return;
diff --git a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java
index 1cbf0bf..b0d2704 100644
--- a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java
+++ b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java
@@ -270,9 +270,7 @@
             Slog.d(TAG, "onTargetPackageUpgraded packageName=" + packageName + " userId=" + userId);
         }
 
-        if (updateAllOverlaysForTarget(packageName, userId, 0)) {
-            mListener.onOverlaysChanged(packageName, userId);
-        }
+        updateAllOverlaysForTarget(packageName, userId, 0);
     }
 
     void onTargetPackageRemoved(@NonNull final String packageName, final int userId) {
diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java
index d0ef4f1..62c4815 100644
--- a/services/core/java/com/android/server/pm/LauncherAppsService.java
+++ b/services/core/java/com/android/server/pm/LauncherAppsService.java
@@ -34,9 +34,11 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.ILauncherApps;
 import android.content.pm.IOnAppsChangedListener;
+import android.content.pm.IPackageInstallerCallback;
 import android.content.pm.LauncherApps;
 import android.content.pm.LauncherApps.ShortcutQuery;
 import android.content.pm.PackageInfo;
+import android.content.pm.PackageInstaller.SessionInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManagerInternal;
 import android.content.pm.ParceledListSlice;
@@ -56,6 +58,7 @@
 import android.os.ParcelFileDescriptor;
 import android.os.RemoteCallbackList;
 import android.os.RemoteException;
+import android.os.ServiceManager;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.os.UserManagerInternal;
@@ -153,6 +156,8 @@
 
         private final Object mVouchedSignaturesLocked = new Object();
 
+        private PackageInstallerService mPackageInstallerService;
+
         public LauncherAppsImpl(Context context) {
             mContext = context;
             mUm = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
@@ -204,8 +209,7 @@
         }
 
         /*
-         * @see android.content.pm.ILauncherApps#addOnAppsChangedListener(
-         *          android.content.pm.IOnAppsChangedListener)
+         * @see android.content.pm.ILauncherApps#addOnAppsChangedListener
          */
         @Override
         public void addOnAppsChangedListener(String callingPackage, IOnAppsChangedListener listener)
@@ -228,8 +232,7 @@
         }
 
         /*
-         * @see android.content.pm.ILauncherApps#removeOnAppsChangedListener(
-         *          android.content.pm.IOnAppsChangedListener)
+         * @see android.content.pm.ILauncherApps#removeOnAppsChangedListener
          */
         @Override
         public void removeOnAppsChangedListener(IOnAppsChangedListener listener)
@@ -246,6 +249,44 @@
         }
 
         /**
+         * @see android.content.pm.ILauncherApps#registerPackageInstallerCallback
+         */
+        @Override
+        public void registerPackageInstallerCallback(String callingPackage,
+                IPackageInstallerCallback callback) {
+            verifyCallingPackage(callingPackage);
+            UserHandle callingIdUserHandle = new UserHandle(getCallingUserId());
+            getPackageInstallerService().registerCallback(callback, eventUserId ->
+                            isEnabledProfileOf(callingIdUserHandle,
+                                    new UserHandle(eventUserId), "shouldReceiveEvent"));
+        }
+
+        @Override
+        public ParceledListSlice<SessionInfo> getAllSessions(String callingPackage) {
+            verifyCallingPackage(callingPackage);
+            List<SessionInfo> sessionInfos = new ArrayList<>();
+            int[] userIds = mUm.getEnabledProfileIds(getCallingUserId());
+            long token = Binder.clearCallingIdentity();
+            try {
+                for (int userId : userIds) {
+                    sessionInfos.addAll(getPackageInstallerService().getAllSessions(userId)
+                            .getList());
+                }
+            } finally {
+                Binder.restoreCallingIdentity(token);
+            }
+            return new ParceledListSlice<>(sessionInfos);
+        }
+
+        private PackageInstallerService getPackageInstallerService() {
+            if (mPackageInstallerService == null) {
+                mPackageInstallerService = ((PackageInstallerService) ((PackageManagerService)
+                        ServiceManager.getService("package")).getPackageInstaller());
+            }
+            return mPackageInstallerService;
+        }
+
+        /**
          * Register a receiver to watch for package broadcasts
          */
         private void startWatchingPackageBroadcasts() {
@@ -430,6 +471,9 @@
             if (!mVouchedSignaturesByUser.containsKey(user)) {
                 initVouchedSignatures(user);
             }
+            if (isManagedProfileAdmin(user, appInfo.packageName)) {
+                return false;
+            }
             if (mVouchProviders.contains(appInfo.packageName)) {
                 // If it's a vouching packages then we must show hidden app
                 return true;
@@ -453,6 +497,24 @@
             return true;
         }
 
+        private boolean isManagedProfileAdmin(UserHandle user, String packageName) {
+            final List<UserInfo> userInfoList = mUm.getProfiles(user.getIdentifier());
+            for (int i = 0; i < userInfoList.size(); i++) {
+                UserInfo userInfo = userInfoList.get(i);
+                if (!userInfo.isManagedProfile()) {
+                    continue;
+                }
+                ComponentName componentName = mDpm.getProfileOwnerAsUser(userInfo.getUserHandle());
+                if (componentName == null) {
+                    continue;
+                }
+                if (componentName.getPackageName().equals(packageName)) {
+                    return true;
+                }
+            }
+            return false;
+        }
+
         @VisibleForTesting
         static String computePackageCertDigest(Signature signature) {
             MessageDigest messageDigest;
@@ -696,7 +758,7 @@
                 return null;
             }
             return new LauncherApps.AppUsageLimit(
-                    data.isGroupLimit(), data.getTotalUsageLimit(), data.getUsageRemaining());
+                    data.getTotalUsageLimit(), data.getUsageRemaining());
         }
 
         private void ensureShortcutPermission(@NonNull String callingPackage) {
@@ -837,13 +899,40 @@
                         PackageManager.MATCH_DIRECT_BOOT_AWARE
                                 | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
                         callingUid, user.getIdentifier());
-                return info != null;
+                // Note we don't check "exported" because if the caller has the same UID as the
+                // callee's UID, it can still be launched.
+                // (If an app doesn't export a front door activity and causes issues with the
+                // launcher, that's just the app's bug.)
+                return info != null && info.isEnabled();
             } finally {
                 Binder.restoreCallingIdentity(ident);
             }
         }
 
         @Override
+        public void startSessionDetailsActivityAsUser(IApplicationThread caller,
+                String callingPackage, SessionInfo sessionInfo, Rect sourceBounds,
+                Bundle opts, UserHandle userHandle) throws RemoteException {
+            int userId = userHandle.getIdentifier();
+            if (!canAccessProfile(userId, "Cannot start details activity")) {
+                return;
+            }
+
+            Intent i = new Intent(Intent.ACTION_VIEW)
+                    .setData(new Uri.Builder()
+                            .scheme("market")
+                            .authority("details")
+                            .appendQueryParameter("id", sessionInfo.appPackageName)
+                            .build())
+                    .putExtra(Intent.EXTRA_REFERRER, new Uri.Builder().scheme("android-app")
+                            .authority(callingPackage).build());
+            i.setSourceBounds(sourceBounds);
+
+            mActivityTaskManagerInternal.startActivityAsUser(caller, callingPackage, i, opts,
+                    userId);
+        }
+
+        @Override
         public void startActivityAsUser(IApplicationThread caller, String callingPackage,
                 ComponentName component, Rect sourceBounds,
                 Bundle opts, UserHandle user) throws RemoteException {
diff --git a/services/core/java/com/android/server/pm/ModuleInfoProvider.java b/services/core/java/com/android/server/pm/ModuleInfoProvider.java
index 642bfa2..e7dace0 100644
--- a/services/core/java/com/android/server/pm/ModuleInfoProvider.java
+++ b/services/core/java/com/android/server/pm/ModuleInfoProvider.java
@@ -138,7 +138,7 @@
                 // to dealing with this as we'll now have to listen to all config changes and
                 // regenerate the data if required. Also, is this the right way to parse a resource
                 // reference out of an XML file ?
-                final String moduleName = packageResources.getString(
+                final CharSequence moduleName = packageResources.getText(
                         Integer.parseInt(parser.getAttributeValue(null, "name").substring(1)));
                 final String modulePackageName = XmlUtils.readStringAttribute(parser,
                         "packageName");
diff --git a/services/core/java/com/android/server/pm/OWNERS b/services/core/java/com/android/server/pm/OWNERS
index 60d7925..33b8641 100644
--- a/services/core/java/com/android/server/pm/OWNERS
+++ b/services/core/java/com/android/server/pm/OWNERS
@@ -51,6 +51,8 @@
 per-file UserManagerService.java = yamasani@google.com
 per-file UserRestrictionsUtils.java = omakoto@google.com
 per-file UserRestrictionsUtils.java = yamasani@google.com
+per-file UserRestrictionsUtils.java = rubinxu@google.com
+per-file UserRestrictionsUtils.java = sandness@google.com
 
 # security
 per-file KeySetHandle.java = cbrubaker@google.com
diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
index 94b1b36..5b38208 100644
--- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java
+++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
@@ -507,7 +507,7 @@
         int flags = info.flags;
         boolean vmSafeMode = (flags & ApplicationInfo.FLAG_VM_SAFE_MODE) != 0;
         // When an app or priv app is configured to run out of box, only verify it.
-        if (info.isCodeIntegrityPreferred()
+        if (info.isEmbeddedDexUsed()
                 || (info.isPrivilegedApp()
                     && DexManager.isPackageSelectedToRunOob(info.packageName))) {
             return "verify";
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index 146a2f3..af50c87 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -59,7 +59,6 @@
 import android.os.RemoteCallbackList;
 import android.os.RemoteException;
 import android.os.SELinux;
-import android.os.UserHandle;
 import android.os.UserManager;
 import android.os.storage.StorageManager;
 import android.system.ErrnoException;
@@ -107,6 +106,7 @@
 import java.util.List;
 import java.util.Objects;
 import java.util.Random;
+import java.util.function.IntPredicate;
 
 /** The service responsible for installing packages. */
 public class PackageInstallerService extends IPackageInstaller.Stub implements
@@ -204,13 +204,17 @@
         mSessionsDir = new File(Environment.getDataSystemDirectory(), "install_sessions");
         mSessionsDir.mkdirs();
 
-        mStagingManager = new StagingManager(pm);
+        mStagingManager = new StagingManager(pm, this);
     }
 
     private void setBootCompleted()  {
         mBootCompleted = true;
     }
 
+    boolean isBootCompleted()  {
+        return mBootCompleted;
+    }
+
     public void systemReady() {
         mAppOps = mContext.getSystemService(AppOpsManager.class);
 
@@ -245,13 +249,24 @@
             // the updated information.
             writeSessionsLocked();
 
+        }
+    }
+
+    void restoreAndApplyStagedSessionIfNeeded() {
+        List<PackageInstallerSession> stagedSessionsToRestore = new ArrayList<>();
+        synchronized (mSessions) {
             for (int i = 0; i < mSessions.size(); i++) {
                 final PackageInstallerSession session = mSessions.valueAt(i);
                 if (session.isStaged()) {
-                    mStagingManager.restoreSession(session);
+                    stagedSessionsToRestore.add(session);
                 }
             }
         }
+        // Don't hold mSessions lock when calling restoreSession, since it might trigger an APK
+        // atomic install which needs to query sessions, which requires lock on mSessions.
+        for (PackageInstallerSession session : stagedSessionsToRestore) {
+            mStagingManager.restoreSession(session);
+        }
     }
 
     @GuardedBy("mSessions")
@@ -804,7 +819,14 @@
     public void registerCallback(IPackageInstallerCallback callback, int userId) {
         mPermissionManager.enforceCrossUserPermission(
                 Binder.getCallingUid(), userId, true, false, "registerCallback");
-        mCallbacks.register(callback, userId);
+        registerCallback(callback, eventUserId -> userId == eventUserId);
+    }
+
+    /**
+     * Assume permissions already checked and caller's identity cleared
+     */
+    public void registerCallback(IPackageInstallerCallback callback, IntPredicate userCheck) {
+        mCallbacks.register(callback, userCheck);
     }
 
     @Override
@@ -1026,8 +1048,8 @@
             super(looper);
         }
 
-        public void register(IPackageInstallerCallback callback, int userId) {
-            mCallbacks.register(callback, new UserHandle(userId));
+        public void register(IPackageInstallerCallback callback, IntPredicate userCheck) {
+            mCallbacks.register(callback, userCheck);
         }
 
         public void unregister(IPackageInstallerCallback callback) {
@@ -1040,9 +1062,8 @@
             final int n = mCallbacks.beginBroadcast();
             for (int i = 0; i < n; i++) {
                 final IPackageInstallerCallback callback = mCallbacks.getBroadcastItem(i);
-                final UserHandle user = (UserHandle) mCallbacks.getBroadcastCookie(i);
-                // TODO: dispatch notifications for slave profiles
-                if (userId == user.getIdentifier()) {
+                final IntPredicate userCheck = (IntPredicate) mCallbacks.getBroadcastCookie(i);
+                if (userCheck.test(userId)) {
                     try {
                         invokeCallback(callback, msg);
                     } catch (RemoteException ignored) {
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 494ec3f..995f335 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -473,6 +473,7 @@
         final SessionInfo info = new SessionInfo();
         synchronized (mLock) {
             info.sessionId = sessionId;
+            info.userId = userId;
             info.installerPackageName = mInstallerPackageName;
             info.resolvedBaseCodePath = (mResolvedBaseFile != null) ?
                     mResolvedBaseFile.getAbsolutePath() : null;
@@ -1000,10 +1001,6 @@
         // cannot be modified anymore, there is no leak of information. For staged sessions,
         // further validation is performed by the staging manager.
         if (!params.isMultiPackage) {
-            if ((params.installFlags & PackageManager.INSTALL_APEX) != 0) {
-                // For APEX, validation is done by StagingManager post-commit.
-                return;
-            }
             final PackageInfo pkgInfo = mPm.getPackageInfo(
                     params.appPackageName, PackageManager.GET_SIGNATURES
                             | PackageManager.MATCH_STATIC_SHARED_LIBRARIES /*flags*/, userId);
@@ -1011,7 +1008,11 @@
             resolveStageDirLocked();
 
             try {
-                validateApkInstallLocked(pkgInfo);
+                if ((params.installFlags & PackageManager.INSTALL_APEX) != 0) {
+                    validateApexInstallLocked();
+                } else {
+                    validateApkInstallLocked(pkgInfo);
+                }
             } catch (PackageManagerException e) {
                 throw e;
             } catch (Throwable e) {
@@ -1303,6 +1304,27 @@
     }
 
     /**
+     * Validate apex install.
+     * <p>
+     * Sets {@link #mResolvedBaseFile} for RollbackManager to use.
+     */
+    @GuardedBy("mLock")
+    private void validateApexInstallLocked()
+            throws PackageManagerException {
+        final File[] addedFiles = mResolvedStageDir.listFiles(sAddedFilter);
+        if (ArrayUtils.isEmpty(addedFiles)) {
+            throw new PackageManagerException(INSTALL_FAILED_INVALID_APK, "No packages staged");
+        }
+
+        if (ArrayUtils.size(addedFiles) > 1) {
+            throw new PackageManagerException(INSTALL_FAILED_INVALID_APK,
+                    "Too many files for apex install");
+        }
+
+        mResolvedBaseFile = addedFiles[0];
+    }
+
+    /**
      * Validate install by confirming that all application packages are have
      * consistent package name, version code, and signing certificates.
      * <p>
@@ -1562,12 +1584,12 @@
                 }
             }
         }
-        if (baseApk.preferCodeIntegrity) {
+        if (baseApk.useEmbeddedDex) {
             for (File file : mResolvedStagedFiles) {
                 if (file.getName().endsWith(".apk")
-                        && !DexManager.auditUncompressedCodeInApk(file.getPath())) {
+                        && !DexManager.auditUncompressedDexInApk(file.getPath())) {
                     throw new PackageManagerException(INSTALL_FAILED_INVALID_APK,
-                            "Some code are not uncompressed and aligned correctly for "
+                            "Some dex are not uncompressed and aligned correctly for "
                             + mPackageName);
                 }
             }
@@ -1663,6 +1685,12 @@
         }
     }
 
+    String getInstallerPackageName() {
+        synchronized (mLock) {
+            return mInstallerPackageName;
+        }
+    }
+
     private static String getRelativePath(File file, File base) throws IOException {
         final String pathStr = file.getAbsolutePath();
         final String baseStr = base.getAbsolutePath();
@@ -1963,7 +1991,7 @@
 
         // Send broadcast to default launcher only if it's a new install
         final boolean isNewInstall = extras == null || !extras.getBoolean(Intent.EXTRA_REPLACING);
-        if (success && isNewInstall) {
+        if (success && isNewInstall && mPm.mInstallerService.isBootCompleted()) {
             mPm.sendSessionCommitBroadcast(generateInfo(), userId);
         }
 
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 6eff815..957fc4e 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -42,7 +42,6 @@
 import static android.content.pm.PackageManager.FLAG_PERMISSION_SYSTEM_FIXED;
 import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_FIXED;
 import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_SET;
-import static android.content.pm.PackageManager.INSTALL_ALLOW_DOWNGRADE;
 import static android.content.pm.PackageManager.INSTALL_FAILED_ALREADY_EXISTS;
 import static android.content.pm.PackageManager.INSTALL_FAILED_DUPLICATE_PACKAGE;
 import static android.content.pm.PackageManager.INSTALL_FAILED_DUPLICATE_PERMISSION;
@@ -202,8 +201,8 @@
 import android.content.pm.dex.ArtManager;
 import android.content.pm.dex.DexMetadataHelper;
 import android.content.pm.dex.IArtManager;
-import android.content.rollback.IRollbackManager;
 import android.content.res.Resources;
+import android.content.rollback.IRollbackManager;
 import android.database.ContentObserver;
 import android.graphics.Bitmap;
 import android.hardware.display.DisplayManager;
@@ -1351,6 +1350,7 @@
     final @Nullable String mDocumenterPackage;
     final @Nullable String mConfiguratorPackage;
     final @Nullable String mAppPredictionServicePackage;
+    final @Nullable String mIncidentReportApproverPackage;
     final @NonNull String mServicesSystemSharedLibraryPackageName;
     final @NonNull String mSharedSystemSharedLibraryPackageName;
 
@@ -2880,6 +2880,7 @@
             mConfiguratorPackage =
                     mContext.getString(R.string.config_deviceConfiguratorPackageName);
             mAppPredictionServicePackage = getAppPredictionServicePackageName();
+            mIncidentReportApproverPackage = getIncidentReportApproverPackageName();
 
             // Now that we know all of the shared libraries, update all clients to have
             // the correct library paths.
@@ -3966,6 +3967,7 @@
                     }
                     return generatePackageInfo(ps, flags, userId);
                 }
+                // TODO(b/123680735): support MATCH_APEX|MATCH_FACTORY_ONLY case
             }
 
             PackageParser.Package p = mPackages.get(packageName);
@@ -3995,6 +3997,30 @@
                 }
                 return generatePackageInfo(ps, flags, userId);
             }
+            //
+            if (!matchFactoryOnly && (flags & MATCH_APEX) != 0) {
+                //TODO(b/123052859) Don't do file operations every time there is a query.
+                final IApexService apex = IApexService.Stub.asInterface(
+                        ServiceManager.getService("apexservice"));
+                if (apex != null) {
+                    try {
+                        final ApexInfo activePkg = apex.getActivePackage(packageName);
+                        if (activePkg != null) {
+                            try {
+                                return PackageParser.generatePackageInfoFromApex(
+                                        new File(activePkg.packagePath), true /* collect certs */);
+                            } catch (PackageParserException pe) {
+                                throw new IllegalStateException("Unable to parse: " + activePkg,
+                                        pe);
+                            }
+                        }
+                    } catch (RemoteException e) {
+                        Log.e(TAG, "Unable to retrieve packages from apexservice: " + e.toString());
+                    }
+                } else {
+                    Log.e(TAG, "Unable to connect to apexservice for querying packages.");
+                }
+            }
         }
         return null;
     }
@@ -7888,6 +7914,8 @@
                 }
             }
             if (listApex) {
+                // TODO(b/119767311): include uninstalled/inactive APEX if
+                //  MATCH_UNINSTALLED_PACKAGES is set.
                 final IApexService apex = IApexService.Stub.asInterface(
                         ServiceManager.getService("apexservice"));
                 if (apex != null) {
@@ -13882,6 +13910,9 @@
 
             final String packageName = res.pkg.applicationInfo.packageName;
             final String seInfo = res.pkg.applicationInfo.seInfo;
+            final int[] allUsers = sUserManager.getUserIds();
+            final int[] installedUsers;
+
             final PackageSetting ps;
             int appId = -1;
             long ceDataInode = -1;
@@ -13891,11 +13922,16 @@
                     appId = ps.appId;
                     ceDataInode = ps.getCeDataInode(userId);
                 }
+
+                // NOTE: We ignore the user specified in the InstallParam because we know this is
+                // an update, and hence need to restore data for all installed users.
+                installedUsers = ps.queryInstalledUsers(allUsers, true);
             }
 
             if (ps != null) {
                 try {
-                    rm.restoreUserData(packageName, userId, appId, ceDataInode, seInfo, token);
+                    rm.restoreUserData(packageName, installedUsers, appId, ceDataInode,
+                            seInfo, token);
                 } catch (RemoteException re) {
                     // Cannot happen, the RollbackManager is hosted in the same process.
                 }
@@ -14592,6 +14628,17 @@
                             TRACE_TAG_PACKAGE_MANAGER, "enable_rollback", enableRollbackToken);
                     mPendingEnableRollback.append(enableRollbackToken, this);
 
+                    final int[] installedUsers;
+                    synchronized (mPackages) {
+                        PackageSetting ps = mSettings.getPackageLPr(pkgLite.packageName);
+                        if (ps != null) {
+                            installedUsers = ps.queryInstalledUsers(sUserManager.getUserIds(),
+                                    true);
+                        } else {
+                            installedUsers = new int[0];
+                        }
+                    }
+
                     // TODO(ruhler) b/112431924: What user? Test for multi-user.
                     Intent enableRollbackIntent = new Intent(Intent.ACTION_PACKAGE_ENABLE_ROLLBACK);
                     enableRollbackIntent.putExtra(
@@ -14602,7 +14649,7 @@
                             installFlags);
                     enableRollbackIntent.putExtra(
                             PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_INSTALLED_USERS,
-                            resolveUserIds(args.user.getIdentifier()));
+                            installedUsers);
                     enableRollbackIntent.setDataAndType(Uri.fromFile(new File(origin.resolvedPath)),
                             PACKAGE_MIME_TYPE);
                     enableRollbackIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
@@ -20081,7 +20128,8 @@
         return mContext.getString(R.string.config_defaultWellbeingPackage);
     }
 
-    private String getAppPredictionServicePackageName() {
+    @Override
+    public String getAppPredictionServicePackageName() {
         String flattenedAppPredictionServiceComponentName =
                 mContext.getString(R.string.config_defaultAppPredictionService);
         if (flattenedAppPredictionServiceComponentName == null) {
@@ -20096,6 +20144,28 @@
     }
 
     @Override
+    public String getContentCaptureServicePackageName() {
+        String contentCaptureServiceName =
+                mContext.getString(R.string.config_defaultContentCaptureService);
+
+        if (TextUtils.isEmpty(contentCaptureServiceName)) {
+            return null;
+        }
+
+        int separatorIndex = contentCaptureServiceName.indexOf("/");
+
+        if (separatorIndex < 0) {
+            return null;
+        }
+
+        return contentCaptureServiceName.substring(0, separatorIndex);
+    }
+
+    public String getIncidentReportApproverPackageName() {
+        return mContext.getString(R.string.config_incidentReportApproverPackage);
+    }
+
+    @Override
     public void setApplicationEnabledSetting(String appPackageName,
             int newState, int flags, int userId, String callingPackage) {
         if (!sUserManager.exists(userId)) return;
@@ -20710,6 +20780,11 @@
         }
 
         mModuleInfoProvider.systemReady();
+
+        // Installer service might attempt to install some packages that have been staged for
+        // installation on reboot. Make sure this is the last component to be call since the
+        // installation might require other components to be ready.
+        mInstallerService.restoreAndApplyStagedSessionIfNeeded();
     }
 
     public void waitForAppDataPrepared() {
@@ -23258,6 +23333,10 @@
                     return mDocumenterPackage;
                 case PackageManagerInternal.PACKAGE_CONFIGURATOR:
                     return mConfiguratorPackage;
+                case PackageManagerInternal.PACKAGE_INCIDENT_REPORT_APPROVER:
+                    return mIncidentReportApproverPackage;
+                case PackageManagerInternal.PACKAGE_APP_PREDICTOR:
+                    return mAppPredictionServicePackage;
             }
             return null;
         }
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index 6f1eeeb..dc18dfc 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -61,6 +61,10 @@
 import android.content.pm.dex.ISnapshotRuntimeProfileCallback;
 import android.content.res.AssetManager;
 import android.content.res.Resources;
+import android.content.rollback.IRollbackManager;
+import android.content.rollback.PackageRollbackInfo;
+import android.content.rollback.RollbackInfo;
+import android.content.rollback.RollbackManager;
 import android.net.Uri;
 import android.os.Binder;
 import android.os.Build;
@@ -263,6 +267,8 @@
                     return getStagedSessions();
                 case "uninstall-system-updates":
                     return uninstallSystemUpdates();
+                case "rollback-app":
+                    return runRollbackApp();
                 default: {
                     String nextArg = getNextArg();
                     if (nextArg == null) {
@@ -348,6 +354,55 @@
         return 1;
     }
 
+    private int runRollbackApp() {
+        final PrintWriter pw = getOutPrintWriter();
+
+        final String packageName = getNextArgRequired();
+        if (packageName == null) {
+            pw.println("Error: package name not specified");
+            return 1;
+        }
+
+        final LocalIntentReceiver receiver = new LocalIntentReceiver();
+        try {
+            IRollbackManager rm = IRollbackManager.Stub.asInterface(
+                    ServiceManager.getService(Context.ROLLBACK_SERVICE));
+
+            RollbackInfo rollback = null;
+            for (RollbackInfo r : (List<RollbackInfo>) rm.getAvailableRollbacks().getList()) {
+                for (PackageRollbackInfo info : r.getPackages()) {
+                    if (packageName.equals(info.getPackageName())) {
+                        rollback = r;
+                        break;
+                    }
+                }
+            }
+
+            if (rollback == null) {
+                pw.println("No available rollbacks for: " + packageName);
+                return 1;
+            }
+
+            rm.commitRollback(rollback.getRollbackId(),
+                    ParceledListSlice.<VersionedPackage>emptyList(),
+                    "com.android.shell", receiver.getIntentSender());
+        } catch (RemoteException re) {
+            // Cannot happen.
+        }
+
+        final Intent result = receiver.getResult();
+        final int status = result.getIntExtra(RollbackManager.EXTRA_STATUS,
+                RollbackManager.STATUS_FAILURE);
+        if (status == RollbackManager.STATUS_SUCCESS) {
+            pw.println("Success");
+            return 0;
+        } else {
+            pw.println("Failure ["
+                    + result.getStringExtra(RollbackManager.EXTRA_STATUS_MESSAGE) + "]");
+            return 1;
+        }
+    }
+
     private void setParamsSize(InstallParams params, String inPath) {
         if (params.sessionParams.sizeBytes == -1 && !STDIN_PATH.equals(inPath)) {
             final ParcelFileDescriptor fd = openFileForSystem(inPath, "r");
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index 792b34c..ff6d7a8 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -2154,6 +2154,8 @@
     public ParceledListSlice<ShortcutManager.ShareShortcutInfo> getShareTargets(String packageName,
             IntentFilter filter, @UserIdInt int userId) {
         verifyCaller(packageName, userId);
+        enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_APP_PREDICTIONS,
+                "getShareTargets");
 
         synchronized (mLock) {
             throwIfUserLockedL(userId);
diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java
index c4d27e5..84fd01a 100644
--- a/services/core/java/com/android/server/pm/StagingManager.java
+++ b/services/core/java/com/android/server/pm/StagingManager.java
@@ -21,6 +21,10 @@
 import android.apex.ApexInfoList;
 import android.apex.ApexSessionInfo;
 import android.apex.IApexService;
+import android.content.IIntentReceiver;
+import android.content.IIntentSender;
+import android.content.Intent;
+import android.content.IntentSender;
 import android.content.pm.PackageInstaller;
 import android.content.pm.PackageInstaller.SessionInfo;
 import android.content.pm.PackageManager;
@@ -29,7 +33,10 @@
 import android.content.pm.PackageParser.SigningDetails.SignatureSchemeVersion;
 import android.content.pm.ParceledListSlice;
 import android.content.pm.Signature;
+import android.os.Bundle;
 import android.os.Handler;
+import android.os.IBinder;
+import android.os.ParcelFileDescriptor;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.text.TextUtils;
@@ -40,9 +47,13 @@
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.os.BackgroundThread;
 
+import java.io.File;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -53,14 +64,16 @@
 
     private static final String TAG = "StagingManager";
 
+    private final PackageInstallerService mPi;
     private final PackageManagerService mPm;
     private final Handler mBgHandler;
 
     @GuardedBy("mStagedSessions")
     private final SparseArray<PackageInstallerSession> mStagedSessions = new SparseArray<>();
 
-    StagingManager(PackageManagerService pm) {
+    StagingManager(PackageManagerService pm, PackageInstallerService pi) {
         mPm = pm;
+        mPi = pi;
         mBgHandler = BackgroundThread.getHandler();
     }
 
@@ -85,7 +98,7 @@
         return new ParceledListSlice<>(result);
     }
 
-    private static boolean validateApexSignatureLocked(String apexPath, String packageName) {
+    private static boolean validateApexSignature(String apexPath, String packageName) {
         final SigningDetails signingDetails;
         try {
             signingDetails = ApkSignatureVerifier.verify(apexPath, SignatureSchemeVersion.JAR);
@@ -173,6 +186,13 @@
     private void preRebootVerification(@NonNull PackageInstallerSession session) {
         boolean success = true;
 
+        if (!sessionContainsApex(session)) {
+            // TODO: Decide whether we want to fail fast by detecting signature mismatches for APKs,
+            // right away.
+            session.setStagedSessionReady();
+            return;
+        }
+
         final ApexInfoList apexInfoList = new ApexInfoList();
         // APEX checks. For single-package sessions, check if they contain an APEX. For
         // multi-package sessions, find all the child sessions that contain an APEX.
@@ -199,16 +219,13 @@
                     "APEX staging failed, check logcat messages from apexd for more details.");
         }
 
-        if (apexInfoList.apexInfos.length > 0) {
+        if (apexInfoList.apexInfos != null && apexInfoList.apexInfos.length > 0) {
             // For APEXes, we validate the signature here before we mark the session as ready,
             // so we fail the session early if there is a signature mismatch. For APKs, the
             // signature verification will be done by the package manager at the point at which
             // it applies the staged install.
-            //
-            // TODO: Decide whether we want to fail fast by detecting signature mismatches for APKs,
-            // right away.
             for (ApexInfo apexPackage : apexInfoList.apexInfos) {
-                if (!validateApexSignatureLocked(apexPackage.packagePath,
+                if (!validateApexSignature(apexPackage.packagePath,
                         apexPackage.packageName)) {
                     session.setStagedSessionFailed(SessionInfo.VERIFICATION_FAILED,
                             "APK-container signature verification failed for package "
@@ -229,35 +246,182 @@
         }
     }
 
+    private boolean sessionContainsApex(@NonNull PackageInstallerSession session) {
+        if (!session.isMultiPackage()) {
+            return isApexSession(session);
+        }
+        synchronized (mStagedSessions) {
+            return !(Arrays.stream(session.getChildSessionIds())
+                    // Retrieve cached sessions matching ids.
+                    .mapToObj(i -> mStagedSessions.get(i))
+                    // Filter only the ones containing APEX.
+                    .filter(childSession -> isApexSession(childSession))
+                    .collect(Collectors.toList())
+                    .isEmpty());
+        }
+    }
+
     private void resumeSession(@NonNull PackageInstallerSession session) {
-        // Check with apexservice whether the apex
-        // packages have been activated.
-        final IApexService apex = IApexService.Stub.asInterface(
-                ServiceManager.getService("apexservice"));
-        ApexSessionInfo apexSessionInfo;
-        try {
-            apexSessionInfo = apex.getStagedSessionInfo(session.sessionId);
-        } catch (RemoteException re) {
-            Slog.e(TAG, "Unable to contact apexservice", re);
-            // TODO should we retry here? Mark the session as failed?
+        if (sessionContainsApex(session)) {
+            // Check with apexservice whether the apex
+            // packages have been activated.
+            final IApexService apex = IApexService.Stub.asInterface(
+                    ServiceManager.getService("apexservice"));
+            ApexSessionInfo apexSessionInfo;
+            try {
+                apexSessionInfo = apex.getStagedSessionInfo(session.sessionId);
+            } catch (RemoteException re) {
+                Slog.e(TAG, "Unable to contact apexservice", re);
+                // TODO should we retry here? Mark the session as failed?
+                return;
+            }
+            if (apexSessionInfo.isActivationFailed || apexSessionInfo.isUnknown) {
+                session.setStagedSessionFailed(SessionInfo.ACTIVATION_FAILED,
+                        "APEX activation failed. Check logcat messages from apexd for "
+                                + "more information.");
+                return;
+            }
+            if (apexSessionInfo.isVerified) {
+                // Session has been previously submitted to apexd, but didn't complete all the
+                // pre-reboot verification, perhaps because the device rebooted in the meantime.
+                // Greedily re-trigger the pre-reboot verification.
+                Slog.d(TAG, "Found pending staged session " + session.sessionId + " still to be "
+                        + "verified, resuming pre-reboot verification");
+                mBgHandler.post(() -> preRebootVerification(session));
+                return;
+            }
+            if (!apexSessionInfo.isActivated) {
+                // In all the remaining cases apexd will try to apply the session again at next
+                // boot. Nothing to do here for now.
+                Slog.w(TAG, "Staged session " + session.sessionId + " scheduled to be applied "
+                        + "at boot didn't activate nor fail. This usually means that apexd will "
+                        + "retry at next reboot.");
+                return;
+            }
+        }
+        // The APEX part of the session is activated, proceed with the installation of APKs.
+        if (!installApksInSession(session)) {
+            session.setStagedSessionFailed(SessionInfo.ACTIVATION_FAILED,
+                    "APK installation for staged session " + session.sessionId + " failed.");
             return;
         }
-        if (apexSessionInfo.isActivationFailed || apexSessionInfo.isUnknown) {
-            session.setStagedSessionFailed(SessionInfo.ACTIVATION_FAILED,
-                    "APEX activation failed. Check logcat messages from apexd for "
-                                  + "more information.");
+        session.setStagedSessionApplied();
+    }
+
+    private String findFirstAPKInDir(File stageDir) {
+        if (stageDir != null && stageDir.exists()) {
+            for (File file : stageDir.listFiles()) {
+                if (file.getAbsolutePath().toLowerCase().endsWith(".apk")) {
+                    return file.getAbsolutePath();
+                }
+            }
         }
-        if (apexSessionInfo.isVerified) {
-            // Session has been previously submitted to apexd, but didn't complete all the
-            // pre-reboot verification, perhaps because the device rebooted in the meantime.
-            // Greedily re-trigger the pre-reboot verification.
-            mBgHandler.post(() -> preRebootVerification(session));
+        return null;
+    }
+
+    private PackageInstallerSession createAndWriteApkSession(
+            @NonNull PackageInstallerSession originalSession) {
+        // TODO(b/123629153): support split APKs.
+        if (originalSession.stageDir == null) {
+            Slog.wtf(TAG, "Attempting to install a staged APK session with no staging dir");
+            return null;
         }
-        if (apexSessionInfo.isActivated) {
-            session.setStagedSessionApplied();
-            // TODO(b/118865310) if multi-package proceed with the installation of APKs.
+        String apkFilePath = findFirstAPKInDir(originalSession.stageDir);
+        if (apkFilePath == null) {
+            Slog.w(TAG, "Can't find staged APK in " + originalSession.stageDir.getAbsolutePath());
+            return null;
         }
-        // In every other case apexd will retry to apply the session at next boot.
+        File apkFile = new File(apkFilePath);
+
+        PackageInstaller.SessionParams params = originalSession.params.copy();
+        params.isStaged = false;
+        int apkSessionId = mPi.createSession(
+                params, originalSession.getInstallerPackageName(), originalSession.userId);
+        PackageInstallerSession apkSession = mPi.getSession(apkSessionId);
+
+        try {
+            apkSession.open();
+            ParcelFileDescriptor pfd = ParcelFileDescriptor.open(apkFile,
+                    ParcelFileDescriptor.MODE_READ_ONLY);
+            long sizeBytes = pfd.getStatSize();
+            if (sizeBytes < 0) {
+                Slog.e(TAG, "Unable to get size of: " + apkFilePath);
+                return null;
+            }
+            apkSession.write(apkFile.getName(), 0, sizeBytes, pfd);
+        } catch (IOException e) {
+            Slog.e(TAG, "Failure to install APK staged session " + originalSession.sessionId, e);
+            return null;
+        }
+        return apkSession;
+    }
+
+    private boolean commitApkSession(@NonNull PackageInstallerSession apkSession,
+                                     int originalSessionId) {
+        final LocalIntentReceiver receiver = new LocalIntentReceiver();
+        apkSession.commit(receiver.getIntentSender(), false);
+        final Intent result = receiver.getResult();
+        final int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS,
+                PackageInstaller.STATUS_FAILURE);
+        if (status == PackageInstaller.STATUS_SUCCESS) {
+            return true;
+        }
+        Slog.e(TAG, "Failure to install APK staged session " + originalSessionId + " ["
+                + result.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE) + "]");
+        return false;
+    }
+
+    private boolean installApksInSession(@NonNull PackageInstallerSession session) {
+        if (!session.isMultiPackage() && !isApexSession(session)) {
+            // APK single-packaged staged session. Do a regular install.
+            PackageInstallerSession apkSession = createAndWriteApkSession(session);
+            if (apkSession == null) {
+                return false;
+            }
+            return commitApkSession(apkSession, session.sessionId);
+        } else if (session.isMultiPackage()) {
+            // For multi-package staged sessions containing APKs, we identify which child sessions
+            // contain an APK, and with those then create a new multi-package group of sessions,
+            // carrying over all the session parameters and unmarking them as staged. On commit the
+            // sessions will be installed atomically.
+            List<PackageInstallerSession> childSessions;
+            synchronized (mStagedSessions) {
+                childSessions =
+                        Arrays.stream(session.getChildSessionIds())
+                                // Retrieve cached sessions matching ids.
+                                .mapToObj(i -> mStagedSessions.get(i))
+                                // Filter only the ones containing APKs.s
+                                .filter(childSession -> !isApexSession(childSession))
+                                .collect(Collectors.toList());
+            }
+            if (childSessions.isEmpty()) {
+                // APEX-only multi-package staged session, nothing to do.
+                return true;
+            }
+            PackageInstaller.SessionParams params = session.params.copy();
+            params.isStaged = false;
+            int apkParentSessionId = mPi.createSession(
+                    params, session.getInstallerPackageName(), session.userId);
+            PackageInstallerSession apkParentSession = mPi.getSession(apkParentSessionId);
+            try {
+                apkParentSession.open();
+            } catch (IOException e) {
+                Slog.e(TAG, "Unable to prepare multi-package session for staged session "
+                        + session.sessionId);
+                return false;
+            }
+
+            for (PackageInstallerSession sessionToClone : childSessions) {
+                PackageInstallerSession apkChildSession = createAndWriteApkSession(sessionToClone);
+                if (apkChildSession == null) {
+                    return false;
+                }
+                apkParentSession.addChildSessionId(apkChildSession.sessionId);
+            }
+            return commitApkSession(apkParentSession, session.sessionId);
+        }
+        // APEX single-package staged session, nothing to do.
+        return true;
     }
 
     void commitSession(@NonNull PackageInstallerSession session) {
@@ -336,9 +500,36 @@
         } else {
             // Session had already being marked ready. Start the checks to verify if there is any
             // follow-up work.
-            // TODO(b/118865310): should this be synchronous to ensure it completes before
-            //                    systemReady() finishes?
-            mBgHandler.post(() -> resumeSession(session));
+            resumeSession(session);
+        }
+    }
+
+    private static class LocalIntentReceiver {
+        private final LinkedBlockingQueue<Intent> mResult = new LinkedBlockingQueue<>();
+
+        private IIntentSender.Stub mLocalSender = new IIntentSender.Stub() {
+            @Override
+            public void send(int code, Intent intent, String resolvedType, IBinder whitelistToken,
+                             IIntentReceiver finishedReceiver, String requiredPermission,
+                             Bundle options) {
+                try {
+                    mResult.offer(intent, 5, TimeUnit.SECONDS);
+                } catch (InterruptedException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        };
+
+        public IntentSender getIntentSender() {
+            return new IntentSender((IIntentSender) mLocalSender);
+        }
+
+        public Intent getResult() {
+            try {
+                return mResult.take();
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
         }
     }
 }
diff --git a/services/core/java/com/android/server/pm/TEST_MAPPING b/services/core/java/com/android/server/pm/TEST_MAPPING
new file mode 100644
index 0000000..a2e98cc
--- /dev/null
+++ b/services/core/java/com/android/server/pm/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+  "imports": [
+    {
+      "path": "system/apex/tests"
+    }
+  ]
+}
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 4f20590..d0f192d 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -1109,14 +1109,7 @@
 
     @Override
     public int getManagedProfileBadge(@UserIdInt int userId) {
-        int callingUserId = UserHandle.getCallingUserId();
-        if (callingUserId != userId && !hasManageUsersPermission()) {
-            if (!isSameProfileGroupNoChecks(callingUserId, userId)) {
-                throw new SecurityException(
-                        "You need MANAGE_USERS permission to: check if specified user a " +
-                        "managed profile outside your profile group");
-            }
-        }
+        checkManageOrInteractPermIfCallerInOtherProfileGroup(userId, "getManagedProfileBadge");
         synchronized (mUsersLock) {
             UserInfo userInfo = getUserInfoLU(userId);
             return userInfo != null ? userInfo.profileBadge : 0;
@@ -1125,14 +1118,7 @@
 
     @Override
     public boolean isManagedProfile(int userId) {
-        int callingUserId = UserHandle.getCallingUserId();
-        if (callingUserId != userId && !hasManageUsersPermission()) {
-            if (!isSameProfileGroupNoChecks(callingUserId, userId)) {
-                throw new SecurityException(
-                        "You need MANAGE_USERS permission to: check if specified user a " +
-                        "managed profile outside your profile group");
-            }
-        }
+        checkManageOrInteractPermIfCallerInOtherProfileGroup(userId, "isManagedProfile");
         synchronized (mUsersLock) {
             UserInfo userInfo = getUserInfoLU(userId);
             return userInfo != null && userInfo.isManagedProfile();
diff --git a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
index 2455113..8d64b81 100644
--- a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
+++ b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
@@ -16,10 +16,6 @@
 
 package com.android.server.pm;
 
-import com.google.android.collect.Sets;
-
-import com.android.internal.util.Preconditions;
-
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.ActivityManager;
@@ -42,6 +38,10 @@
 import android.util.Slog;
 import android.util.SparseArray;
 
+import com.android.internal.util.Preconditions;
+
+import com.google.android.collect.Sets;
+
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlSerializer;
 
@@ -666,6 +666,7 @@
 
             case android.provider.Settings.Secure.ALWAYS_ON_VPN_APP:
             case android.provider.Settings.Secure.ALWAYS_ON_VPN_LOCKDOWN:
+            case android.provider.Settings.Secure.ALWAYS_ON_VPN_LOCKDOWN_WHITELIST:
                 // Whitelist system uid (ConnectivityService) and root uid to change always-on vpn
                 final int appId = UserHandle.getAppId(callingUid);
                 if (appId == Process.SYSTEM_UID || appId == Process.ROOT_UID) {
diff --git a/services/core/java/com/android/server/pm/dex/ArtManagerService.java b/services/core/java/com/android/server/pm/dex/ArtManagerService.java
index 863bfd5..23705db 100644
--- a/services/core/java/com/android/server/pm/dex/ArtManagerService.java
+++ b/services/core/java/com/android/server/pm/dex/ArtManagerService.java
@@ -480,6 +480,12 @@
             final String apkPath = pkg.baseCodePath;
             final ApplicationInfo appInfo = pkg.applicationInfo;
             final String outDexFile = appInfo.dataDir + "/code_cache/compiled_view.dex";
+            if (appInfo.isPrivilegedApp() || appInfo.isEmbeddedDexUsed()) {
+                // Privileged apps prefer to load trusted code so they don't use compiled views.
+                // If the app is not privileged but prefers code integrity, also avoid compiling
+                // views.
+                return false;
+            }
             Log.i("PackageManager", "Compiling layouts in " + packageName + " (" + apkPath +
                     ") to " + outDexFile);
             long callingId = Binder.clearCallingIdentity();
diff --git a/services/core/java/com/android/server/pm/dex/DexManager.java b/services/core/java/com/android/server/pm/dex/DexManager.java
index 7ac7395..2213901 100644
--- a/services/core/java/com/android/server/pm/dex/DexManager.java
+++ b/services/core/java/com/android/server/pm/dex/DexManager.java
@@ -16,7 +16,7 @@
 
 package com.android.server.pm.dex;
 
-import static android.provider.DeviceConfig.FsiBoot;
+import static android.provider.DeviceConfig.DexBoot;
 
 import static com.android.server.pm.InstructionSets.getAppDexInstructionSets;
 import static com.android.server.pm.dex.PackageDexUsage.DexUseInfo;
@@ -710,8 +710,8 @@
         return isPackageSelectedToRunOobInternal(
                 SystemProperties.getBoolean(PROPERTY_NAME_PM_DEXOPT_PRIV_APPS_OOB, false),
                 SystemProperties.get(PROPERTY_NAME_PM_DEXOPT_PRIV_APPS_OOB_LIST, "ALL"),
-                DeviceConfig.getProperty(FsiBoot.NAMESPACE, FsiBoot.OOB_ENABLED),
-                DeviceConfig.getProperty(FsiBoot.NAMESPACE, FsiBoot.OOB_WHITELIST),
+                DeviceConfig.getProperty(DexBoot.NAMESPACE, DexBoot.PRIV_APPS_OOB_ENABLED),
+                DeviceConfig.getProperty(DexBoot.NAMESPACE, DexBoot.PRIV_APPS_OOB_WHITELIST),
                 packageNamesInSameProcess);
     }
 
@@ -740,10 +740,10 @@
     }
 
     /**
-     * Generates log if the archive located at {@code fileName} has uncompressed dex file and so
-     * files that can be direclty mapped.
+     * Generates log if the archive located at {@code fileName} has uncompressed dex file that can
+     * be direclty mapped.
      */
-    public static boolean auditUncompressedCodeInApk(String fileName) {
+    public static boolean auditUncompressedDexInApk(String fileName) {
         StrictJarFile jarFile = null;
         try {
             jarFile = new StrictJarFile(fileName,
@@ -762,16 +762,6 @@
                         Slog.w(TAG, "APK " + fileName + " has unaligned dex code " +
                                 entry.getName());
                     }
-                } else if (entry.getName().endsWith(".so")) {
-                    if (entry.getMethod() != ZipEntry.STORED) {
-                        allCorrect = false;
-                        Slog.w(TAG, "APK " + fileName + " has compressed native code " +
-                                entry.getName());
-                    } else if ((entry.getDataOffset() & (0x1000 - 1)) != 0) {
-                        allCorrect = false;
-                        Slog.w(TAG, "APK " + fileName + " has unaligned native code " +
-                                entry.getName());
-                    }
                 }
             }
             return allCorrect;
diff --git a/services/core/java/com/android/server/pm/permission/BasePermission.java b/services/core/java/com/android/server/pm/permission/BasePermission.java
index 17f8347..173d9a0 100644
--- a/services/core/java/com/android/server/pm/permission/BasePermission.java
+++ b/services/core/java/com/android/server/pm/permission/BasePermission.java
@@ -251,6 +251,12 @@
         return (protectionLevel & PermissionInfo.PROTECTION_FLAG_CONFIGURATOR)
             != 0;
     }
+    public boolean isIncidentReportApprover() {
+        return (protectionLevel & PermissionInfo.PROTECTION_FLAG_INCIDENT_REPORT_APPROVER) != 0;
+    }
+    public boolean isAppPredictor() {
+        return (protectionLevel & PermissionInfo.PROTECTION_FLAG_APP_PREDICTOR) != 0;
+    }
 
     public void transfer(@NonNull String origPackageName, @NonNull String newPackageName) {
         if (!origPackageName.equals(sourcePackageName)) {
diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
index 20d6d4e..bfa539c 100644
--- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
@@ -737,6 +737,14 @@
         grantSystemFixedPermissionsToSystemPackage("com.android.sharedstoragebackup", userId,
                 STORAGE_PERMISSIONS);
 
+        // Content Capture Service
+        String contentCaptureServicePackageName =
+                mContext.getPackageManager().getContentCaptureServicePackageName();
+        if (!TextUtils.isEmpty(contentCaptureServicePackageName)) {
+            grantPermissionsToSystemPackage(contentCaptureServicePackageName, userId,
+                    MICROPHONE_PERMISSIONS);
+        }
+
         if (mPermissionGrantedCallback != null) {
             mPermissionGrantedCallback.onDefaultRuntimePermissionsGranted(userId);
         }
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 3c89d78..a4413f9 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -1716,6 +1716,20 @@
                 // this app is the documenter, then it gets the permission.
                 allowed = true;
             }
+            if (!allowed && bp.isIncidentReportApprover()
+                    && pkg.packageName.equals(mPackageManagerInt.getKnownPackageName(
+                            PackageManagerInternal.PACKAGE_INCIDENT_REPORT_APPROVER,
+                            UserHandle.USER_SYSTEM))) {
+                // If this permission is to be granted to the incident report approver and
+                // this app is the incident report approver, then it gets the permission.
+                allowed = true;
+            }
+            if (!allowed && bp.isAppPredictor()
+                    && pkg.packageName.equals(mPackageManagerInt.getKnownPackageName(
+                        PackageManagerInternal.PACKAGE_APP_PREDICTOR, UserHandle.USER_SYSTEM))) {
+                // Special permissions for the system app predictor.
+                allowed = true;
+            }
         }
         return allowed;
     }
diff --git a/services/core/java/com/android/server/policy/DisplayFoldController.java b/services/core/java/com/android/server/policy/DisplayFoldController.java
new file mode 100644
index 0000000..fdcafa7
--- /dev/null
+++ b/services/core/java/com/android/server/policy/DisplayFoldController.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.policy;
+
+import android.content.Context;
+import android.graphics.Rect;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
+import android.hardware.display.DisplayManagerInternal;
+import android.os.Handler;
+import android.os.RemoteCallbackList;
+import android.os.RemoteException;
+import android.view.DisplayInfo;
+import android.view.IDisplayFoldListener;
+
+import com.android.server.DisplayThread;
+import com.android.server.LocalServices;
+import com.android.server.wm.WindowManagerInternal;
+
+/**
+ * Controls the behavior of foldable devices whose screen can literally bend and fold.
+ */
+class DisplayFoldController {
+
+    private static final String TAG = "DisplayFoldController";
+    private final WindowManagerInternal mWindowManagerInternal;
+    private final DisplayManagerInternal mDisplayManagerInternal;
+    private final int mDisplayId;
+
+    /** The display area while device is folded. */
+    private final Rect mFoldedArea;
+    private final Handler mHandler;
+
+    private final DisplayInfo mNonOverrideDisplayInfo = new DisplayInfo();
+    private final RemoteCallbackList<IDisplayFoldListener> mListeners = new RemoteCallbackList<>();
+    private Boolean mFolded;
+
+    DisplayFoldController(WindowManagerInternal windowManagerInternal,
+            DisplayManagerInternal displayManagerInternal, int displayId, Rect foldedArea,
+            Handler handler) {
+        mWindowManagerInternal = windowManagerInternal;
+        mDisplayManagerInternal = displayManagerInternal;
+        mDisplayId = displayId;
+        mFoldedArea = new Rect(foldedArea);
+        mHandler = handler;
+    }
+
+    void requestDeviceFolded(boolean folded) {
+        mHandler.post(() -> setDeviceFolded(folded));
+    }
+
+    void setDeviceFolded(boolean folded) {
+        if (mFolded != null && mFolded == folded) {
+            return;
+        }
+        if (folded) {
+            mDisplayManagerInternal.getNonOverrideDisplayInfo(mDisplayId, mNonOverrideDisplayInfo);
+            final int dx = (mNonOverrideDisplayInfo.logicalWidth - mFoldedArea.width()) / 2
+                    - mFoldedArea.left;
+            final int dy = (mNonOverrideDisplayInfo.logicalHeight - mFoldedArea.height()) / 2
+                    - mFoldedArea.top;
+
+            mWindowManagerInternal.setForcedDisplaySize(mDisplayId, mFoldedArea.width(),
+                    mFoldedArea.height());
+            mDisplayManagerInternal.setDisplayOffsets(mDisplayId, -dx, -dy);
+        } else {
+            mWindowManagerInternal.clearForcedDisplaySize(mDisplayId);
+            mDisplayManagerInternal.setDisplayOffsets(mDisplayId, 0, 0);
+        }
+        mFolded = folded;
+
+        final int n = mListeners.beginBroadcast();
+        for (int i = 0; i < n; i++) {
+            try {
+                mListeners.getBroadcastItem(i).onDisplayFoldChanged(mDisplayId, folded);
+            } catch (RemoteException e) {
+                // Listener died.
+            }
+        }
+        mListeners.finishBroadcast();
+    }
+
+    void registerDisplayFoldListener(IDisplayFoldListener listener) {
+        mListeners.register(listener);
+        if (mFolded == null) {
+            return;
+        }
+        mHandler.post(() -> {
+            try {
+                listener.onDisplayFoldChanged(mDisplayId, mFolded);
+            } catch (RemoteException e) {
+                // Listener died.
+            }
+        });
+    }
+
+    void unregisterDisplayFoldListener(IDisplayFoldListener listener) {
+        mListeners.unregister(listener);
+    }
+
+    /**
+     * Only used for the case that persist.debug.force_foldable is set.
+     * This is using proximity sensor to simulate the fold state switch.
+     */
+    static DisplayFoldController createWithProxSensor(Context context, int displayId) {
+        final SensorManager sensorManager = context.getSystemService(SensorManager.class);
+        final Sensor proxSensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
+        if (proxSensor == null) {
+            return null;
+        }
+
+        final DisplayFoldController result = create(displayId);
+        sensorManager.registerListener(new SensorEventListener() {
+            @Override
+            public void onSensorChanged(SensorEvent event) {
+                result.requestDeviceFolded(event.values[0] < 1f);
+            }
+
+            @Override
+            public void onAccuracyChanged(Sensor sensor, int accuracy) {
+                // Ignore.
+            }
+        }, proxSensor, SensorManager.SENSOR_DELAY_NORMAL);
+
+        return result;
+    }
+
+    static DisplayFoldController create(int displayId) {
+        final DisplayManagerInternal displayService =
+                LocalServices.getService(DisplayManagerInternal.class);
+        final DisplayInfo displayInfo = new DisplayInfo();
+        displayService.getNonOverrideDisplayInfo(displayId, displayInfo);
+        final Rect foldedArea = new Rect(0, displayInfo.logicalHeight / 2,
+                displayInfo.logicalWidth, displayInfo.logicalHeight);
+
+        return new DisplayFoldController(LocalServices.getService(WindowManagerInternal.class),
+                displayService, displayId, foldedArea, DisplayThread.getHandler());
+    }
+}
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 13c4d88..0796a9c 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -177,6 +177,7 @@
 import android.util.proto.ProtoOutputStream;
 import android.view.Display;
 import android.view.HapticFeedbackConstants;
+import android.view.IDisplayFoldListener;
 import android.view.IWindowManager;
 import android.view.InputDevice;
 import android.view.KeyCharacterMap;
@@ -374,6 +375,7 @@
     SearchManager mSearchManager;
     AccessibilityManager mAccessibilityManager;
     BurnInProtectionHelper mBurnInProtectionHelper;
+    private DisplayFoldController mDisplayFoldController;
     AppOpsManager mAppOpsManager;
     private ScreenshotHelper mScreenshotHelper;
     private boolean mHasFeatureWatch;
@@ -471,6 +473,7 @@
     int mLidNavigationAccessibility;
     boolean mLidControlsScreenLock;
     boolean mLidControlsSleep;
+    private boolean mLidControlsDisplayFold;
     int mShortPressOnPowerBehavior;
     int mLongPressOnPowerBehavior;
     int mVeryLongPressOnPowerBehavior;
@@ -1794,6 +1797,8 @@
                 com.android.internal.R.bool.config_lidControlsScreenLock);
         mLidControlsSleep = mContext.getResources().getBoolean(
                 com.android.internal.R.bool.config_lidControlsSleep);
+        mLidControlsDisplayFold = mContext.getResources().getBoolean(
+                com.android.internal.R.bool.config_lidControlsDisplayFold);
 
         mAllowTheaterModeWakeFromKey = mContext.getResources().getBoolean(
                 com.android.internal.R.bool.config_allowTheaterModeWakeFromKey);
@@ -1850,6 +1855,13 @@
 
         readConfigurationDependentBehaviors();
 
+        if (mLidControlsDisplayFold) {
+            mDisplayFoldController = DisplayFoldController.create(DEFAULT_DISPLAY);
+        } else if (SystemProperties.getBoolean("persist.debug.force_foldable", false)) {
+            mDisplayFoldController = DisplayFoldController.createWithProxSensor(context,
+                    DEFAULT_DISPLAY);
+        }
+
         mAccessibilityManager = (AccessibilityManager) context.getSystemService(
                 Context.ACCESSIBILITY_SERVICE);
 
@@ -3194,6 +3206,20 @@
     }
 
     @Override
+    public void registerDisplayFoldListener(IDisplayFoldListener listener) {
+        if (mDisplayFoldController != null) {
+            mDisplayFoldController.registerDisplayFoldListener(listener);
+        }
+    }
+
+    @Override
+    public void unregisterDisplayFoldListener(IDisplayFoldListener listener) {
+        if (mDisplayFoldController != null) {
+            mDisplayFoldController.unregisterDisplayFoldListener(listener);
+        }
+    }
+
+    @Override
     public void registerShortcutKey(long shortcutCode, IShortcutService shortcutService)
             throws RemoteException {
         synchronized (mLock) {
@@ -4972,7 +4998,9 @@
 
     private void applyLidSwitchState() {
         final int lidState = mDefaultDisplayPolicy.getLidState();
-        if (lidState == LID_CLOSED && mLidControlsSleep) {
+        if (mLidControlsDisplayFold && mDisplayFoldController != null) {
+            mDisplayFoldController.requestDeviceFolded(lidState == LID_CLOSED);
+        } else if (lidState == LID_CLOSED && mLidControlsSleep) {
             goToSleep(SystemClock.uptimeMillis(), PowerManager.GO_TO_SLEEP_REASON_LID_SWITCH,
                     PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);
         } else if (lidState == LID_CLOSED && mLidControlsScreenLock) {
diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
index 1d82970..e18cd17 100644
--- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java
+++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
@@ -78,6 +78,7 @@
 import android.util.proto.ProtoOutputStream;
 import android.view.Display;
 import android.view.IApplicationToken;
+import android.view.IDisplayFoldListener;
 import android.view.IWindowManager;
 import android.view.InputEventReceiver;
 import android.view.KeyEvent;
@@ -1457,6 +1458,16 @@
     public void requestUserActivityNotification();
 
     /**
+     * Registers an IDisplayFoldListener.
+     */
+    default void registerDisplayFoldListener(IDisplayFoldListener listener) {}
+
+    /**
+     * Unregisters an IDisplayFoldListener.
+     */
+    default void unregisterDisplayFoldListener(IDisplayFoldListener listener) {}
+
+    /**
      * Updates the flag about whether AOD is showing.
      *
      * @return whether the value was changed.
diff --git a/services/core/java/com/android/server/policy/role/LegacyRoleResolutionPolicy.java b/services/core/java/com/android/server/policy/role/LegacyRoleResolutionPolicy.java
index 7f2dedb..bfe7725 100644
--- a/services/core/java/com/android/server/policy/role/LegacyRoleResolutionPolicy.java
+++ b/services/core/java/com/android/server/policy/role/LegacyRoleResolutionPolicy.java
@@ -22,6 +22,8 @@
 import android.content.Context;
 import android.os.Debug;
 import android.provider.Settings;
+import android.telecom.TelecomManager;
+import android.text.TextUtils;
 import android.util.Log;
 import android.util.Slog;
 
@@ -102,6 +104,15 @@
                             ComponentName.unflattenFromString(legacyAssistant).getPackageName());
                 }
             }
+            case RoleManager.ROLE_DIALER: {
+                String setting = Settings.Secure.getStringForUser(
+                        mContext.getContentResolver(),
+                        Settings.Secure.DIALER_DEFAULT_APPLICATION, userId);
+
+                return CollectionUtils.singletonOrEmpty(!TextUtils.isEmpty(setting)
+                        ? setting
+                        : mContext.getSystemService(TelecomManager.class).getSystemDialerPackage());
+            }
             default: {
                 Slog.e(LOG_TAG, "Don't know how to find legacy role holders for " + roleName);
                 return Collections.emptyList();
diff --git a/services/core/java/com/android/server/power/AttentionDetector.java b/services/core/java/com/android/server/power/AttentionDetector.java
index a2c8dac..4186154 100644
--- a/services/core/java/com/android/server/power/AttentionDetector.java
+++ b/services/core/java/com/android/server/power/AttentionDetector.java
@@ -24,11 +24,13 @@
 import android.os.SystemClock;
 import android.service.attention.AttentionService;
 import android.util.Slog;
+import android.util.StatsLog;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.server.LocalServices;
 
 import java.io.PrintWriter;
+import java.util.concurrent.atomic.AtomicLong;
 
 /**
  * Class responsible for checking if the user is currently paying attention to the phone and
@@ -79,6 +81,11 @@
      */
     private int mWakefulness;
 
+    /**
+     * Describes how many times in a row was the timeout extended.
+     */
+    private AtomicLong mConsecutiveTimeoutExtendedCount = new AtomicLong(0);
+
     @VisibleForTesting
     final AttentionCallbackInternal mCallback = new AttentionCallbackInternal() {
 
@@ -95,6 +102,8 @@
                     }
                     if (result == AttentionService.ATTENTION_SUCCESS_PRESENT) {
                         mOnUserAttention.run();
+                    } else {
+                        resetConsecutiveExtensionCount();
                     }
                 }
             }
@@ -176,6 +185,7 @@
     public int onUserActivity(long eventTime, int event) {
         switch (event) {
             case PowerManager.USER_ACTIVITY_EVENT_ATTENTION:
+                mConsecutiveTimeoutExtendedCount.incrementAndGet();
                 return 0;
             case PowerManager.USER_ACTIVITY_EVENT_OTHER:
             case PowerManager.USER_ACTIVITY_EVENT_BUTTON:
@@ -183,6 +193,7 @@
             case PowerManager.USER_ACTIVITY_EVENT_ACCESSIBILITY:
                 cancelCurrentRequestIfAny();
                 mLastUserActivityTime = eventTime;
+                resetConsecutiveExtensionCount();
                 return 1;
             default:
                 if (DEBUG) {
@@ -196,6 +207,7 @@
         mWakefulness = wakefulness;
         if (wakefulness != PowerManagerInternal.WAKEFULNESS_AWAKE) {
             cancelCurrentRequestIfAny();
+            resetConsecutiveExtensionCount();
         }
     }
 
@@ -206,6 +218,13 @@
         }
     }
 
+    private void resetConsecutiveExtensionCount() {
+        final long previousCount = mConsecutiveTimeoutExtendedCount.getAndSet(0);
+        if (previousCount > 0) {
+            StatsLog.write(StatsLog.SCREEN_TIMEOUT_EXTENSION_REPORTED, previousCount);
+        }
+    }
+
     @VisibleForTesting
     int getRequestCode() {
         return (int) (mLastUserActivityTime % Integer.MAX_VALUE);
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 3be6480..3ccd234 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -22,6 +22,7 @@
 import static android.os.PowerManagerInternal.WAKEFULNESS_DREAMING;
 
 import android.annotation.IntDef;
+import android.annotation.NonNull;
 import android.annotation.UserIdInt;
 import android.app.ActivityManager;
 import android.app.SynchronousUserSwitchObserver;
@@ -42,6 +43,7 @@
 import android.net.Uri;
 import android.os.BatteryManager;
 import android.os.BatteryManagerInternal;
+import android.os.BatterySaverPolicyConfig;
 import android.os.Binder;
 import android.os.Handler;
 import android.os.IBinder;
@@ -2875,8 +2877,7 @@
     @VisibleForTesting
     void updatePowerRequestFromBatterySaverPolicy(DisplayPowerRequest displayPowerRequest) {
         PowerSaveState state = mBatterySaverPolicy.
-                getBatterySaverPolicy(ServiceType.SCREEN_BRIGHTNESS,
-                        mBatterySaverController.isEnabled());
+                getBatterySaverPolicy(ServiceType.SCREEN_BRIGHTNESS);
         displayPowerRequest.lowPowerMode = state.batterySaverEnabled;
         displayPowerRequest.screenLowPowerBrightnessFactor = state.brightnessFactor;
     }
@@ -4451,8 +4452,7 @@
         public PowerSaveState getPowerSaveState(@ServiceType int serviceType) {
             final long ident = Binder.clearCallingIdentity();
             try {
-                return mBatterySaverPolicy.getBatterySaverPolicy(
-                        serviceType, mBatterySaverController.isEnabled());
+                return mBatterySaverPolicy.getBatterySaverPolicy(serviceType);
             } finally {
                 Binder.restoreCallingIdentity(ident);
             }
@@ -4497,6 +4497,36 @@
         }
 
         @Override // Binder call
+        public boolean setAdaptivePowerSavePolicy(@NonNull BatterySaverPolicyConfig config) {
+            if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.POWER_SAVER)
+                    != PackageManager.PERMISSION_GRANTED) {
+                mContext.enforceCallingOrSelfPermission(
+                        android.Manifest.permission.DEVICE_POWER, "setAdaptivePowerSavePolicy");
+            }
+            final long ident = Binder.clearCallingIdentity();
+            try {
+                return mBatterySaverStateMachine.setAdaptiveBatterySaverPolicy(config);
+            } finally {
+                Binder.restoreCallingIdentity(ident);
+            }
+        }
+
+        @Override // Binder call
+        public boolean setAdaptivePowerSaveEnabled(boolean enabled) {
+            if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.POWER_SAVER)
+                    != PackageManager.PERMISSION_GRANTED) {
+                mContext.enforceCallingOrSelfPermission(
+                        android.Manifest.permission.DEVICE_POWER, "setAdaptivePowerSaveEnabled");
+            }
+            final long ident = Binder.clearCallingIdentity();
+            try {
+                return mBatterySaverStateMachine.setAdaptiveBatterySaverEnabled(enabled);
+            } finally {
+                Binder.restoreCallingIdentity(ident);
+            }
+        }
+
+        @Override // Binder call
         public int getPowerSaveMode() {
             mContext.enforceCallingOrSelfPermission(android.Manifest.permission.POWER_SAVER, null);
             final long ident = Binder.clearCallingIdentity();
@@ -4846,8 +4876,7 @@
 
         @Override
         public PowerSaveState getLowPowerState(@ServiceType int serviceType) {
-            return mBatterySaverPolicy.getBatterySaverPolicy(serviceType,
-                    mBatterySaverController.isEnabled());
+            return mBatterySaverPolicy.getBatterySaverPolicy(serviceType);
         }
 
         @Override
diff --git a/services/core/java/com/android/server/power/PowerManagerShellCommand.java b/services/core/java/com/android/server/power/PowerManagerShellCommand.java
index 46115d8..18b8f0e 100644
--- a/services/core/java/com/android/server/power/PowerManagerShellCommand.java
+++ b/services/core/java/com/android/server/power/PowerManagerShellCommand.java
@@ -41,6 +41,8 @@
         final PrintWriter pw = getOutPrintWriter();
         try {
             switch(cmd) {
+                case "set-adaptive-power-saver-enabled":
+                    return runSetAdaptiveEnabled();
                 case "set-mode":
                     return runSetMode();
                 default:
@@ -52,6 +54,11 @@
         return -1;
     }
 
+    private int runSetAdaptiveEnabled() throws RemoteException {
+        mInterface.setAdaptivePowerSaveEnabled(Boolean.parseBoolean(getNextArgRequired()));
+        return 0;
+    }
+
     private int runSetMode() throws RemoteException {
         final PrintWriter pw = getOutPrintWriter();
         int mode = -1;
@@ -72,6 +79,8 @@
         pw.println("  help");
         pw.println("    Print this help text.");
         pw.println("");
+        pw.println("  set-adaptive-power-saver-enabled [true|false]");
+        pw.println("    enables or disables adaptive power saver.");
         pw.println("  set-mode MODE");
         pw.println("    sets the power mode of the device to MODE.");
         pw.println("    1 turns low power mode on and 0 turns low power mode off.");
diff --git a/services/core/java/com/android/server/power/batterysaver/BatterySaverController.java b/services/core/java/com/android/server/power/batterysaver/BatterySaverController.java
index ab2807a..94bb3ea 100644
--- a/services/core/java/com/android/server/power/batterysaver/BatterySaverController.java
+++ b/services/core/java/com/android/server/power/batterysaver/BatterySaverController.java
@@ -23,6 +23,7 @@
 import android.content.IntentFilter;
 import android.hardware.power.V1_0.PowerHint;
 import android.os.BatteryManager;
+import android.os.BatterySaverPolicyConfig;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
@@ -42,6 +43,7 @@
 import com.android.server.LocalServices;
 import com.android.server.power.PowerManagerService;
 import com.android.server.power.batterysaver.BatterySaverPolicy.BatterySaverPolicyListener;
+import com.android.server.power.batterysaver.BatterySaverPolicy.Policy;
 import com.android.server.power.batterysaver.BatterySavingStats.BatterySaverState;
 import com.android.server.power.batterysaver.BatterySavingStats.DozeState;
 import com.android.server.power.batterysaver.BatterySavingStats.InteractiveState;
@@ -74,16 +76,25 @@
     private final ArrayList<LowPowerModeListener> mListeners = new ArrayList<>();
 
     @GuardedBy("mLock")
-    private boolean mEnabled;
+    private boolean mFullEnabled;
+
+    @GuardedBy("mLock")
+    private boolean mAdaptiveEnabled;
 
     @GuardedBy("mLock")
     private boolean mIsPluggedIn;
 
     /**
-     * Previously enabled or not; only for the event logging. Only use it from
+     * Whether full was previously enabled or not; only for the event logging. Only use it from
      * {@link #handleBatterySaverStateChanged}.
      */
-    private boolean mPreviouslyEnabled;
+    private boolean mFullPreviouslyEnabled;
+
+    /**
+     * Whether adaptive was previously enabled or not; only for the event logging. Only use it from
+     * {@link #handleBatterySaverStateChanged}.
+     */
+    private boolean mAdaptivePreviouslyEnabled;
 
     @GuardedBy("mLock")
     private boolean mIsInteractive;
@@ -104,7 +115,9 @@
     public static final int REASON_SETTING_CHANGED = 8;
     public static final int REASON_DYNAMIC_POWER_SAVINGS_AUTOMATIC_ON = 9;
     public static final int REASON_DYNAMIC_POWER_SAVINGS_AUTOMATIC_OFF = 10;
-    public static final int REASON_STICKY_RESTORE_OFF = 13;
+    public static final int REASON_STICKY_RESTORE_OFF = 11;
+    public static final int REASON_ADAPTIVE_DYNAMIC_POWER_SAVINGS_CHANGED = 12;
+    public static final int REASON_TIMEOUT = 13;
 
     /**
      * Plugin interface. All methods are guaranteed to be called on the same (handler) thread.
@@ -124,7 +137,7 @@
             switch (intent.getAction()) {
                 case Intent.ACTION_SCREEN_ON:
                 case Intent.ACTION_SCREEN_OFF:
-                    if (!isEnabled()) {
+                    if (!isPolicyEnabled()) {
                         updateBatterySavingStats();
                         return; // No need to send it if not enabled.
                     }
@@ -199,7 +212,7 @@
 
     @Override
     public void onBatterySaverPolicyChanged(BatterySaverPolicy policy) {
-        if (!isEnabled()) {
+        if (!isPolicyEnabled()) {
             return; // No need to send it if not enabled.
         }
         mHandler.postStateChanged(/*sendBroadcast=*/ true, REASON_POLICY_CHANGED);
@@ -248,22 +261,98 @@
     @VisibleForTesting
     public void enableBatterySaver(boolean enable, int reason) {
         synchronized (mLock) {
-            if (mEnabled == enable) {
+            if (mFullEnabled == enable) {
                 return;
             }
-            mEnabled = enable;
+            mFullEnabled = enable;
 
-            mHandler.postStateChanged(/*sendBroadcast=*/ true, reason);
+            if (updatePolicyLevelLocked()) {
+                mHandler.postStateChanged(/*sendBroadcast=*/ true, reason);
+            }
         }
     }
 
-    /** @return whether battery saver is enabled or not. */
+    private boolean updatePolicyLevelLocked() {
+        if (mFullEnabled) {
+            return mBatterySaverPolicy.setPolicyLevel(BatterySaverPolicy.POLICY_LEVEL_FULL);
+        } else if (mAdaptiveEnabled) {
+            return mBatterySaverPolicy.setPolicyLevel(BatterySaverPolicy.POLICY_LEVEL_ADAPTIVE);
+        } else {
+            return mBatterySaverPolicy.setPolicyLevel(BatterySaverPolicy.POLICY_LEVEL_OFF);
+        }
+    }
+
+    /**
+     * @return whether battery saver is enabled or not. This takes into
+     * account whether a policy says to advertise isEnabled so this can be propagated externally.
+     */
     public boolean isEnabled() {
         synchronized (mLock) {
-            return mEnabled;
+            return mFullEnabled
+                    || (mAdaptiveEnabled && mBatterySaverPolicy.shouldAdvertiseIsEnabled());
         }
     }
 
+    /**
+     * @return whether battery saver policy is enabled or not. This does not take into account
+     * whether a policy says to advertise isEnabled, so this shouldn't be propagated externally.
+     */
+    private boolean isPolicyEnabled() {
+        synchronized (mLock) {
+            return mFullEnabled || mAdaptiveEnabled;
+        }
+    }
+
+    boolean isFullEnabled() {
+        synchronized (mLock) {
+            return mFullEnabled;
+        }
+    }
+
+    boolean isAdaptiveEnabled() {
+        synchronized (mLock) {
+            return mAdaptiveEnabled;
+        }
+    }
+
+    boolean setAdaptivePolicyLocked(String settings, String deviceSpecificSettings, int reason) {
+        return setAdaptivePolicyLocked(
+                BatterySaverPolicy.Policy.fromSettings(settings, deviceSpecificSettings),
+                reason);
+    }
+
+    boolean setAdaptivePolicyLocked(BatterySaverPolicyConfig config, int reason) {
+        return setAdaptivePolicyLocked(BatterySaverPolicy.Policy.fromConfig(config), reason);
+    }
+
+    boolean setAdaptivePolicyLocked(Policy policy, int reason) {
+        if (mBatterySaverPolicy.setAdaptivePolicyLocked(policy)) {
+            mHandler.postStateChanged(/*sendBroadcast=*/ true, reason);
+            return true;
+        }
+        return false;
+    }
+
+    boolean resetAdaptivePolicyLocked(int reason) {
+        if (mBatterySaverPolicy.resetAdaptivePolicyLocked()) {
+            mHandler.postStateChanged(/*sendBroadcast=*/ true, reason);
+            return true;
+        }
+        return false;
+    }
+
+    boolean setAdaptivePolicyEnabledLocked(boolean enabled, int reason) {
+        if (mAdaptiveEnabled == enabled) {
+            return false;
+        }
+        mAdaptiveEnabled = enabled;
+        if (updatePolicyLevelLocked()) {
+            mHandler.postStateChanged(/*sendBroadcast=*/ true, reason);
+            return true;
+        }
+        return false;
+    }
+
     /** @return whether device is in interactive state. */
     public boolean isInteractive() {
         synchronized (mLock) {
@@ -280,7 +369,7 @@
      * @return true if launch boost should currently be disabled.
      */
     public boolean isLaunchBoostDisabled() {
-        return isEnabled() && mBatterySaverPolicy.isLaunchBoostDisabled();
+        return isPolicyEnabled() && mBatterySaverPolicy.isLaunchBoostDisabled();
     }
 
     /**
@@ -293,6 +382,9 @@
      * - When battery saver becomes deactivated.
      * - When battery saver is on and the interactive state changes.
      * - When battery saver is on and the battery saver policy changes.
+     * - When adaptive battery saver becomes activated.
+     * - When adaptive battery saver becomes deactivated.
+     * - When adaptive battery saver policy changes.
      */
     void handleBatterySaverStateChanged(boolean sendBroadcast, int reason) {
         final LowPowerModeListener[] listeners;
@@ -302,17 +394,22 @@
         final ArrayMap<String, String> fileValues;
 
         synchronized (mLock) {
+            enabled = mFullEnabled || mAdaptiveEnabled;
+
             EventLogTags.writeBatterySaverMode(
-                    mPreviouslyEnabled ? 1 : 0, // Previously off or on.
-                    mEnabled ? 1 : 0, // Now off or on.
+                    mFullPreviouslyEnabled ? 1 : 0, // Previously off or on.
+                    mAdaptivePreviouslyEnabled ? 1 : 0, // Previously off or on.
+                    mFullEnabled ? 1 : 0, // Now off or on.
+                    mAdaptiveEnabled ? 1 : 0, // Now off or on.
                     isInteractive ?  1 : 0, // Device interactive state.
-                    mEnabled ? mBatterySaverPolicy.toEventLogString() : "",
+                    enabled ? mBatterySaverPolicy.toEventLogString() : "",
                     reason);
-            mPreviouslyEnabled = mEnabled;
+
+            mFullPreviouslyEnabled = mFullEnabled;
+            mAdaptivePreviouslyEnabled = mAdaptiveEnabled;
 
             listeners = mListeners.toArray(new LowPowerModeListener[0]);
 
-            enabled = mEnabled;
             mIsInteractive = isInteractive;
 
             if (enabled) {
@@ -324,7 +421,7 @@
 
         final PowerManagerInternal pmi = LocalServices.getService(PowerManagerInternal.class);
         if (pmi != null) {
-            pmi.powerHint(PowerHint.LOW_POWER, enabled ? 1 : 0);
+            pmi.powerHint(PowerHint.LOW_POWER, isEnabled() ? 1 : 0);
         }
 
         updateBatterySavingStats();
@@ -342,13 +439,13 @@
         if (sendBroadcast) {
 
             if (DEBUG) {
-                Slog.i(TAG, "Sending broadcasts for mode: " + enabled);
+                Slog.i(TAG, "Sending broadcasts for mode: " + isEnabled());
             }
 
             // Send the broadcasts and notify the listeners. We only do this when the battery saver
             // mode changes, but not when only the screen state changes.
             Intent intent = new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING)
-                    .putExtra(PowerManager.EXTRA_POWER_SAVE_MODE, enabled)
+                    .putExtra(PowerManager.EXTRA_POWER_SAVE_MODE, isEnabled())
                     .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
             mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
 
@@ -364,8 +461,7 @@
 
             for (LowPowerModeListener listener : listeners) {
                 final PowerSaveState result =
-                        mBatterySaverPolicy.getBatterySaverPolicy(
-                                listener.getServiceType(), enabled);
+                        mBatterySaverPolicy.getBatterySaverPolicy(listener.getServiceType());
                 listener.onLowPowerModeChanged(result);
             }
         }
@@ -389,7 +485,8 @@
                 return;
             }
             mBatterySavingStats.transitionState(
-                    mEnabled ? BatterySaverState.ON : BatterySaverState.OFF,
+                    mFullEnabled ? BatterySaverState.ON :
+                            (mAdaptiveEnabled ? BatterySaverState.ADAPTIVE : BatterySaverState.OFF),
                     isInteractive ? InteractiveState.INTERACTIVE : InteractiveState.NON_INTERACTIVE,
                     dozeMode);
         }
diff --git a/services/core/java/com/android/server/power/batterysaver/BatterySaverLocationPlugin.java b/services/core/java/com/android/server/power/batterysaver/BatterySaverLocationPlugin.java
index bd8baeb..a77d133 100644
--- a/services/core/java/com/android/server/power/batterysaver/BatterySaverLocationPlugin.java
+++ b/services/core/java/com/android/server/power/batterysaver/BatterySaverLocationPlugin.java
@@ -53,8 +53,8 @@
     private void updateLocationState(BatterySaverController caller) {
         final boolean kill =
                 (caller.getBatterySaverPolicy().getGpsMode()
-                        == PowerManager.LOCATION_MODE_ALL_DISABLED_WHEN_SCREEN_OFF) &&
-                caller.isEnabled() && !caller.isInteractive();
+                        == PowerManager.LOCATION_MODE_ALL_DISABLED_WHEN_SCREEN_OFF)
+                        && !caller.isInteractive();
 
         if (DEBUG) {
             Slog.d(TAG, "Battery saver " + (kill ? "stopping" : "restoring") + " location.");
diff --git a/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java b/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java
index 48a041e..1d74e1f 100644
--- a/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java
+++ b/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java
@@ -15,16 +15,17 @@
  */
 package com.android.server.power.batterysaver;
 
+import android.annotation.IntDef;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.database.ContentObserver;
 import android.net.Uri;
+import android.os.BatterySaverPolicyConfig;
 import android.os.Handler;
 import android.os.PowerManager;
 import android.os.PowerManager.ServiceType;
 import android.os.PowerSaveState;
 import android.provider.Settings;
-import android.provider.Settings.Global;
 import android.text.TextUtils;
 import android.util.ArrayMap;
 import android.util.KeyValueListParser;
@@ -39,8 +40,12 @@
 import com.android.server.power.PowerManagerService;
 
 import java.io.PrintWriter;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 
 /**
  * Class to decide whether to turn on battery saver mode for specific services.
@@ -48,12 +53,12 @@
  * IMPORTANT: This class shares the power manager lock, which is very low in the lock hierarchy.
  * Do not call out with the lock held, such as AccessibilityManager. (Settings provider is okay.)
  *
- * Test: atest com.android.server.power.batterysaver.BatterySaverPolicyTest.java
+ * Test: atest com.android.server.power.batterysaver.BatterySaverPolicyTest
  */
 public class BatterySaverPolicy extends ContentObserver {
     private static final String TAG = "BatterySaverPolicy";
 
-    public static final boolean DEBUG = false; // DO NOT SUBMIT WITH TRUE.
+    static final boolean DEBUG = false; // DO NOT SUBMIT WITH TRUE.
 
     private static final String KEY_GPS_MODE = "gps_mode";
     private static final String KEY_VIBRATION_DISABLED = "vibration_disabled";
@@ -81,6 +86,14 @@
      * If set to true, Data Saver WILL NOT be turned on when Battery Saver is turned on.
      */
     private static final String KEY_ACTIVATE_DATASAVER_DISABLED = "datasaver_disabled";
+
+    /**
+     * {@code true} if the Policy should advertise to the rest of the system that battery saver
+     * is enabled. This advertising could cause other system components to change their
+     * behavior. This will not affect other policy flags and what they change.
+     */
+    private static final String KEY_ADVERTISE_IS_ENABLED = "advertise_is_enabled";
+
     private static final String KEY_LAUNCH_BOOST_DISABLED = "launch_boost_disabled";
     private static final String KEY_ADJUST_BRIGHTNESS_FACTOR = "adjust_brightness_factor";
     private static final String KEY_FULLBACKUP_DEFERRED = "fullbackup_deferred";
@@ -91,13 +104,38 @@
     private static final String KEY_AOD_DISABLED = "aod_disabled";
     // Go into deep Doze as soon as the screen turns off.
     private static final String KEY_QUICK_DOZE_ENABLED = "quick_doze_enabled";
-    private static final String KEY_SEND_TRON_LOG = "send_tron_log";
 
     private static final String KEY_CPU_FREQ_INTERACTIVE = "cpufreq-i";
     private static final String KEY_CPU_FREQ_NONINTERACTIVE = "cpufreq-n";
 
-    private static final Policy sDefaultPolicy = new Policy(
+    @VisibleForTesting
+    static final Policy OFF_POLICY = new Policy(
+            1f,    /* adjustBrightnessFactor */
+            false, /* advertiseIsEnabled */
+            false, /* deferFullBackup */
+            false, /* deferKeyValueBackup */
+            false, /* disableAnimation */
+            false, /* disableAod */
+            false, /* disableLaunchBoost */
+            false, /* disableOptionalSensors */
+            false, /* disableSoundTrigger */
+            false, /* disableVibration */
+            false, /* enableAdjustBrightness */
+            false, /* enableDataSaver */
+            false, /* enableFireWall */
+            false, /* enableQuickDoze */
+            new ArrayMap<>(), /* filesForInteractive */
+            new ArrayMap<>(), /* filesForNoninteractive */
+            false, /* forceAllAppsStandby */
+            false, /* forceBackgroundCheck */
+            PowerManager.LOCATION_MODE_NO_CHANGE /* gpsMode */
+    );
+
+    private static final Policy DEFAULT_ADAPTIVE_POLICY = OFF_POLICY;
+
+    private static final Policy DEFAULT_FULL_POLICY = new Policy(
             0.5f,  /* adjustBrightnessFactor */
+            true,  /* advertiseIsEnabled */
             true,  /* deferFullBackup */
             true,  /* deferKeyValueBackup */
             false, /* disableAnimation */
@@ -114,8 +152,7 @@
             new ArrayMap<>(), /* filesForNoninteractive */
             true, /* forceAllAppsStandby */
             true, /* forceBackgroundCheck */
-            PowerManager.LOCATION_MODE_ALL_DISABLED_WHEN_SCREEN_OFF, /* gpsMode */
-            false /* sendTronLog */
+            PowerManager.LOCATION_MODE_ALL_DISABLED_WHEN_SCREEN_OFF /* gpsMode */
     );
 
     private final Object mLock;
@@ -130,6 +167,12 @@
     @GuardedBy("mLock")
     private String mDeviceSpecificSettingsSource; // For dump() only.
 
+    @GuardedBy("mLock")
+    private String mAdaptiveSettings;
+
+    @GuardedBy("mLock")
+    private String mAdaptiveDeviceSpecificSettings;
+
     /**
      * A short string describing which battery saver is now enabled, which we dump in the eventlog.
      */
@@ -149,8 +192,32 @@
     @GuardedBy("mLock")
     private boolean mAccessibilityEnabled;
 
+    /** The current default adaptive policy. */
     @GuardedBy("mLock")
-    private Policy mCurrPolicy = sDefaultPolicy;
+    private Policy mDefaultAdaptivePolicy = DEFAULT_ADAPTIVE_POLICY;
+
+    /** The policy that will be used for adaptive battery saver. */
+    @GuardedBy("mLock")
+    private Policy mAdaptivePolicy = DEFAULT_ADAPTIVE_POLICY;
+
+    /** The policy to be used for full battery saver. */
+    @GuardedBy("mLock")
+    private Policy mFullPolicy = DEFAULT_FULL_POLICY;
+
+    @IntDef(prefix = {"POLICY_LEVEL_"}, value = {
+            POLICY_LEVEL_OFF,
+            POLICY_LEVEL_ADAPTIVE,
+            POLICY_LEVEL_FULL,
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    @interface PolicyLevel {}
+
+    static final int POLICY_LEVEL_OFF = 0;
+    static final int POLICY_LEVEL_ADAPTIVE = 1;
+    static final int POLICY_LEVEL_FULL = 2;
+
+    @GuardedBy("mLock")
+    private int mPolicyLevel = POLICY_LEVEL_OFF;
 
     private final Context mContext;
     private final ContentResolver mContentResolver;
@@ -181,7 +248,11 @@
         mContentResolver.registerContentObserver(Settings.Global.getUriFor(
                 Settings.Global.BATTERY_SAVER_CONSTANTS), false, this);
         mContentResolver.registerContentObserver(Settings.Global.getUriFor(
-                Global.BATTERY_SAVER_DEVICE_SPECIFIC_CONSTANTS), false, this);
+                Settings.Global.BATTERY_SAVER_DEVICE_SPECIFIC_CONSTANTS), false, this);
+        mContentResolver.registerContentObserver(Settings.Global.getUriFor(
+                Settings.Global.BATTERY_SAVER_ADAPTIVE_CONSTANTS), false, this);
+        mContentResolver.registerContentObserver(Settings.Global.getUriFor(
+                Settings.Global.BATTERY_SAVER_ADAPTIVE_DEVICE_SPECIFIC_CONSTANTS), false, this);
 
         final AccessibilityManager acm = mContext.getSystemService(AccessibilityManager.class);
 
@@ -241,8 +312,16 @@
                 mDeviceSpecificSettingsSource = "(overlay)";
             }
 
-            // Update.
-            updateConstantsLocked(setting, deviceSpecificSetting);
+            final String adaptiveSetting =
+                    getGlobalSetting(Settings.Global.BATTERY_SAVER_ADAPTIVE_CONSTANTS);
+            final String adaptiveDeviceSpecificSetting = getGlobalSetting(
+                    Settings.Global.BATTERY_SAVER_ADAPTIVE_DEVICE_SPECIFIC_CONSTANTS);
+
+            if (!updateConstantsLocked(setting, deviceSpecificSetting,
+                    adaptiveSetting, adaptiveDeviceSpecificSetting)) {
+                // Nothing of note changed.
+                return;
+            }
 
             listeners = mListeners.toArray(new BatterySaverPolicyListener[0]);
         }
@@ -258,123 +337,91 @@
     @GuardedBy("mLock")
     @VisibleForTesting
     void updateConstantsLocked(final String setting, final String deviceSpecificSetting) {
+        updateConstantsLocked(setting, deviceSpecificSetting, "", "");
+    }
+
+    /** @return true if the currently active policy changed. */
+    private boolean updateConstantsLocked(String setting, String deviceSpecificSetting,
+            String adaptiveSetting, String adaptiveDeviceSpecificSetting) {
+        setting = TextUtils.emptyIfNull(setting);
+        deviceSpecificSetting = TextUtils.emptyIfNull(deviceSpecificSetting);
+        adaptiveSetting = TextUtils.emptyIfNull(adaptiveSetting);
+        adaptiveDeviceSpecificSetting = TextUtils.emptyIfNull(adaptiveDeviceSpecificSetting);
+
+        if (setting.equals(mSettings)
+                && deviceSpecificSetting.equals(mDeviceSpecificSettings)
+                && adaptiveSetting.equals(mAdaptiveSettings)
+                && adaptiveDeviceSpecificSetting.equals(mAdaptiveDeviceSpecificSettings)) {
+            return false;
+        }
+
         mSettings = setting;
         mDeviceSpecificSettings = deviceSpecificSetting;
+        mAdaptiveSettings = adaptiveSetting;
+        mAdaptiveDeviceSpecificSettings = adaptiveDeviceSpecificSetting;
 
         if (DEBUG) {
             Slog.i(TAG, "mSettings=" + mSettings);
             Slog.i(TAG, "mDeviceSpecificSettings=" + mDeviceSpecificSettings);
+            Slog.i(TAG, "mAdaptiveSettings=" + mAdaptiveSettings);
+            Slog.i(TAG, "mAdaptiveDeviceSpecificSettings=" + mAdaptiveDeviceSpecificSettings);
         }
 
-        final KeyValueListParser parser = new KeyValueListParser(',');
-
-        // Device-specific parameters.
-        try {
-            parser.setString(deviceSpecificSetting);
-        } catch (IllegalArgumentException e) {
-            Slog.wtf(TAG, "Bad device specific battery saver constants: "
-                    + deviceSpecificSetting);
+        boolean changed = false;
+        Policy newFullPolicy = Policy.fromSettings(setting, deviceSpecificSetting,
+                DEFAULT_FULL_POLICY);
+        if (mPolicyLevel == POLICY_LEVEL_FULL && !mFullPolicy.equals(newFullPolicy)) {
+            changed = true;
         }
+        mFullPolicy = newFullPolicy;
 
-        final String cpuFreqInteractive = parser.getString(KEY_CPU_FREQ_INTERACTIVE, "");
-        final String cpuFreqNoninteractive = parser.getString(KEY_CPU_FREQ_NONINTERACTIVE, "");
-
-        // Non-device-specific parameters.
-        try {
-            parser.setString(setting);
-        } catch (IllegalArgumentException e) {
-            Slog.wtf(TAG, "Bad battery saver constants: " + setting);
+        mDefaultAdaptivePolicy = Policy.fromSettings(adaptiveSetting, adaptiveDeviceSpecificSetting,
+                DEFAULT_ADAPTIVE_POLICY);
+        if (mPolicyLevel == POLICY_LEVEL_ADAPTIVE
+                && !mAdaptivePolicy.equals(mDefaultAdaptivePolicy)) {
+            changed = true;
         }
+        // This will override any config set by an external source. This should be fine for now.
+        // TODO: make sure it doesn't override what's set externally
+        mAdaptivePolicy = mDefaultAdaptivePolicy;
 
-        float adjustBrightnessFactor = parser.getFloat(KEY_ADJUST_BRIGHTNESS_FACTOR,
-                sDefaultPolicy.adjustBrightnessFactor);
-        boolean deferFullBackup = parser.getBoolean(KEY_FULLBACKUP_DEFERRED,
-                sDefaultPolicy.deferFullBackup);
-        boolean deferKeyValueBackup = parser.getBoolean(KEY_KEYVALUE_DEFERRED,
-                sDefaultPolicy.deferKeyValueBackup);
-        boolean disableAnimation = parser.getBoolean(KEY_ANIMATION_DISABLED,
-                sDefaultPolicy.disableAnimation);
-        boolean disableAod = parser.getBoolean(KEY_AOD_DISABLED, sDefaultPolicy.disableAod);
-        boolean disableLaunchBoost = parser.getBoolean(KEY_LAUNCH_BOOST_DISABLED,
-                sDefaultPolicy.disableLaunchBoost);
-        boolean disableOptionalSensors = parser.getBoolean(KEY_OPTIONAL_SENSORS_DISABLED,
-                sDefaultPolicy.disableOptionalSensors);
-        boolean disableSoundTrigger = parser.getBoolean(KEY_SOUNDTRIGGER_DISABLED,
-                sDefaultPolicy.disableSoundTrigger);
-        boolean disableVibrationConfig = parser.getBoolean(KEY_VIBRATION_DISABLED,
-                sDefaultPolicy.disableVibration);
-        boolean enableAdjustBrightness = !parser.getBoolean(KEY_ADJUST_BRIGHTNESS_DISABLED,
-                !sDefaultPolicy.enableAdjustBrightness);
-        boolean enableDataSaver = !parser.getBoolean(KEY_ACTIVATE_DATASAVER_DISABLED,
-                !sDefaultPolicy.enableDataSaver);
-        boolean enableFirewall = !parser.getBoolean(KEY_ACTIVATE_FIREWALL_DISABLED,
-                !sDefaultPolicy.enableFirewall);
-        boolean enableQuickDoze = parser.getBoolean(KEY_QUICK_DOZE_ENABLED,
-                sDefaultPolicy.enableQuickDoze);
-        boolean forceAllAppsStandby = parser.getBoolean(KEY_FORCE_ALL_APPS_STANDBY,
-                sDefaultPolicy.forceAllAppsStandby);
-        boolean forceBackgroundCheck = parser.getBoolean(KEY_FORCE_BACKGROUND_CHECK,
-                sDefaultPolicy.forceBackgroundCheck);
-        int gpsMode = parser.getInt(KEY_GPS_MODE, sDefaultPolicy.gpsMode);
-        boolean sendTronLog = parser.getBoolean(KEY_SEND_TRON_LOG, sDefaultPolicy.sendTronLog);
+        updatePolicyDependenciesLocked();
 
-        mCurrPolicy = new Policy(
-                adjustBrightnessFactor,
-                deferFullBackup,
-                deferKeyValueBackup,
-                disableAnimation,
-                disableAod,
-                disableLaunchBoost,
-                disableOptionalSensors,
-                disableSoundTrigger,
-                /* disableVibration */
-                disableVibrationConfig,
-                enableAdjustBrightness,
-                enableDataSaver,
-                enableFirewall,
-                enableQuickDoze,
-                /* filesForInteractive */
-                (new CpuFrequencies()).parseString(cpuFreqInteractive).toSysFileMap(),
-                /* filesForNoninteractive */
-                (new CpuFrequencies()).parseString(cpuFreqNoninteractive).toSysFileMap(),
-                forceAllAppsStandby,
-                forceBackgroundCheck,
-                gpsMode,
-                sendTronLog
-        );
+        return changed;
+    }
 
-        // Update the effective policy.
-        mDisableVibrationEffective = mCurrPolicy.disableVibration
+    @GuardedBy("mLock")
+    private void updatePolicyDependenciesLocked() {
+        final Policy currPolicy = getCurrentPolicyLocked();
+        // Update the effective vibration policy.
+        mDisableVibrationEffective = currPolicy.disableVibration
                 && !mAccessibilityEnabled; // Don't disable vibration when accessibility is on.
 
         final StringBuilder sb = new StringBuilder();
 
-        if (mCurrPolicy.forceAllAppsStandby) sb.append("A");
-        if (mCurrPolicy.forceBackgroundCheck) sb.append("B");
+        if (currPolicy.forceAllAppsStandby) sb.append("A");
+        if (currPolicy.forceBackgroundCheck) sb.append("B");
 
         if (mDisableVibrationEffective) sb.append("v");
-        if (mCurrPolicy.disableAnimation) sb.append("a");
-        if (mCurrPolicy.disableSoundTrigger) sb.append("s");
-        if (mCurrPolicy.deferFullBackup) sb.append("F");
-        if (mCurrPolicy.deferKeyValueBackup) sb.append("K");
-        if (mCurrPolicy.enableFirewall) sb.append("f");
-        if (mCurrPolicy.enableDataSaver) sb.append("d");
-        if (mCurrPolicy.enableAdjustBrightness) sb.append("b");
+        if (currPolicy.disableAnimation) sb.append("a");
+        if (currPolicy.disableSoundTrigger) sb.append("s");
+        if (currPolicy.deferFullBackup) sb.append("F");
+        if (currPolicy.deferKeyValueBackup) sb.append("K");
+        if (currPolicy.enableFirewall) sb.append("f");
+        if (currPolicy.enableDataSaver) sb.append("d");
+        if (currPolicy.enableAdjustBrightness) sb.append("b");
 
-        if (mCurrPolicy.disableLaunchBoost) sb.append("l");
-        if (mCurrPolicy.disableOptionalSensors) sb.append("S");
-        if (mCurrPolicy.disableAod) sb.append("o");
-        if (mCurrPolicy.enableQuickDoze) sb.append("q");
-        if (mCurrPolicy.sendTronLog) sb.append("t");
+        if (currPolicy.disableLaunchBoost) sb.append("l");
+        if (currPolicy.disableOptionalSensors) sb.append("S");
+        if (currPolicy.disableAod) sb.append("o");
+        if (currPolicy.enableQuickDoze) sb.append("q");
 
-        sb.append(mCurrPolicy.gpsMode);
+        sb.append(currPolicy.gpsMode);
 
         mEventLogKeys = sb.toString();
-
-        mBatterySavingStats.setSendTronLog(mCurrPolicy.sendTronLog);
     }
 
-    private static class Policy {
+    static class Policy {
         /**
          * This is the flag to decide the how much to adjust the screen brightness. This is
          * the float value from 0 to 1 where 1 means don't change brightness.
@@ -385,6 +432,16 @@
         public final float adjustBrightnessFactor;
 
         /**
+         * {@code true} if the Policy should advertise to the rest of the system that battery saver
+         * is enabled. This advertising could cause other system components to change their
+         * behavior. This will not affect other policy flags and what they change.
+         *
+         * @see Settings.Global#BATTERY_SAVER_CONSTANTS
+         * @see #KEY_ADVERTISE_IS_ENABLED
+         */
+        public final boolean advertiseIsEnabled;
+
+        /**
          * {@code true} if full backup is deferred in battery saver mode.
          *
          * @see Settings.Global#BATTERY_SAVER_CONSTANTS
@@ -504,13 +561,11 @@
          */
         public final int gpsMode;
 
-        /**
-         * Whether BatterySavingStats should send tron events.
-         */
-        public final boolean sendTronLog;
+        private final int mHashCode;
 
         Policy(
                 float adjustBrightnessFactor,
+                boolean advertiseIsEnabled,
                 boolean deferFullBackup,
                 boolean deferKeyValueBackup,
                 boolean disableAnimation,
@@ -527,10 +582,10 @@
                 ArrayMap<String, String> filesForNoninteractive,
                 boolean forceAllAppsStandby,
                 boolean forceBackgroundCheck,
-                int gpsMode,
-                boolean sendTronLog) {
+                int gpsMode) {
 
             this.adjustBrightnessFactor = adjustBrightnessFactor;
+            this.advertiseIsEnabled = advertiseIsEnabled;
             this.deferFullBackup = deferFullBackup;
             this.deferKeyValueBackup = deferKeyValueBackup;
             this.disableAnimation = disableAnimation;
@@ -548,95 +603,333 @@
             this.forceAllAppsStandby = forceAllAppsStandby;
             this.forceBackgroundCheck = forceBackgroundCheck;
             this.gpsMode = gpsMode;
-            this.sendTronLog = sendTronLog;
+
+            mHashCode = Objects.hash(
+                    adjustBrightnessFactor,
+                    advertiseIsEnabled,
+                    deferFullBackup,
+                    deferKeyValueBackup,
+                    disableAnimation,
+                    disableAod,
+                    disableLaunchBoost,
+                    disableOptionalSensors,
+                    disableSoundTrigger,
+                    disableVibration,
+                    enableAdjustBrightness,
+                    enableDataSaver,
+                    enableFirewall,
+                    enableQuickDoze,
+                    filesForInteractive,
+                    filesForNoninteractive,
+                    forceAllAppsStandby,
+                    forceBackgroundCheck,
+                    gpsMode);
+        }
+
+        static Policy fromConfig(BatterySaverPolicyConfig config) {
+            if (config == null) {
+                Slog.e(TAG, "Null config passed down to BatterySaverPolicy");
+                return OFF_POLICY;
+            }
+
+            // Device-specific parameters.
+            Map<String, String> deviceSpecificSettings = config.getDeviceSpecificSettings();
+            final String cpuFreqInteractive =
+                    deviceSpecificSettings.getOrDefault(KEY_CPU_FREQ_INTERACTIVE, "");
+            final String cpuFreqNoninteractive =
+                    deviceSpecificSettings.getOrDefault(KEY_CPU_FREQ_NONINTERACTIVE, "");
+
+            return new Policy(
+                    config.getAdjustBrightnessFactor(),
+                    config.getAdvertiseIsEnabled(),
+                    config.getDeferFullBackup(),
+                    config.getDeferKeyValueBackup(),
+                    config.getDisableAnimation(),
+                    config.getDisableAod(),
+                    config.getDisableLaunchBoost(),
+                    config.getDisableOptionalSensors(),
+                    config.getDisableSoundTrigger(),
+                    config.getDisableVibration(),
+                    config.getEnableAdjustBrightness(),
+                    config.getEnableDataSaver(),
+                    config.getEnableFirewall(),
+                    config.getEnableQuickDoze(),
+                    /* filesForInteractive */
+                    (new CpuFrequencies()).parseString(cpuFreqInteractive).toSysFileMap(),
+                    /* filesForNoninteractive */
+                    (new CpuFrequencies()).parseString(cpuFreqNoninteractive).toSysFileMap(),
+                    config.getForceAllAppsStandby(),
+                    config.getForceBackgroundCheck(),
+                    config.getGpsMode()
+            );
+        }
+
+        static Policy fromSettings(String settings, String deviceSpecificSettings) {
+            return fromSettings(settings, deviceSpecificSettings, OFF_POLICY);
+        }
+
+        static Policy fromSettings(String settings, String deviceSpecificSettings,
+                Policy defaultPolicy) {
+            final KeyValueListParser parser = new KeyValueListParser(',');
+
+            // Device-specific parameters.
+            try {
+                parser.setString(deviceSpecificSettings == null ? "" : deviceSpecificSettings);
+            } catch (IllegalArgumentException e) {
+                Slog.wtf(TAG, "Bad device specific battery saver constants: "
+                        + deviceSpecificSettings);
+            }
+
+            final String cpuFreqInteractive = parser.getString(KEY_CPU_FREQ_INTERACTIVE, "");
+            final String cpuFreqNoninteractive = parser.getString(KEY_CPU_FREQ_NONINTERACTIVE, "");
+
+            // Non-device-specific parameters.
+            try {
+                parser.setString(settings == null ? "" : settings);
+            } catch (IllegalArgumentException e) {
+                Slog.wtf(TAG, "Bad battery saver constants: " + settings);
+            }
+
+            float adjustBrightnessFactor = parser.getFloat(KEY_ADJUST_BRIGHTNESS_FACTOR,
+                    defaultPolicy.adjustBrightnessFactor);
+            boolean advertiseIsEnabled = parser.getBoolean(KEY_ADVERTISE_IS_ENABLED,
+                    defaultPolicy.advertiseIsEnabled);
+            boolean deferFullBackup = parser.getBoolean(KEY_FULLBACKUP_DEFERRED,
+                    defaultPolicy.deferFullBackup);
+            boolean deferKeyValueBackup = parser.getBoolean(KEY_KEYVALUE_DEFERRED,
+                    defaultPolicy.deferKeyValueBackup);
+            boolean disableAnimation = parser.getBoolean(KEY_ANIMATION_DISABLED,
+                    defaultPolicy.disableAnimation);
+            boolean disableAod = parser.getBoolean(KEY_AOD_DISABLED, defaultPolicy.disableAod);
+            boolean disableLaunchBoost = parser.getBoolean(KEY_LAUNCH_BOOST_DISABLED,
+                    defaultPolicy.disableLaunchBoost);
+            boolean disableOptionalSensors = parser.getBoolean(KEY_OPTIONAL_SENSORS_DISABLED,
+                    defaultPolicy.disableOptionalSensors);
+            boolean disableSoundTrigger = parser.getBoolean(KEY_SOUNDTRIGGER_DISABLED,
+                    defaultPolicy.disableSoundTrigger);
+            boolean disableVibrationConfig = parser.getBoolean(KEY_VIBRATION_DISABLED,
+                    defaultPolicy.disableVibration);
+            boolean enableAdjustBrightness = !parser.getBoolean(KEY_ADJUST_BRIGHTNESS_DISABLED,
+                    !defaultPolicy.enableAdjustBrightness);
+            boolean enableDataSaver = !parser.getBoolean(KEY_ACTIVATE_DATASAVER_DISABLED,
+                    !defaultPolicy.enableDataSaver);
+            boolean enableFirewall = !parser.getBoolean(KEY_ACTIVATE_FIREWALL_DISABLED,
+                    !defaultPolicy.enableFirewall);
+            boolean enableQuickDoze = parser.getBoolean(KEY_QUICK_DOZE_ENABLED,
+                    defaultPolicy.enableQuickDoze);
+            boolean forceAllAppsStandby = parser.getBoolean(KEY_FORCE_ALL_APPS_STANDBY,
+                    defaultPolicy.forceAllAppsStandby);
+            boolean forceBackgroundCheck = parser.getBoolean(KEY_FORCE_BACKGROUND_CHECK,
+                    defaultPolicy.forceBackgroundCheck);
+            int gpsMode = parser.getInt(KEY_GPS_MODE, defaultPolicy.gpsMode);
+
+            return new Policy(
+                    adjustBrightnessFactor,
+                    advertiseIsEnabled,
+                    deferFullBackup,
+                    deferKeyValueBackup,
+                    disableAnimation,
+                    disableAod,
+                    disableLaunchBoost,
+                    disableOptionalSensors,
+                    disableSoundTrigger,
+                    /* disableVibration */
+                    disableVibrationConfig,
+                    enableAdjustBrightness,
+                    enableDataSaver,
+                    enableFirewall,
+                    enableQuickDoze,
+                    /* filesForInteractive */
+                    (new CpuFrequencies()).parseString(cpuFreqInteractive).toSysFileMap(),
+                    /* filesForNoninteractive */
+                    (new CpuFrequencies()).parseString(cpuFreqNoninteractive).toSysFileMap(),
+                    forceAllAppsStandby,
+                    forceBackgroundCheck,
+                    gpsMode
+            );
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj) return true;
+            if (!(obj instanceof Policy)) return false;
+            Policy other = (Policy) obj;
+            return Float.compare(other.adjustBrightnessFactor, adjustBrightnessFactor) == 0
+                    && advertiseIsEnabled == other.advertiseIsEnabled
+                    && deferFullBackup == other.deferFullBackup
+                    && deferKeyValueBackup == other.deferKeyValueBackup
+                    && disableAnimation == other.disableAnimation
+                    && disableAod == other.disableAod
+                    && disableLaunchBoost == other.disableLaunchBoost
+                    && disableOptionalSensors == other.disableOptionalSensors
+                    && disableSoundTrigger == other.disableSoundTrigger
+                    && disableVibration == other.disableVibration
+                    && enableAdjustBrightness == other.enableAdjustBrightness
+                    && enableDataSaver == other.enableDataSaver
+                    && enableFirewall == other.enableFirewall
+                    && enableQuickDoze == other.enableQuickDoze
+                    && forceAllAppsStandby == other.forceAllAppsStandby
+                    && forceBackgroundCheck == other.forceBackgroundCheck
+                    && gpsMode == other.gpsMode
+                    && filesForInteractive.equals(other.filesForInteractive)
+                    && filesForNoninteractive.equals(other.filesForNoninteractive);
+        }
+
+        @Override
+        public int hashCode() {
+            return mHashCode;
         }
     }
 
     /**
-     * Get the {@link PowerSaveState} based on {@paramref type} and {@paramref realMode}.
+     * Get the {@link PowerSaveState} based on the current policy level.
      * The result will have {@link PowerSaveState#batterySaverEnabled} and some other
      * parameters when necessary.
      *
-     * @param type     type of the service, one of {@link ServiceType}
-     * @param realMode whether the battery saver is on by default
+     * @param type   type of the service, one of {@link ServiceType}
      * @return State data that contains battery saver data
      */
-    public PowerSaveState getBatterySaverPolicy(@ServiceType int type, boolean realMode) {
+    public PowerSaveState getBatterySaverPolicy(@ServiceType int type) {
         synchronized (mLock) {
+            final Policy currPolicy = getCurrentPolicyLocked();
             final PowerSaveState.Builder builder = new PowerSaveState.Builder()
-                    .setGlobalBatterySaverEnabled(realMode);
-            if (!realMode) {
-                return builder.setBatterySaverEnabled(realMode)
-                        .build();
-            }
+                    .setGlobalBatterySaverEnabled(currPolicy.advertiseIsEnabled);
             switch (type) {
                 case ServiceType.GPS:
-                    return builder.setBatterySaverEnabled(realMode)
-                            .setGpsMode(mCurrPolicy.gpsMode)
+                    boolean isEnabled = currPolicy.advertiseIsEnabled
+                            || currPolicy.gpsMode != PowerManager.LOCATION_MODE_NO_CHANGE;
+                    return builder.setBatterySaverEnabled(isEnabled)
+                            .setGpsMode(currPolicy.gpsMode)
                             .build();
                 case ServiceType.ANIMATION:
-                    return builder.setBatterySaverEnabled(mCurrPolicy.disableAnimation)
+                    return builder.setBatterySaverEnabled(currPolicy.disableAnimation)
                             .build();
                 case ServiceType.FULL_BACKUP:
-                    return builder.setBatterySaverEnabled(mCurrPolicy.deferFullBackup)
+                    return builder.setBatterySaverEnabled(currPolicy.deferFullBackup)
                             .build();
                 case ServiceType.KEYVALUE_BACKUP:
-                    return builder.setBatterySaverEnabled(mCurrPolicy.deferKeyValueBackup)
+                    return builder.setBatterySaverEnabled(currPolicy.deferKeyValueBackup)
                             .build();
                 case ServiceType.NETWORK_FIREWALL:
-                    return builder.setBatterySaverEnabled(mCurrPolicy.enableFirewall)
+                    return builder.setBatterySaverEnabled(currPolicy.enableFirewall)
                             .build();
                 case ServiceType.SCREEN_BRIGHTNESS:
-                    return builder.setBatterySaverEnabled(mCurrPolicy.enableAdjustBrightness)
-                            .setBrightnessFactor(mCurrPolicy.adjustBrightnessFactor)
+                    return builder.setBatterySaverEnabled(currPolicy.enableAdjustBrightness)
+                            .setBrightnessFactor(currPolicy.adjustBrightnessFactor)
                             .build();
                 case ServiceType.DATA_SAVER:
-                    return builder.setBatterySaverEnabled(mCurrPolicy.enableDataSaver)
+                    return builder.setBatterySaverEnabled(currPolicy.enableDataSaver)
                             .build();
                 case ServiceType.SOUND:
-                    return builder.setBatterySaverEnabled(mCurrPolicy.disableSoundTrigger)
+                    return builder.setBatterySaverEnabled(currPolicy.disableSoundTrigger)
                             .build();
                 case ServiceType.VIBRATION:
                     return builder.setBatterySaverEnabled(mDisableVibrationEffective)
                             .build();
                 case ServiceType.FORCE_ALL_APPS_STANDBY:
-                    return builder.setBatterySaverEnabled(mCurrPolicy.forceAllAppsStandby)
+                    return builder.setBatterySaverEnabled(currPolicy.forceAllAppsStandby)
                             .build();
                 case ServiceType.FORCE_BACKGROUND_CHECK:
-                    return builder.setBatterySaverEnabled(mCurrPolicy.forceBackgroundCheck)
+                    return builder.setBatterySaverEnabled(currPolicy.forceBackgroundCheck)
                             .build();
                 case ServiceType.OPTIONAL_SENSORS:
-                    return builder.setBatterySaverEnabled(mCurrPolicy.disableOptionalSensors)
+                    return builder.setBatterySaverEnabled(currPolicy.disableOptionalSensors)
                             .build();
                 case ServiceType.AOD:
-                    return builder.setBatterySaverEnabled(mCurrPolicy.disableAod)
+                    return builder.setBatterySaverEnabled(currPolicy.disableAod)
                             .build();
                 case ServiceType.QUICK_DOZE:
-                    return builder.setBatterySaverEnabled(mCurrPolicy.enableQuickDoze)
+                    return builder.setBatterySaverEnabled(currPolicy.enableQuickDoze)
                             .build();
                 default:
-                    return builder.setBatterySaverEnabled(realMode)
+                    return builder.setBatterySaverEnabled(currPolicy.advertiseIsEnabled)
                             .build();
             }
         }
     }
 
+    /**
+     * Sets the current policy.
+     *
+     * @return true if the policy level was changed.
+     */
+    boolean setPolicyLevel(@PolicyLevel int level) {
+        synchronized (mLock) {
+            if (mPolicyLevel == level) {
+                return false;
+            }
+            switch (level) {
+                case POLICY_LEVEL_FULL:
+                case POLICY_LEVEL_ADAPTIVE:
+                case POLICY_LEVEL_OFF:
+                    mPolicyLevel = level;
+                    break;
+                default:
+                    Slog.wtf(TAG, "setPolicyLevel invalid level given: " + level);
+                    return false;
+            }
+            updatePolicyDependenciesLocked();
+            return true;
+        }
+    }
+
+    /** @return true if the current policy changed and the policy level is ADAPTIVE. */
+    boolean setAdaptivePolicyLocked(Policy p) {
+        if (p == null) {
+            Slog.wtf(TAG, "setAdaptivePolicy given null policy");
+            return false;
+        }
+        if (mAdaptivePolicy.equals(p)) {
+            return false;
+        }
+
+        mAdaptivePolicy = p;
+        if (mPolicyLevel == POLICY_LEVEL_ADAPTIVE) {
+            updatePolicyDependenciesLocked();
+            return true;
+        }
+        return false;
+    }
+
+    /** @return true if the current policy changed and the policy level is ADAPTIVE. */
+    boolean resetAdaptivePolicyLocked() {
+        return setAdaptivePolicyLocked(mDefaultAdaptivePolicy);
+    }
+
+    private Policy getCurrentPolicyLocked() {
+        switch (mPolicyLevel) {
+            case POLICY_LEVEL_FULL:
+                return mFullPolicy;
+            case POLICY_LEVEL_ADAPTIVE:
+                return mAdaptivePolicy;
+            case POLICY_LEVEL_OFF:
+            default:
+                return OFF_POLICY;
+        }
+    }
+
     public int getGpsMode() {
         synchronized (mLock) {
-            return mCurrPolicy.gpsMode;
+            return getCurrentPolicyLocked().gpsMode;
         }
     }
 
     public ArrayMap<String, String> getFileValues(boolean interactive) {
         synchronized (mLock) {
-            return interactive ? mCurrPolicy.filesForInteractive
-                    : mCurrPolicy.filesForNoninteractive;
+            return interactive ? getCurrentPolicyLocked().filesForInteractive
+                    : getCurrentPolicyLocked().filesForNoninteractive;
         }
     }
 
     public boolean isLaunchBoostDisabled() {
         synchronized (mLock) {
-            return mCurrPolicy.disableLaunchBoost;
+            return getCurrentPolicyLocked().disableLaunchBoost;
+        }
+    }
+
+    boolean shouldAdvertiseIsEnabled() {
+        synchronized (mLock) {
+            return getCurrentPolicyLocked().advertiseIsEnabled;
         }
     }
 
@@ -658,40 +951,72 @@
             pw.println("  Settings: " + mDeviceSpecificSettingsSource);
             pw.println("    value: " + mDeviceSpecificSettings);
 
-            pw.println();
+            pw.println("  Adaptive Settings: " + Settings.Global.BATTERY_SAVER_ADAPTIVE_CONSTANTS);
+            pw.println("    value: " + mAdaptiveSettings);
+            pw.println("  Adaptive Device Specific Settings: "
+                    + Settings.Global.BATTERY_SAVER_ADAPTIVE_DEVICE_SPECIFIC_CONSTANTS);
+            pw.println("    value: " + mAdaptiveDeviceSpecificSettings);
+
             pw.println("  mAccessibilityEnabled=" + mAccessibilityEnabled);
-            pw.println("  " + KEY_VIBRATION_DISABLED + ":config=" + mCurrPolicy.disableVibration);
-            pw.println("  " + KEY_VIBRATION_DISABLED + ":effective=" + mDisableVibrationEffective);
-            pw.println("  " + KEY_ANIMATION_DISABLED + "=" + mCurrPolicy.disableAnimation);
-            pw.println("  " + KEY_FULLBACKUP_DEFERRED + "=" + mCurrPolicy.deferFullBackup);
-            pw.println("  " + KEY_KEYVALUE_DEFERRED + "=" + mCurrPolicy.deferKeyValueBackup);
-            pw.println("  " + KEY_ACTIVATE_FIREWALL_DISABLED + "=" + !mCurrPolicy.enableFirewall);
-            pw.println("  " + KEY_ACTIVATE_DATASAVER_DISABLED + "=" + !mCurrPolicy.enableDataSaver);
-            pw.println("  " + KEY_LAUNCH_BOOST_DISABLED + "=" + mCurrPolicy.disableLaunchBoost);
-            pw.println("  " + KEY_ADJUST_BRIGHTNESS_DISABLED + "="
-                    + !mCurrPolicy.enableAdjustBrightness);
-            pw.println(
-                    "  " + KEY_ADJUST_BRIGHTNESS_FACTOR + "=" + mCurrPolicy.adjustBrightnessFactor);
-            pw.println("  " + KEY_GPS_MODE + "=" + mCurrPolicy.gpsMode);
-            pw.println("  " + KEY_FORCE_ALL_APPS_STANDBY + "=" + mCurrPolicy.forceAllAppsStandby);
-            pw.println("  " + KEY_FORCE_BACKGROUND_CHECK + "=" + mCurrPolicy.forceBackgroundCheck);
-            pw.println("  " + KEY_OPTIONAL_SENSORS_DISABLED + "="
-                    + mCurrPolicy.disableOptionalSensors);
-            pw.println("  " + KEY_AOD_DISABLED + "=" + mCurrPolicy.disableAod);
-            pw.println("  " + KEY_SOUNDTRIGGER_DISABLED + "=" + mCurrPolicy.disableSoundTrigger);
-            pw.println("  " + KEY_QUICK_DOZE_ENABLED + "=" + mCurrPolicy.enableQuickDoze);
-            pw.println("  " + KEY_SEND_TRON_LOG + "=" + mCurrPolicy.sendTronLog);
-            pw.println();
+            pw.println("  mPolicyLevel=" + mPolicyLevel);
 
-            pw.print("  Interactive File values:\n");
-            dumpMap(pw, "    ", mCurrPolicy.filesForInteractive);
-            pw.println();
-
-            pw.print("  Noninteractive File values:\n");
-            dumpMap(pw, "    ", mCurrPolicy.filesForNoninteractive);
+            dumpPolicyLocked(pw, "  ", "full", mFullPolicy);
+            dumpPolicyLocked(pw, "  ", "default adaptive", mDefaultAdaptivePolicy);
+            dumpPolicyLocked(pw, "  ", "current adaptive", mAdaptivePolicy);
         }
     }
 
+    private void dumpPolicyLocked(PrintWriter pw, String indent, String label, Policy p) {
+        pw.println();
+        pw.print(indent);
+        pw.println("Policy '" + label + "'");
+        pw.print(indent);
+        pw.println("  " + KEY_ADVERTISE_IS_ENABLED + "=" + p.advertiseIsEnabled);
+        pw.print(indent);
+        pw.println("  " + KEY_VIBRATION_DISABLED + ":config=" + p.disableVibration);
+        // mDisableVibrationEffective is based on the currently selected policy
+        pw.print(indent);
+        pw.println("  " + KEY_VIBRATION_DISABLED + ":effective=" + (p.disableVibration
+                && !mAccessibilityEnabled));
+        pw.print(indent);
+        pw.println("  " + KEY_ANIMATION_DISABLED + "=" + p.disableAnimation);
+        pw.print(indent);
+        pw.println("  " + KEY_FULLBACKUP_DEFERRED + "=" + p.deferFullBackup);
+        pw.print(indent);
+        pw.println("  " + KEY_KEYVALUE_DEFERRED + "=" + p.deferKeyValueBackup);
+        pw.print(indent);
+        pw.println("  " + KEY_ACTIVATE_FIREWALL_DISABLED + "=" + !p.enableFirewall);
+        pw.print(indent);
+        pw.println("  " + KEY_ACTIVATE_DATASAVER_DISABLED + "=" + !p.enableDataSaver);
+        pw.print(indent);
+        pw.println("  " + KEY_LAUNCH_BOOST_DISABLED + "=" + p.disableLaunchBoost);
+        pw.println(
+                "    " + KEY_ADJUST_BRIGHTNESS_DISABLED + "=" + !p.enableAdjustBrightness);
+        pw.print(indent);
+        pw.println("  " + KEY_ADJUST_BRIGHTNESS_FACTOR + "=" + p.adjustBrightnessFactor);
+        pw.print(indent);
+        pw.println("  " + KEY_GPS_MODE + "=" + p.gpsMode);
+        pw.print(indent);
+        pw.println("  " + KEY_FORCE_ALL_APPS_STANDBY + "=" + p.forceAllAppsStandby);
+        pw.print(indent);
+        pw.println("  " + KEY_FORCE_BACKGROUND_CHECK + "=" + p.forceBackgroundCheck);
+        pw.println(
+                "    " + KEY_OPTIONAL_SENSORS_DISABLED + "=" + p.disableOptionalSensors);
+        pw.print(indent);
+        pw.println("  " + KEY_AOD_DISABLED + "=" + p.disableAod);
+        pw.print(indent);
+        pw.println("  " + KEY_SOUNDTRIGGER_DISABLED + "=" + p.disableSoundTrigger);
+        pw.print(indent);
+        pw.println("  " + KEY_QUICK_DOZE_ENABLED + "=" + p.enableQuickDoze);
+
+        pw.print("    Interactive File values:\n");
+        dumpMap(pw, "      ", p.filesForInteractive);
+        pw.println();
+
+        pw.print("    Noninteractive File values:\n");
+        dumpMap(pw, "      ", p.filesForNoninteractive);
+    }
+
     private void dumpMap(PrintWriter pw, String prefix, ArrayMap<String, String> map) {
         if (map == null) {
             return;
@@ -710,6 +1035,7 @@
     public void setAccessibilityEnabledForTest(boolean enabled) {
         synchronized (mLock) {
             mAccessibilityEnabled = enabled;
+            updatePolicyDependenciesLocked();
         }
     }
 }
diff --git a/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java b/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java
index 404e450..e6fa500 100644
--- a/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java
+++ b/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java
@@ -24,8 +24,10 @@
 import android.content.Intent;
 import android.content.res.Resources;
 import android.database.ContentObserver;
+import android.os.BatterySaverPolicyConfig;
 import android.os.Handler;
 import android.os.PowerManager;
+import android.os.SystemClock;
 import android.os.UserHandle;
 import android.provider.Settings;
 import android.util.Slog;
@@ -46,8 +48,7 @@
  * IMPORTANT: This class shares the power manager lock, which is very low in the lock hierarchy.
  * Do not call out with the lock held. (Settings provider is okay.)
  *
- * Test:
-  atest $ANDROID_BUILD_TOP/frameworks/base/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java
+ * Test: atest com.android.server.power.batterysaver.BatterySaverStateMachineTest
  */
 public class BatterySaverStateMachine {
     private static final String TAG = "BatterySaverStateMachine";
@@ -57,6 +58,8 @@
 
     private static final boolean DEBUG = BatterySaverPolicy.DEBUG;
 
+    private static final long ADAPTIVE_CHANGE_TIMEOUT_MS = 24 * 60 * 60 * 1000L;
+
     private final Context mContext;
     private final BatterySaverController mBatterySaverController;
 
@@ -157,6 +160,13 @@
     @GuardedBy("mLock")
     private String mLastChangedStrReason;
 
+    /**
+     * The last time adaptive battery saver was changed by an external service, using elapsed
+     * realtime as the timebase.
+     */
+    @GuardedBy("mLock")
+    private long mLastAdaptiveBatterySaverChangedExternallyElapsed;
+
     private final ContentObserver mSettingsObserver = new ContentObserver(null) {
         @Override
         public void onChange(boolean selfChange) {
@@ -178,10 +188,6 @@
                 com.android.internal.R.integer.config_dynamicPowerSavingsDefaultDisableThreshold);
     }
 
-    private boolean isBatterySaverEnabled() {
-        return mBatterySaverController.isEnabled();
-    }
-
     private boolean isAutoBatterySaverConfiguredLocked() {
         return mSettingBatterySaverTriggerThreshold > 0;
     }
@@ -392,6 +398,36 @@
         }
     }
 
+    /**
+     * Enable or disable the current adaptive battery saver policy. This may not change what's in
+     * effect if full battery saver is also enabled.
+     */
+    public boolean setAdaptiveBatterySaverEnabled(boolean enabled) {
+        if (DEBUG) {
+            Slog.d(TAG, "setAdaptiveBatterySaverEnabled: enabled=" + enabled);
+        }
+        synchronized (mLock) {
+            mLastAdaptiveBatterySaverChangedExternallyElapsed = SystemClock.elapsedRealtime();
+            return mBatterySaverController.setAdaptivePolicyEnabledLocked(
+                    enabled, BatterySaverController.REASON_ADAPTIVE_DYNAMIC_POWER_SAVINGS_CHANGED);
+        }
+    }
+
+    /**
+     * Change the adaptive battery saver policy.
+     */
+    public boolean setAdaptiveBatterySaverPolicy(BatterySaverPolicyConfig config) {
+        if (DEBUG) {
+            Slog.d(TAG, "setAdaptiveBatterySaverPolicy: config=" + config);
+        }
+
+        synchronized (mLock) {
+            mLastAdaptiveBatterySaverChangedExternallyElapsed = SystemClock.elapsedRealtime();
+            return mBatterySaverController.setAdaptivePolicyLocked(config,
+                    BatterySaverController.REASON_ADAPTIVE_DYNAMIC_POWER_SAVINGS_CHANGED);
+        }
+    }
+
     @GuardedBy("mLock")
     private boolean isBatteryLowLocked() {
         final boolean percentageLow =
@@ -427,12 +463,26 @@
         if (!isBatteryLowLocked()) {
             updateSnoozingLocked(false, "Battery not low");
         }
+
+        if (SystemClock.elapsedRealtime() - mLastAdaptiveBatterySaverChangedExternallyElapsed
+                > ADAPTIVE_CHANGE_TIMEOUT_MS) {
+            mBatterySaverController.setAdaptivePolicyEnabledLocked(
+                    false, BatterySaverController.REASON_TIMEOUT);
+            mBatterySaverController.resetAdaptivePolicyLocked(
+                    BatterySaverController.REASON_TIMEOUT);
+        }
+
         if (mIsPowered) {
             updateSnoozingLocked(false, "Plugged in");
             enableBatterySaverLocked(/*enable=*/ false, /*manual=*/ false,
                     BatterySaverController.REASON_PLUGGED_IN,
                     "Plugged in");
 
+            if (mBatteryLevel >= 80 /* Arbitrary level */) {
+                mBatterySaverController.setAdaptivePolicyEnabledLocked(
+                        false, BatterySaverController.REASON_PLUGGED_IN);
+            }
+
         } else if (mSettingBatterySaverEnabledSticky && !mBatterySaverStickyBehaviourDisabled) {
             if (mSettingBatterySaverStickyAutoDisableEnabled
                     && mBatteryLevel >= mSettingBatterySaverStickyAutoDisableThreshold) {
@@ -472,7 +522,7 @@
         // do nothing if automatic battery saver mode = PERCENTAGE and low warning threshold = 0%
     }
 
-  /**
+    /**
      * {@link com.android.server.power.PowerManagerService} calls it when
      * {@link android.os.PowerManager#setPowerSaveMode} is called.
      *
@@ -501,7 +551,7 @@
             Slog.d(TAG, "enableBatterySaver: enable=" + enable + " manual=" + manual
                     + " reason=" + strReason + "(" + intReason + ")");
         }
-        final boolean wasEnabled = mBatterySaverController.isEnabled();
+        final boolean wasEnabled = mBatterySaverController.isFullEnabled();
 
         if (wasEnabled == enable) {
             if (DEBUG) {
@@ -523,9 +573,10 @@
                 // When battery saver is disabled manually (while battery saver is enabled)
                 // when the battery level is low, we "snooze" BS -- i.e. disable auto battery saver.
                 // We resume auto-BS once the battery level is not low, or the device is plugged in.
-                if (isBatterySaverEnabled() && isBatteryLowLocked()) {
+                if (mBatterySaverController.isFullEnabled() && isBatteryLowLocked()) {
                     updateSnoozingLocked(true, "Manual snooze");
                 }
+                // TODO: maybe turn off adaptive if it's on and advertiseIsEnabled is true
             }
         }
 
@@ -622,6 +673,17 @@
 
             pw.print("  Enabled=");
             pw.println(mBatterySaverController.isEnabled());
+            pw.print("    full=");
+            pw.println(mBatterySaverController.isFullEnabled());
+            pw.print("    adaptive=");
+            pw.print(mBatterySaverController.isAdaptiveEnabled());
+            if (mBatterySaverController.isAdaptiveEnabled()) {
+                pw.print(" (advertise=");
+                pw.print(
+                        mBatterySaverController.getBatterySaverPolicy().shouldAdvertiseIsEnabled());
+                pw.print(")");
+            }
+            pw.println();
 
             pw.print("  mLastChangedIntReason=");
             pw.println(mLastChangedIntReason);
@@ -657,6 +719,9 @@
             pw.println(mSettingBatterySaverTriggerThreshold);
             pw.print("  mBatterySaverStickyBehaviourDisabled=");
             pw.println(mBatterySaverStickyBehaviourDisabled);
+
+            pw.print("  mLastAdaptiveBatterySaverChangedExternallyElapsed=");
+            pw.println(mLastAdaptiveBatterySaverChangedExternallyElapsed);
         }
     }
 
@@ -666,6 +731,12 @@
 
             proto.write(BatterySaverStateMachineProto.ENABLED,
                     mBatterySaverController.isEnabled());
+            proto.write(BatterySaverStateMachineProto.IS_FULL_ENABLED,
+                    mBatterySaverController.isFullEnabled());
+            proto.write(BatterySaverStateMachineProto.IS_ADAPTIVE_ENABLED,
+                    mBatterySaverController.isAdaptiveEnabled());
+            proto.write(BatterySaverStateMachineProto.SHOULD_ADVERTISE_IS_ENABLED,
+                    mBatterySaverController.getBatterySaverPolicy().shouldAdvertiseIsEnabled());
 
             proto.write(BatterySaverStateMachineProto.BOOT_COMPLETED, mBootCompleted);
             proto.write(BatterySaverStateMachineProto.SETTINGS_LOADED, mSettingsLoaded);
@@ -692,6 +763,11 @@
                             .SETTING_BATTERY_SAVER_STICKY_AUTO_DISABLE_THRESHOLD,
                     mSettingBatterySaverStickyAutoDisableThreshold);
 
+            proto.write(
+                    BatterySaverStateMachineProto
+                            .LAST_ADAPTIVE_BATTERY_SAVER_CHANGED_EXTERNALLY_ELAPSED,
+                    mLastAdaptiveBatterySaverChangedExternallyElapsed);
+
             proto.end(token);
         }
     }
diff --git a/services/core/java/com/android/server/power/batterysaver/BatterySavingStats.java b/services/core/java/com/android/server/power/batterysaver/BatterySavingStats.java
index 79b44eb..3dbc007 100644
--- a/services/core/java/com/android/server/power/batterysaver/BatterySavingStats.java
+++ b/services/core/java/com/android/server/power/batterysaver/BatterySavingStats.java
@@ -15,7 +15,6 @@
  */
 package com.android.server.power.batterysaver;
 
-import android.metrics.LogMaker;
 import android.os.BatteryManagerInternal;
 import android.os.SystemClock;
 import android.util.ArrayMap;
@@ -24,9 +23,6 @@
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.logging.MetricsLogger;
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.server.EventLogTags;
 import com.android.server.LocalServices;
 
@@ -57,9 +53,10 @@
     interface BatterySaverState {
         int OFF = 0;
         int ON = 1;
+        int ADAPTIVE = 2;
 
         int SHIFT = 0;
-        int BITS = 1;
+        int BITS = 2;
         int MASK = (1 << BITS) - 1;
 
         static int fromIndex(int index) {
@@ -141,7 +138,6 @@
     }
 
     private BatteryManagerInternal mBatteryManagerInternal;
-    private final MetricsLogger mMetricsLogger;
 
     private static final int STATE_NOT_INITIALIZED = -1;
     private static final int STATE_CHARGING = -2;
@@ -171,28 +167,11 @@
     @GuardedBy("mLock")
     private long mLastBatterySaverDisabledTime = 0;
 
-    private final MetricsLoggerHelper mMetricsLoggerHelper = new MetricsLoggerHelper();
-
-    @VisibleForTesting
-    @GuardedBy("mLock")
-    private boolean mSendTronLog;
-
     /** Visible for unit tests */
     @VisibleForTesting
-    public BatterySavingStats(Object lock, MetricsLogger metricsLogger) {
+    public BatterySavingStats(Object lock) {
         mLock = lock;
         mBatteryManagerInternal = LocalServices.getService(BatteryManagerInternal.class);
-        mMetricsLogger = metricsLogger;
-    }
-
-    public BatterySavingStats(Object lock) {
-        this(lock, new MetricsLogger());
-    }
-
-    public void setSendTronLog(boolean send) {
-        synchronized (mLock) {
-            mSendTronLog = send;
-        }
     }
 
     private BatteryManagerInternal getBatteryManagerInternal() {
@@ -324,7 +303,6 @@
 
         endLastStateLocked(now, batteryLevel, batteryPercent);
         startNewStateLocked(newState, now, batteryLevel, batteryPercent);
-        mMetricsLoggerHelper.transitionStateLocked(newState, now, batteryLevel, batteryPercent);
     }
 
     @GuardedBy("mLock")
@@ -471,61 +449,4 @@
                 onStat.totalBatteryDrainPercent,
                 onStat.drainPerHour() / 1000.0));
     }
-
-    @VisibleForTesting
-    class MetricsLoggerHelper {
-        private int mLastState = STATE_NOT_INITIALIZED;
-        private long mStartTime;
-        private int mStartBatteryLevel;
-        private int mStartPercent;
-
-        private static final int STATE_CHANGE_DETECT_MASK =
-                (BatterySaverState.MASK << BatterySaverState.SHIFT) |
-                (InteractiveState.MASK << InteractiveState.SHIFT);
-
-        @GuardedBy("BatterySavingStats.this.mLock")
-        public void transitionStateLocked(
-                int newState, long now, int batteryLevel, int batteryPercent) {
-            final boolean stateChanging =
-                    ((mLastState >= 0) ^ (newState >= 0)) ||
-                    (((mLastState ^ newState) & STATE_CHANGE_DETECT_MASK) != 0);
-            if (stateChanging) {
-                if (mLastState >= 0) {
-                    final long deltaTime = now - mStartTime;
-
-                    reportLocked(mLastState, deltaTime, mStartBatteryLevel, mStartPercent,
-                            batteryLevel, batteryPercent);
-                }
-                mStartTime = now;
-                mStartBatteryLevel = batteryLevel;
-                mStartPercent = batteryPercent;
-            }
-            mLastState = newState;
-        }
-
-        @GuardedBy("BatterySavingStats.this.mLock")
-        void reportLocked(int state, long deltaTimeMs,
-                int startBatteryLevelUa, int startBatteryLevelPercent,
-                int endBatteryLevelUa, int endBatteryLevelPercent) {
-            if (!mSendTronLog) {
-                return;
-            }
-            final boolean batterySaverOn =
-                    BatterySaverState.fromIndex(state) != BatterySaverState.OFF;
-            final boolean interactive =
-                    InteractiveState.fromIndex(state) != InteractiveState.NON_INTERACTIVE;
-
-            final LogMaker logMaker = new LogMaker(MetricsProto.MetricsEvent.BATTERY_SAVER)
-                    .setSubtype(batterySaverOn ? 1 : 0)
-                    .addTaggedData(MetricsEvent.FIELD_INTERACTIVE, interactive ? 1 : 0)
-                    .addTaggedData(MetricsEvent.FIELD_DURATION_MILLIS, deltaTimeMs)
-                    .addTaggedData(MetricsEvent.FIELD_START_BATTERY_UA, startBatteryLevelUa)
-                    .addTaggedData(MetricsEvent.FIELD_START_BATTERY_PERCENT,
-                            startBatteryLevelPercent)
-                    .addTaggedData(MetricsEvent.FIELD_END_BATTERY_UA, endBatteryLevelUa)
-                    .addTaggedData(MetricsEvent.FIELD_END_BATTERY_PERCENT, endBatteryLevelPercent);
-
-            mMetricsLogger.write(logMaker);
-        }
-    }
 }
diff --git a/services/core/java/com/android/server/role/RemoteRoleControllerService.java b/services/core/java/com/android/server/role/RemoteRoleControllerService.java
index cc3064e..be2544d 100644
--- a/services/core/java/com/android/server/role/RemoteRoleControllerService.java
+++ b/services/core/java/com/android/server/role/RemoteRoleControllerService.java
@@ -32,12 +32,14 @@
 import android.os.UserHandle;
 import android.rolecontrollerservice.IRoleControllerService;
 import android.rolecontrollerservice.RoleControllerService;
+import android.util.Log;
 import android.util.Slog;
 
 import com.android.internal.util.function.pooled.PooledLambda;
 import com.android.server.FgThread;
 
 import java.util.ArrayDeque;
+import java.util.Arrays;
 import java.util.Queue;
 
 /**
@@ -226,10 +228,21 @@
 
             private boolean mCallbackNotified;
 
+            @Nullable
+            private final String mDebugName;
+
             private Call(@NonNull CallExecutor callExecutor,
                     @NonNull IRoleManagerCallback callback) {
                 mCallExecutor = callExecutor;
                 mCallback = callback;
+                mDebugName = DEBUG
+                        ? Arrays.stream(Thread.currentThread().getStackTrace())
+                                .filter(s -> s.getClassName().equals(
+                                        RemoteRoleControllerService.class.getName()))
+                                .findFirst()
+                                .get()
+                                .getMethodName()
+                        : null;
             }
 
             @WorkerThread
@@ -254,6 +267,10 @@
 
             @WorkerThread
             private void notifyCallback(boolean success) {
+                if (DEBUG) {
+                    Log.i(LOG_TAG, "notifyCallback(" + this
+                            + ", success = " + success + ")");
+                }
                 if (mCallbackNotified) {
                     return;
                 }
@@ -273,7 +290,7 @@
 
             @Override
             public String toString() {
-                return "Call with callback: " + mCallback;
+                return DEBUG ? mDebugName : "Call with callback: " + mCallback;
             }
 
             @FunctionalInterface
diff --git a/services/core/java/com/android/server/role/RoleManagerService.java b/services/core/java/com/android/server/role/RoleManagerService.java
index 7d8c7c9..d72270e 100644
--- a/services/core/java/com/android/server/role/RoleManagerService.java
+++ b/services/core/java/com/android/server/role/RoleManagerService.java
@@ -52,6 +52,7 @@
 import android.service.sms.FinancialSmsService;
 import android.telephony.IFinancialSmsCallback;
 import android.text.TextUtils;
+import android.util.ArrayMap;
 import android.util.ArraySet;
 import android.util.PackageUtils;
 import android.util.Slog;
@@ -145,6 +146,9 @@
         mUserManagerInternal = LocalServices.getService(UserManagerInternal.class);
         mAppOpsManager = context.getSystemService(AppOpsManager.class);
 
+        LocalServices.addService(RoleManagerServiceInternal.class,
+                new RoleManagerServiceInternalImpl());
+
         registerUserRemovedReceiver();
     }
 
@@ -207,6 +211,7 @@
             // for a given role before adding a migration statement for it here
             migrateRoleIfNecessary(RoleManager.ROLE_SMS, userId);
             migrateRoleIfNecessary(RoleManager.ROLE_ASSISTANT, userId);
+            migrateRoleIfNecessary(RoleManager.ROLE_DIALER, userId);
 
             // Some vital packages state has changed since last role grant
             // Run grants again
@@ -381,6 +386,19 @@
         }
     }
 
+    /**
+     * Get all roles and packages hold them.
+     *
+     * @param user The user to query to roles for
+     *
+     * @return The roles and their holders
+     */
+    @NonNull
+    private ArrayMap<String, ArraySet<String>> getRoleHoldersAsUser(@NonNull UserHandle user) {
+        RoleUserState userState = getOrCreateUserState(user.getIdentifier());
+        return userState.getRoleHolders();
+    }
+
     private class Stub extends IRoleManager.Stub {
 
         @Override
@@ -675,4 +693,16 @@
             }
         }
     }
+
+    /**
+     * Entry point for internal calls into role manager
+     */
+    private final class RoleManagerServiceInternalImpl extends RoleManagerServiceInternal {
+
+        @NonNull
+        @Override
+        public ArrayMap<String, ArraySet<String>> getRoleHoldersAsUser(@NonNull UserHandle user) {
+            return RoleManagerService.this.getRoleHoldersAsUser(user);
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/role/RoleManagerServiceInternal.java b/services/core/java/com/android/server/role/RoleManagerServiceInternal.java
new file mode 100644
index 0000000..3afc3f7
--- /dev/null
+++ b/services/core/java/com/android/server/role/RoleManagerServiceInternal.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.role;
+
+import android.annotation.NonNull;
+import android.os.UserHandle;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+
+/**
+ * Internal calls into {@link RoleManagerService}
+ */
+public abstract class RoleManagerServiceInternal {
+    /**
+     * Get all roles and packages hold them.
+     *
+     * @param user The user to query to roles for
+     *
+     * @return The roles and their holders
+     */
+    @NonNull
+    public abstract ArrayMap<String, ArraySet<String>> getRoleHoldersAsUser(
+            @NonNull UserHandle user);
+}
diff --git a/services/core/java/com/android/server/role/RoleUserState.java b/services/core/java/com/android/server/role/RoleUserState.java
index 02dcc49..bc68dde 100644
--- a/services/core/java/com/android/server/role/RoleUserState.java
+++ b/services/core/java/com/android/server/role/RoleUserState.java
@@ -376,7 +376,7 @@
 
             version = mVersion;
             packagesHash = mPackagesHash;
-            roles = snapshotRolesLocked();
+            roles = getRoleHolders();
         }
 
         AtomicFile atomicFile = new AtomicFile(getFile(mUserId), "roles-" + mUserId);
@@ -541,7 +541,7 @@
 
             version = mVersion;
             packagesHash = mPackagesHash;
-            roles = snapshotRolesLocked();
+            roles = getRoleHolders();
         }
 
         long fieldToken = dumpOutputStream.start(fieldName, fieldId);
@@ -570,17 +570,24 @@
         dumpOutputStream.end(fieldToken);
     }
 
-    @GuardedBy("mLock")
-    private ArrayMap<String, ArraySet<String>> snapshotRolesLocked() {
-        ArrayMap<String, ArraySet<String>> roles = new ArrayMap<>();
-        for (int i = 0, size = CollectionUtils.size(mRoles); i < size; ++i) {
-            String roleName = mRoles.keyAt(i);
-            ArraySet<String> roleHolders = mRoles.valueAt(i);
+    /**
+     * Get the roles and their holders.
+     *
+     * @return A copy of the roles and their holders
+     */
+    @NonNull
+    public ArrayMap<String, ArraySet<String>> getRoleHolders() {
+        synchronized (mLock) {
+            ArrayMap<String, ArraySet<String>> roles = new ArrayMap<>();
+            for (int i = 0, size = CollectionUtils.size(mRoles); i < size; ++i) {
+                String roleName = mRoles.keyAt(i);
+                ArraySet<String> roleHolders = mRoles.valueAt(i);
 
-            roleHolders = new ArraySet<>(roleHolders);
-            roles.put(roleName, roleHolders);
+                roleHolders = new ArraySet<>(roleHolders);
+                roles.put(roleName, roleHolders);
+            }
+            return roles;
         }
-        return roles;
     }
 
     /**
diff --git a/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java b/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java
new file mode 100644
index 0000000..8dd0760
--- /dev/null
+++ b/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java
@@ -0,0 +1,236 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.rollback;
+
+import android.content.rollback.PackageRollbackInfo;
+import android.content.rollback.PackageRollbackInfo.RestoreInfo;
+import android.content.rollback.RollbackInfo;
+import android.os.storage.StorageManager;
+import android.util.IntArray;
+import android.util.Log;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.pm.Installer;
+import com.android.server.pm.Installer.InstallerException;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Encapsulates the logic for initiating userdata snapshots and rollbacks via installd.
+ */
+@VisibleForTesting
+// TODO(narayan): Reason about the failure scenarios that involve one or more IPCs to installd
+// failing. We need to decide what course of action to take if calls to snapshotAppData or
+// restoreAppDataSnapshot fail.
+public class AppDataRollbackHelper {
+    private static final String TAG = "RollbackManager";
+
+    private final Installer mInstaller;
+
+    public AppDataRollbackHelper(Installer installer) {
+        mInstaller = installer;
+    }
+
+    /**
+     * Creates an app data snapshot for a specified {@code packageName} for {@code installedUsers},
+     * a specified set of users for whom the package is installed.
+     *
+     * @return a list of users for which the snapshot is pending, usually because data for one or
+     *         more users is still credential locked.
+     */
+    public IntArray snapshotAppData(String packageName, int[] installedUsers) {
+        final IntArray pendingBackups = new IntArray();
+        for (int user : installedUsers) {
+            final int storageFlags;
+            if (isUserCredentialLocked(user)) {
+                // We've encountered a user that hasn't unlocked on a FBE device, so we can't copy
+                // across app user data until the user unlocks their device.
+                Log.v(TAG, "User: " + user + " isn't unlocked, skipping CE userdata backup.");
+                storageFlags = Installer.FLAG_STORAGE_DE;
+                pendingBackups.add(user);
+            } else {
+                storageFlags = Installer.FLAG_STORAGE_CE | Installer.FLAG_STORAGE_DE;
+            }
+
+            try {
+                mInstaller.snapshotAppData(packageName, user, storageFlags);
+            } catch (InstallerException ie) {
+                Log.e(TAG, "Unable to create app data snapshot for: " + packageName
+                        + ", userId: " + user, ie);
+            }
+        }
+
+        return pendingBackups;
+    }
+
+    /**
+     * Restores an app data snapshot for a specified package ({@code packageName},
+     * {@code rollbackData}) for a specified {@code userId}.
+     *
+     * @return {@code true} iff. a change to the {@code rollbackData} has been made. Changes to
+     *         {@code rollbackData} are restricted to the removal or addition of {@code userId} to
+     *         the list of pending backups or restores.
+     */
+    public boolean restoreAppData(String packageName, RollbackData rollbackData,
+            int userId, int appId, long ceDataInode, String seInfo) {
+        if (rollbackData == null) {
+            return false;
+        }
+
+        if (!rollbackData.inProgress) {
+            Log.e(TAG, "Request to restore userData for: " + packageName
+                    + ", but no rollback in progress.");
+            return false;
+        }
+
+        PackageRollbackInfo packageInfo = RollbackManagerServiceImpl.getPackageRollbackInfo(
+                rollbackData, packageName);
+        int storageFlags = Installer.FLAG_STORAGE_DE;
+
+        final IntArray pendingBackups = packageInfo.getPendingBackups();
+        final List<RestoreInfo> pendingRestores = packageInfo.getPendingRestores();
+        boolean changedRollbackData = false;
+
+        // If we still have a userdata backup pending for this user, it implies that the user
+        // hasn't unlocked their device between the point of backup and the point of restore,
+        // so the data cannot have changed. We simply skip restoring CE data in this case.
+        if (pendingBackups != null && pendingBackups.indexOf(userId) != -1) {
+            pendingBackups.remove(pendingBackups.indexOf(userId));
+            changedRollbackData = true;
+        } else {
+            // There's no pending CE backup for this user, which means that we successfully
+            // managed to backup data for the user, which means we seek to restore it
+            if (isUserCredentialLocked(userId)) {
+                // We've encountered a user that hasn't unlocked on a FBE device, so we can't
+                // copy across app user data until the user unlocks their device.
+                pendingRestores.add(new RestoreInfo(userId, appId, seInfo));
+                changedRollbackData = true;
+            } else {
+                // This user has unlocked, we can proceed to restore both CE and DE data.
+                storageFlags = storageFlags | Installer.FLAG_STORAGE_CE;
+            }
+        }
+
+        try {
+            mInstaller.restoreAppDataSnapshot(packageName, appId, ceDataInode,
+                    seInfo, userId, storageFlags);
+        } catch (InstallerException ie) {
+            Log.e(TAG, "Unable to restore app data snapshot: " + packageName, ie);
+        }
+
+        return changedRollbackData;
+    }
+
+    /**
+     * Computes the list of pending backups and restores for {@code userId} given lists of
+     * available and recent rollbacks. Packages pending backup for the given user are added
+     * to {@code pendingBackups} and packages pending restore are added to {@code pendingRestores}
+     * along with their corresponding {@code RestoreInfo}.
+     *
+     * @return the list of {@code RollbackData} that have been modified during this computation.
+     */
+    public List<RollbackData> computePendingBackupsAndRestores(int userId,
+            ArrayList<String> pendingBackupPackages, Map<String, RestoreInfo> pendingRestores,
+            List<RollbackData> availableRollbacks, List<RollbackInfo> recentRollbacks) {
+        List<RollbackData> rd = new ArrayList<>();
+        // First check with the list of available rollbacks to see whether there are any
+        // pending backup operations that we've not managed to execute.
+        for (RollbackData data : availableRollbacks) {
+            for (PackageRollbackInfo info : data.packages) {
+                final IntArray pendingBackupUsers = info.getPendingBackups();
+                if (pendingBackupUsers != null) {
+                    final int idx = pendingBackupUsers.indexOf(userId);
+                    if (idx != -1) {
+                        pendingBackupPackages.add(info.getPackageName());
+                        pendingBackupUsers.remove(idx);
+                        if (rd.indexOf(data) == -1) {
+                            rd.add(data);
+                        }
+                    }
+                }
+            }
+        }
+
+        // Then check with the list of recently executed rollbacks to see whether there are
+        // any rollback operations
+        for (RollbackInfo data : recentRollbacks) {
+            for (PackageRollbackInfo info : data.getPackages()) {
+                final RestoreInfo ri = info.getRestoreInfo(userId);
+                if (ri != null) {
+                    if (pendingBackupPackages.contains(info.getPackageName())) {
+                        // This implies that the user hasn't unlocked their device between
+                        // the request to backup data for this user and the request to restore
+                        // it, so we do nothing here.
+                        pendingBackupPackages.remove(info.getPackageName());
+                    } else {
+                        pendingRestores.put(info.getPackageName(), ri);
+                    }
+
+                    info.removeRestoreInfo(ri);
+                }
+            }
+        }
+
+        return rd;
+    }
+
+    /**
+     * Commits the list of pending backups and restores for a given {@code userId}.
+     */
+    public void commitPendingBackupAndRestoreForUser(int userId,
+            ArrayList<String> pendingBackups, Map<String, RestoreInfo> pendingRestores) {
+        if (!pendingBackups.isEmpty()) {
+            for (String packageName : pendingBackups) {
+                try {
+                    mInstaller.snapshotAppData(packageName, userId, Installer.FLAG_STORAGE_CE);
+                } catch (InstallerException ie) {
+                    Log.e(TAG, "Unable to create app data snapshot for: " + packageName, ie);
+                }
+            }
+        }
+
+        // TODO(narayan): Should we perform the restore before the backup for packages that have
+        // both backups and restores pending ? We could get into this case if we have a pending
+        // restore from a rollback + a snapshot request from a new restore.
+        if (!pendingRestores.isEmpty()) {
+            for (String packageName : pendingRestores.keySet()) {
+                try {
+                    final RestoreInfo ri = pendingRestores.get(packageName);
+
+                    // TODO(narayan): Verify that the user of "0" for ceDataInode is accurate
+                    // here. We know that the user has unlocked (and that their CE data is
+                    // available) so we shouldn't need to resort to the fallback path.
+                    mInstaller.restoreAppDataSnapshot(packageName, ri.appId,
+                            0 /* ceDataInode */, ri.seInfo, userId, Installer.FLAG_STORAGE_CE);
+                } catch (InstallerException ie) {
+                    Log.e(TAG, "Unable to restore app data snapshot for: " + packageName, ie);
+                }
+            }
+        }
+    }
+
+    /**
+     * @return {@code true} iff. {@code userId} is locked on an FBE device.
+     */
+    @VisibleForTesting
+    public boolean isUserCredentialLocked(int userId) {
+        return StorageManager.isFileEncryptedNativeOrEmulated()
+                && !StorageManager.isUserKeyUnlocked(userId);
+    }
+}
diff --git a/services/core/java/com/android/server/rollback/RollbackManagerService.java b/services/core/java/com/android/server/rollback/RollbackManagerService.java
index 4b5e764..ba6cddd 100644
--- a/services/core/java/com/android/server/rollback/RollbackManagerService.java
+++ b/services/core/java/com/android/server/rollback/RollbackManagerService.java
@@ -39,4 +39,9 @@
         mService = new RollbackManagerServiceImpl(getContext());
         publishBinderService(Context.ROLLBACK_SERVICE, mService);
     }
+
+    @Override
+    public void onUnlockUser(int user) {
+        mService.onUnlockUser(user);
+    }
 }
diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
index e59228a..4c2b3c2 100644
--- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
+++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
@@ -31,22 +31,22 @@
 import android.content.pm.VersionedPackage;
 import android.content.rollback.IRollbackManager;
 import android.content.rollback.PackageRollbackInfo;
+import android.content.rollback.PackageRollbackInfo.RestoreInfo;
 import android.content.rollback.RollbackInfo;
+import android.content.rollback.RollbackManager;
 import android.os.Binder;
 import android.os.Environment;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.ParcelFileDescriptor;
 import android.os.Process;
-import android.os.storage.StorageManager;
+import android.util.IntArray;
 import android.util.Log;
 import android.util.SparseBooleanArray;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.server.LocalServices;
 import com.android.server.pm.Installer;
-import com.android.server.pm.Installer.InstallerException;
-import com.android.server.pm.PackageManagerServiceUtils;
 
 import java.io.File;
 import java.io.IOException;
@@ -54,6 +54,7 @@
 import java.time.Instant;
 import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -109,6 +110,7 @@
     private final HandlerThread mHandlerThread;
     private final Installer mInstaller;
     private final RollbackPackageHealthObserver mPackageHealthObserver;
+    private final AppDataRollbackHelper mUserdataHelper;
 
     RollbackManagerServiceImpl(Context context) {
         mContext = context;
@@ -122,6 +124,7 @@
         mRollbackStore = new RollbackStore(new File(Environment.getDataDirectory(), "rollback"));
 
         mPackageHealthObserver = new RollbackPackageHealthObserver(mContext);
+        mUserdataHelper = new AppDataRollbackHelper(mInstaller);
 
         // Kick off loading of the rollback data from strorage in a background
         // thread.
@@ -207,7 +210,8 @@
             List<RollbackInfo> rollbacks = new ArrayList<>();
             for (int i = 0; i < mAvailableRollbacks.size(); ++i) {
                 RollbackData data = mAvailableRollbacks.get(i);
-                rollbacks.add(new RollbackInfo(data.rollbackId, data.packages));
+                rollbacks.add(new RollbackInfo(data.rollbackId, data.packages,
+                            Collections.emptyList()));
             }
             return new ParceledListSlice<>(rollbacks);
         }
@@ -227,8 +231,8 @@
     }
 
     @Override
-    public void commitRollback(int rollbackId, String callerPackageName,
-            IntentSender statusReceiver) {
+    public void commitRollback(int rollbackId, ParceledListSlice causePackages,
+            String callerPackageName, IntentSender statusReceiver) {
         mContext.enforceCallingOrSelfPermission(
                 android.Manifest.permission.MANAGE_ROLLBACKS,
                 "executeRollback");
@@ -238,7 +242,8 @@
         appOps.checkPackage(callingUid, callerPackageName);
 
         getHandler().post(() ->
-                commitRollbackInternal(rollbackId, callerPackageName, statusReceiver));
+                commitRollbackInternal(rollbackId, causePackages.getList(),
+                    callerPackageName, statusReceiver));
     }
 
     /**
@@ -246,18 +251,20 @@
      * The work is done on the current thread. This may be a long running
      * operation.
      */
-    private void commitRollbackInternal(int rollbackId,
+    private void commitRollbackInternal(int rollbackId, List<VersionedPackage> causePackages,
             String callerPackageName, IntentSender statusReceiver) {
         Log.i(TAG, "Initiating rollback");
 
         RollbackData data = getRollbackForId(rollbackId);
         if (data == null) {
-            sendFailure(statusReceiver, "Rollback unavailable");
+            sendFailure(statusReceiver, RollbackManager.STATUS_FAILURE_ROLLBACK_UNAVAILABLE,
+                    "Rollback unavailable");
             return;
         }
 
         if (data.inProgress) {
-            sendFailure(statusReceiver, "Rollback for package is already in progress.");
+            sendFailure(statusReceiver, RollbackManager.STATUS_FAILURE_ROLLBACK_UNAVAILABLE,
+                    "Rollback for package is already in progress.");
             return;
         }
 
@@ -273,13 +280,15 @@
             VersionedPackage installedVersion = getInstalledPackageVersion(info.getPackageName());
             if (installedVersion == null) {
                 // TODO: Test this case
-                sendFailure(statusReceiver, "Package to roll back is not installed");
+                sendFailure(statusReceiver, RollbackManager.STATUS_FAILURE_ROLLBACK_UNAVAILABLE,
+                        "Package to roll back is not installed");
                 return;
             }
 
             if (!packageVersionsEqual(info.getVersionRolledBackFrom(), installedVersion)) {
                 // TODO: Test this case
-                sendFailure(statusReceiver, "Package version to roll back not installed.");
+                sendFailure(statusReceiver, RollbackManager.STATUS_FAILURE_ROLLBACK_UNAVAILABLE,
+                        "Package version to roll back not installed.");
                 return;
             }
         }
@@ -290,7 +299,8 @@
         try {
             context = mContext.createPackageContext(callerPackageName, 0);
         } catch (PackageManager.NameNotFoundException e) {
-            sendFailure(statusReceiver, "Invalid callerPackageName");
+            sendFailure(statusReceiver, RollbackManager.STATUS_FAILURE,
+                    "Invalid callerPackageName");
             return;
         }
 
@@ -309,7 +319,8 @@
                         PackageInstaller.SessionParams.MODE_FULL_INSTALL);
                 String installerPackageName = pm.getInstallerPackageName(info.getPackageName());
                 if (installerPackageName == null) {
-                    sendFailure(statusReceiver, "Cannot find installer package");
+                    sendFailure(statusReceiver, RollbackManager.STATUS_FAILURE,
+                            "Cannot find installer package");
                     return;
                 }
                 params.setInstallerPackageName(installerPackageName);
@@ -317,15 +328,18 @@
                 int sessionId = packageInstaller.createSession(params);
                 PackageInstaller.Session session = packageInstaller.openSession(sessionId);
 
-                // TODO: Will it always be called "base.apk"? What about splits?
-                // What about apex?
-                File packageDir = new File(data.backupDir, info.getPackageName());
-                File baseApk = new File(packageDir, "base.apk");
-                try (ParcelFileDescriptor fd = ParcelFileDescriptor.open(baseApk,
+                File packageCode = RollbackStore.getPackageCode(data, info.getPackageName());
+                if (packageCode == null) {
+                    sendFailure(statusReceiver, RollbackManager.STATUS_FAILURE,
+                            "Backup copy of package code inaccessible");
+                    return;
+                }
+
+                try (ParcelFileDescriptor fd = ParcelFileDescriptor.open(packageCode,
                         ParcelFileDescriptor.MODE_READ_ONLY)) {
                     final long token = Binder.clearCallingIdentity();
                     try {
-                        session.write("base.apk", 0, baseApk.length(), fd);
+                        session.write(packageCode.getName(), 0, packageCode.length(), fd);
                     } finally {
                         Binder.restoreCallingIdentity(token);
                     }
@@ -343,15 +357,15 @@
                             int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS,
                                     PackageInstaller.STATUS_FAILURE);
                             if (status != PackageInstaller.STATUS_SUCCESS) {
-                                sendFailure(statusReceiver,
+                                sendFailure(statusReceiver, RollbackManager.STATUS_FAILURE_INSTALL,
                                         "Rollback downgrade install failed: "
                                         + result.getStringExtra(
                                                 PackageInstaller.EXTRA_STATUS_MESSAGE));
                                 return;
                             }
 
-                            addRecentlyExecutedRollback(
-                                    new RollbackInfo(data.rollbackId, data.packages));
+                            addRecentlyExecutedRollback(new RollbackInfo(
+                                        data.rollbackId, data.packages, causePackages));
                             sendSuccess(statusReceiver);
 
                             Intent broadcast = new Intent(Intent.ACTION_ROLLBACK_COMMITTED);
@@ -369,7 +383,8 @@
             parentSession.commit(receiver.getIntentSender());
         } catch (IOException e) {
             Log.e(TAG, "Rollback failed", e);
-            sendFailure(statusReceiver, "IOException: " + e.toString());
+            sendFailure(statusReceiver, RollbackManager.STATUS_FAILURE,
+                    "IOException: " + e.toString());
             return;
         }
     }
@@ -413,6 +428,35 @@
         }
     }
 
+    void onUnlockUser(int userId) {
+        getHandler().post(() -> {
+            final ArrayList<String> pendingBackupPackages = new ArrayList<>();
+            final Map<String, RestoreInfo> pendingRestorePackages = new HashMap<>();
+            final List<RollbackData> changed;
+            synchronized (mLock) {
+                ensureRollbackDataLoadedLocked();
+                changed = mUserdataHelper.computePendingBackupsAndRestores(userId,
+                        pendingBackupPackages, pendingRestorePackages, mAvailableRollbacks,
+                        mRecentlyExecutedRollbacks);
+            }
+
+            mUserdataHelper.commitPendingBackupAndRestoreForUser(userId,
+                    pendingBackupPackages, pendingRestorePackages);
+
+            for (RollbackData rd : changed) {
+                try {
+                    mRollbackStore.saveAvailableRollback(rd);
+                } catch (IOException ioe) {
+                    Log.e(TAG, "Unable to save rollback info for : " + rd.rollbackId, ioe);
+                }
+            }
+
+            synchronized (mLock) {
+                mRollbackStore.saveRecentlyExecutedRollbacks(mRecentlyExecutedRollbacks);
+            }
+        });
+    }
+
     /**
      * Load rollback data from storage if it has not already been loaded.
      * After calling this funciton, mAvailableRollbacks and
@@ -522,6 +566,20 @@
         // that are necessary to keep track of.
         synchronized (mLock) {
             ensureRollbackDataLoadedLocked();
+
+            // This should never happen because we can't have any pending backups left after
+            // a rollback has been executed. See AppDataRollbackHelper#restoreAppData where we
+            // clear all pending backups at the point of restore because they're guaranteed to be
+            // no-ops.
+            //
+            // We may, however, have one or more pending restores left to handle.
+            for (PackageRollbackInfo target : rollback.getPackages()) {
+                if (target.getPendingBackups().size() > 0) {
+                    Log.e(TAG, "No backups allowed to be pending for: " + target);
+                    target.getPendingBackups().clear();
+                }
+            }
+
             mRecentlyExecutedRollbacks.add(rollback);
             mRollbackStore.saveRecentlyExecutedRollbacks(mRecentlyExecutedRollbacks);
         }
@@ -531,16 +589,15 @@
      * Notifies an IntentSender of failure.
      *
      * @param statusReceiver where to send the failure
+     * @param status the RollbackManager.STATUS_* code with the failure.
      * @param message the failure message.
      */
-    private void sendFailure(IntentSender statusReceiver, String message) {
+    private void sendFailure(IntentSender statusReceiver, int status, String message) {
         Log.e(TAG, message);
         try {
-            // TODO: More context on which rollback failed?
-            // TODO: More refined failure code?
             final Intent fillIn = new Intent();
-            fillIn.putExtra(PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_FAILURE);
-            fillIn.putExtra(PackageInstaller.EXTRA_STATUS_MESSAGE, message);
+            fillIn.putExtra(RollbackManager.EXTRA_STATUS, status);
+            fillIn.putExtra(RollbackManager.EXTRA_STATUS_MESSAGE, message);
             statusReceiver.sendIntent(mContext, 0, fillIn, null, null);
         } catch (IntentSender.SendIntentException e) {
             // Nowhere to send the result back to, so don't bother.
@@ -553,7 +610,7 @@
     private void sendSuccess(IntentSender statusReceiver) {
         try {
             final Intent fillIn = new Intent();
-            fillIn.putExtra(PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_SUCCESS);
+            fillIn.putExtra(RollbackManager.EXTRA_STATUS, RollbackManager.STATUS_SUCCESS);
             statusReceiver.sendIntent(mContext, 0, fillIn, null, null);
         } catch (IntentSender.SendIntentException e) {
             // Nowhere to send the result back to, so don't bother.
@@ -680,38 +737,25 @@
         VersionedPackage newVersion = new VersionedPackage(packageName, newPackage.versionCode);
 
         // Get information about the currently installed package.
-        PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class);
-        PackageParser.Package installedPackage = pm.getPackage(packageName);
-        if (installedPackage == null) {
+        PackageManager pm = mContext.getPackageManager();
+        PackageInfo pkgInfo = null;
+        try {
+            pkgInfo = pm.getPackageInfo(packageName, 0);
+        } catch (PackageManager.NameNotFoundException e) {
             // TODO: Support rolling back fresh package installs rather than
             // fail here. Test this case.
             Log.e(TAG, packageName + " is not installed");
             return false;
         }
+
         VersionedPackage installedVersion = new VersionedPackage(packageName,
-                installedPackage.getLongVersionCode());
+                pkgInfo.getLongVersionCode());
 
-        for (int user : installedUsers) {
-            final int storageFlags;
-            if (StorageManager.isFileEncryptedNativeOrEmulated()
-                    && !StorageManager.isUserKeyUnlocked(user)) {
-                // We've encountered a user that hasn't unlocked on a FBE device, so we can't copy
-                // across app user data until the user unlocks their device.
-                Log.e(TAG, "User: " + user + " isn't unlocked, skipping CE userdata backup.");
-                storageFlags = Installer.FLAG_STORAGE_DE;
-            } else {
-                storageFlags = Installer.FLAG_STORAGE_CE | Installer.FLAG_STORAGE_DE;
-            }
+        final IntArray pendingBackups = mUserdataHelper.snapshotAppData(packageName,
+                installedUsers);
 
-            try {
-                mInstaller.snapshotAppData(packageName, user, storageFlags);
-            } catch (InstallerException ie) {
-                Log.e(TAG, "Unable to create app data snapshot for: " + packageName, ie);
-            }
-        }
-
-        PackageRollbackInfo info = new PackageRollbackInfo(newVersion, installedVersion);
-
+        PackageRollbackInfo info = new PackageRollbackInfo(newVersion, installedVersion,
+                pendingBackups, new ArrayList<>());
         RollbackData data;
         try {
             synchronized (mLock) {
@@ -729,60 +773,43 @@
             return false;
         }
 
-        File packageDir = mRollbackStore.packageCodePathForAvailableRollback(data, packageName);
-        packageDir.mkdirs();
-
-        // TODO: Copy by hard link instead to save on cpu and storage space?
-        int status = PackageManagerServiceUtils.copyPackage(installedPackage.codePath, packageDir);
-        if (status != PackageManager.INSTALL_SUCCEEDED) {
-            Log.e(TAG, "Unable to copy package for rollback for " + packageName);
+        try {
+            RollbackStore.backupPackageCode(data, packageName, pkgInfo.applicationInfo.sourceDir);
+        } catch (IOException e) {
+            Log.e(TAG, "Unable to copy package for rollback for " + packageName, e);
             return false;
         }
-
         return true;
     }
 
     @Override
-    public void restoreUserData(String packageName, int userId, int appId, long ceDataInode,
+    public void restoreUserData(String packageName, int[] userIds, int appId, long ceDataInode,
             String seInfo, int token) {
         if (Binder.getCallingUid() != Process.SYSTEM_UID) {
             throw new SecurityException("restoureUserData may only be called by the system.");
         }
 
         getHandler().post(() -> {
-            PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class);
             final RollbackData rollbackData = getRollbackForPackage(packageName);
-            if (rollbackData == null) {
-                pmi.finishPackageInstall(token, false);
-                return;
+            for (int userId : userIds) {
+                final boolean changedRollbackData = mUserdataHelper.restoreAppData(packageName,
+                        rollbackData, userId, appId, ceDataInode, seInfo);
+
+                // We've updated metadata about this rollback, so save it to flash.
+                if (changedRollbackData) {
+                    try {
+                        mRollbackStore.saveAvailableRollback(rollbackData);
+                    } catch (IOException ioe) {
+                        // TODO(narayan): What is the right thing to do here ? This isn't a fatal
+                        // error, since it will only result in us trying to restore data again,
+                        // which will be a no-op if there's no data available.
+                        Log.e(TAG, "Unable to save available rollback: " + packageName, ioe);
+                    }
+                }
             }
 
-            if (!rollbackData.inProgress) {
-                Log.e(TAG, "Request to restore userData for: " + packageName
-                        + ", but no rollback in progress.");
-                pmi.finishPackageInstall(token, false);
-                return;
-            }
-
-            final int storageFlags;
-            if (StorageManager.isFileEncryptedNativeOrEmulated()
-                    && !StorageManager.isUserKeyUnlocked(userId)) {
-                // We've encountered a user that hasn't unlocked on a FBE device, so we can't copy
-                // across app user data until the user unlocks their device.
-                Log.e(TAG, "User: " + userId + " isn't unlocked, skipping CE userdata restore.");
-
-                storageFlags = Installer.FLAG_STORAGE_DE;
-            } else {
-                storageFlags = Installer.FLAG_STORAGE_CE | Installer.FLAG_STORAGE_DE;
-            }
-
-            try {
-                mInstaller.restoreAppDataSnapshot(packageName, appId, ceDataInode,
-                        seInfo, userId, storageFlags);
-            } catch (InstallerException ie) {
-                Log.e(TAG, "Unable to restore app data snapshot: " + packageName, ie);
-            }
-
+            final PackageManagerInternal pmi = LocalServices.getService(
+                    PackageManagerInternal.class);
             pmi.finishPackageInstall(token, false);
         });
     }
@@ -890,10 +917,8 @@
             ensureRollbackDataLoadedLocked();
             for (int i = 0; i < mAvailableRollbacks.size(); ++i) {
                 RollbackData data = mAvailableRollbacks.get(i);
-                for (PackageRollbackInfo info : data.packages) {
-                    if (info.getPackageName().equals(packageName)) {
-                        return data;
-                    }
+                if (getPackageRollbackInfo(data, packageName) != null) {
+                    return data;
                 }
             }
         }
@@ -916,6 +941,22 @@
                 }
             }
         }
+
+        return null;
+    }
+
+    /**
+     * Returns the {@code PackageRollbackInfo} associated with {@code packageName} from
+     * a specified {@code RollbackData}.
+     */
+    static PackageRollbackInfo getPackageRollbackInfo(RollbackData data,
+            String packageName) {
+        for (PackageRollbackInfo info : data.packages) {
+            if (info.getPackageName().equals(packageName)) {
+                return info;
+            }
+        }
+
         return null;
     }
 
diff --git a/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java b/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java
index fcae618..8e04160 100644
--- a/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java
+++ b/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java
@@ -18,17 +18,23 @@
 
 import android.content.Context;
 import android.content.Intent;
-import android.content.pm.PackageInstaller;
+import android.content.pm.PackageManager;
+import android.content.pm.VersionedPackage;
 import android.content.rollback.PackageRollbackInfo;
 import android.content.rollback.RollbackInfo;
 import android.content.rollback.RollbackManager;
 import android.os.Handler;
 import android.os.HandlerThread;
+import android.text.TextUtils;
+import android.util.Slog;
+import android.util.StatsLog;
 
+import com.android.internal.R;
 import com.android.server.PackageWatchdog;
 import com.android.server.PackageWatchdog.PackageHealthObserver;
 import com.android.server.PackageWatchdog.PackageHealthObserverImpact;
 
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -40,12 +46,10 @@
     private static final String TAG = "RollbackPackageHealthObserver";
     private static final String NAME = "rollback-observer";
     private Context mContext;
-    private RollbackManager mRollbackManager;
     private Handler mHandler;
 
     RollbackPackageHealthObserver(Context context) {
         mContext = context;
-        mRollbackManager = mContext.getSystemService(RollbackManager.class);
         HandlerThread handlerThread = new HandlerThread("RollbackPackageHealthObserver");
         handlerThread.start();
         mHandler = handlerThread.getThreadHandler();
@@ -53,8 +57,16 @@
     }
 
     @Override
-    public int onHealthCheckFailed(String packageName) {
-        RollbackInfo rollback = getAvailableRollback(packageName);
+    public int onHealthCheckFailed(VersionedPackage failedPackage) {
+        VersionedPackage moduleMetadataPackage = getModuleMetadataPackage();
+        if (moduleMetadataPackage == null) {
+            // Ignore failure, no mainline update available
+            return PackageHealthObserverImpact.USER_IMPACT_NONE;
+        }
+
+        RollbackInfo rollback =
+                getAvailableMainlineRollback(mContext.getSystemService(RollbackManager.class),
+                        failedPackage, moduleMetadataPackage);
         if (rollback == null) {
             // Don't handle the notification, no rollbacks available for the package
             return PackageHealthObserverImpact.USER_IMPACT_NONE;
@@ -64,29 +76,46 @@
     }
 
     @Override
-    public boolean execute(String packageName) {
-        RollbackInfo rollback = getAvailableRollback(packageName);
-        if (rollback == null) {
-            // Expected a rollback to be available, what happened?
+    public boolean execute(VersionedPackage failedPackage) {
+        VersionedPackage moduleMetadataPackage = getModuleMetadataPackage();
+        if (moduleMetadataPackage == null) {
+            // Ignore failure, no mainline update available
             return false;
         }
 
-        // TODO(zezeozue): Only rollback if rollback version == failed package version
+        RollbackManager rollbackManager = mContext.getSystemService(RollbackManager.class);
+        RollbackInfo rollback = getAvailableMainlineRollback(rollbackManager,
+                failedPackage, moduleMetadataPackage);
+        if (rollback == null) {
+            Slog.w(TAG, "Expected rollback but no mainline rollback found for package: [ "
+                    + failedPackage.getPackageName() + "] with versionCode: ["
+                    + failedPackage.getVersionCode() + "]");
+            return false;
+        }
+
+        StatsLog.write(StatsLog.WATCHDOG_ROLLBACK_OCCURRED,
+                StatsLog.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_INITIATE,
+                moduleMetadataPackage.getPackageName(),
+                moduleMetadataPackage.getVersionCode());
         LocalIntentReceiver rollbackReceiver = new LocalIntentReceiver((Intent result) -> {
-            int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS,
-                    PackageInstaller.STATUS_FAILURE);
-            if (status == PackageInstaller.STATUS_SUCCESS) {
-                // TODO(zezeozue); Log success metrics
-                // Rolledback successfully, no action required by other observers
+            int status = result.getIntExtra(RollbackManager.EXTRA_STATUS,
+                    RollbackManager.STATUS_FAILURE);
+            if (status == RollbackManager.STATUS_SUCCESS) {
+                StatsLog.write(StatsLog.WATCHDOG_ROLLBACK_OCCURRED,
+                        StatsLog.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_SUCCESS,
+                        moduleMetadataPackage.getPackageName(),
+                        moduleMetadataPackage.getVersionCode());
             } else {
-                // TODO(zezeozue); Log failure metrics
-                // Rollback failed other observers should have a shot
+                StatsLog.write(StatsLog.WATCHDOG_ROLLBACK_OCCURRED,
+                        StatsLog.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_FAILURE,
+                        moduleMetadataPackage.getPackageName(),
+                        moduleMetadataPackage.getVersionCode());
             }
         });
 
-        // TODO(zezeozue): Log initiated metrics
         mHandler.post(() ->
-                mRollbackManager.commitRollback(rollback.getRollbackId(),
+                rollbackManager.commitRollback(rollback.getRollbackId(),
+                    Collections.singletonList(moduleMetadataPackage),
                     rollbackReceiver.getIntentSender()));
         // Assume rollback executed successfully
         return true;
@@ -105,15 +134,41 @@
         PackageWatchdog.getInstance(mContext).startObservingHealth(this, packages, durationMs);
     }
 
-    private RollbackInfo getAvailableRollback(String packageName) {
-        for (RollbackInfo rollback : mRollbackManager.getAvailableRollbacks()) {
+    private RollbackInfo getAvailableMainlineRollback(RollbackManager rollbackManager,
+            VersionedPackage failedPackage, VersionedPackage moduleMetadataPackage) {
+        for (RollbackInfo rollback : rollbackManager.getAvailableRollbacks()) {
+            // We only rollback mainline packages, so check if rollback contains the
+            // module metadata provider, if it does, the rollback is a mainline rollback
+            boolean hasModuleMetadataPackage = false;
+            boolean hasFailedPackage = false;
             for (PackageRollbackInfo packageRollback : rollback.getPackages()) {
-                if (packageName.equals(packageRollback.getPackageName())) {
-                    // TODO(zezeozue): Only rollback if rollback version == failed package version
-                    return rollback;
-                }
+                hasModuleMetadataPackage |= packageRollback.getPackageName().equals(
+                        moduleMetadataPackage.getPackageName());
+                hasFailedPackage |= packageRollback.getPackageName().equals(
+                        failedPackage.getPackageName())
+                        && packageRollback.getVersionRolledBackFrom().getVersionCode()
+                        == failedPackage.getVersionCode();
+            }
+            if (hasModuleMetadataPackage && hasFailedPackage) {
+                return rollback;
             }
         }
         return null;
     }
+
+    private VersionedPackage getModuleMetadataPackage() {
+        String packageName = mContext.getResources().getString(
+                R.string.config_defaultModuleMetadataProvider);
+        if (!TextUtils.isEmpty(packageName)) {
+            return null;
+        }
+
+        try {
+            return new VersionedPackage(packageName, mContext.getPackageManager().getPackageInfo(
+                            packageName, 0 /* flags */).getLongVersionCode());
+        } catch (PackageManager.NameNotFoundException e) {
+            Slog.w(TAG, "Module metadata provider not found");
+            return null;
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/rollback/RollbackStore.java b/services/core/java/com/android/server/rollback/RollbackStore.java
index 3b24b3e..d8e1f62 100644
--- a/services/core/java/com/android/server/rollback/RollbackStore.java
+++ b/services/core/java/com/android/server/rollback/RollbackStore.java
@@ -16,9 +16,12 @@
 
 package com.android.server.rollback;
 
+import android.annotation.NonNull;
 import android.content.pm.VersionedPackage;
 import android.content.rollback.PackageRollbackInfo;
+import android.content.rollback.PackageRollbackInfo.RestoreInfo;
 import android.content.rollback.RollbackInfo;
+import android.util.IntArray;
 import android.util.Log;
 
 import libcore.io.IoUtils;
@@ -30,6 +33,7 @@
 import java.io.File;
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.nio.file.Files;
 import java.time.Instant;
 import java.time.format.DateTimeParseException;
 import java.util.ArrayList;
@@ -99,6 +103,64 @@
     }
 
     /**
+     * Converts an {@code JSONArray} of integers to an {@code IntArray}.
+     */
+    private static @NonNull IntArray convertToIntArray(@NonNull JSONArray jsonArray)
+            throws JSONException {
+        if (jsonArray.length() == 0) {
+            return new IntArray();
+        }
+
+        final int[] ret = new int[jsonArray.length()];
+        for (int i = 0; i < ret.length; ++i) {
+            ret[i] = jsonArray.getInt(i);
+        }
+
+        return IntArray.wrap(ret);
+    }
+
+    /**
+     * Converts an {@code IntArray} into an {@code JSONArray} of integers.
+     */
+    private static @NonNull JSONArray convertToJsonArray(@NonNull IntArray intArray) {
+        JSONArray jsonArray = new JSONArray();
+        for (int i = 0; i < intArray.size(); ++i) {
+            jsonArray.put(intArray.get(i));
+        }
+
+        return jsonArray;
+    }
+
+    private static @NonNull JSONArray convertToJsonArray(@NonNull List<RestoreInfo> list)
+            throws JSONException {
+        JSONArray jsonArray = new JSONArray();
+        for (RestoreInfo ri : list) {
+            JSONObject jo = new JSONObject();
+            jo.put("userId", ri.userId);
+            jo.put("appId", ri.appId);
+            jo.put("seInfo", ri.seInfo);
+            jsonArray.put(jo);
+        }
+
+        return jsonArray;
+    }
+
+    private static @NonNull ArrayList<RestoreInfo> convertToRestoreInfoArray(
+            @NonNull JSONArray array) throws JSONException {
+        ArrayList<RestoreInfo> restoreInfos = new ArrayList<>();
+
+        for (int i = 0; i < array.length(); ++i) {
+            JSONObject jo = array.getJSONObject(i);
+            restoreInfos.add(new RestoreInfo(
+                    jo.getInt("userId"),
+                    jo.getInt("appId"),
+                    jo.getString("seInfo")));
+        }
+
+        return restoreInfos;
+    }
+
+    /**
      * Reads the list of recently executed rollbacks from persistent storage.
      */
     List<RollbackInfo> loadRecentlyExecutedRollbacks() {
@@ -116,7 +178,9 @@
                     int rollbackId = element.getInt("rollbackId");
                     List<PackageRollbackInfo> packages = packageRollbackInfosFromJson(
                             element.getJSONArray("packages"));
-                    RollbackInfo rollback = new RollbackInfo(rollbackId, packages);
+                    List<VersionedPackage> causePackages = versionedPackagesFromJson(
+                            element.getJSONArray("causePackages"));
+                    RollbackInfo rollback = new RollbackInfo(rollbackId, packages, causePackages);
                     recentlyExecutedRollbacks.add(rollback);
                 }
             } catch (IOException | JSONException e) {
@@ -138,11 +202,30 @@
     }
 
     /**
-     * Returns the directory where the code for a package should be stored for
-     * given rollback <code>data</code> and <code>packageName</code>.
+     * Creates a backup copy of the apk or apex for a package.
      */
-    File packageCodePathForAvailableRollback(RollbackData data, String packageName) {
-        return new File(data.backupDir, packageName);
+    static void backupPackageCode(RollbackData data, String packageName, String codePath)
+            throws IOException {
+        File sourceFile = new File(codePath);
+        File targetDir = new File(data.backupDir, packageName);
+        targetDir.mkdirs();
+        File targetFile = new File(targetDir, sourceFile.getName());
+
+        // TODO: Copy by hard link instead to save on cpu and storage space?
+        Files.copy(sourceFile.toPath(), targetFile.toPath());
+    }
+
+    /**
+     * Returns the apk or apex file backed up for the given package.
+     * Returns null if none found.
+     */
+    static File getPackageCode(RollbackData data, String packageName) {
+        File targetDir = new File(data.backupDir, packageName);
+        File[] files = targetDir.listFiles();
+        if (files == null || files.length != 1) {
+            return null;
+        }
+        return files[0];
     }
 
     /**
@@ -187,6 +270,7 @@
                 JSONObject element = new JSONObject();
                 element.put("rollbackId", rollback.getRollbackId());
                 element.put("packages", toJson(rollback.getPackages()));
+                element.put("causePackages", versionedPackagesToJson(rollback.getCausePackages()));
                 array.put(element);
             }
 
@@ -219,21 +303,62 @@
         }
     }
 
+    private JSONObject toJson(VersionedPackage pkg) throws JSONException {
+        JSONObject json = new JSONObject();
+        json.put("packageName", pkg.getPackageName());
+        json.put("longVersionCode", pkg.getLongVersionCode());
+        return json;
+    }
+
+    private VersionedPackage versionedPackageFromJson(JSONObject json) throws JSONException {
+        String packageName = json.getString("packageName");
+        long longVersionCode = json.getLong("longVersionCode");
+        return new VersionedPackage(packageName, longVersionCode);
+    }
+
     private JSONObject toJson(PackageRollbackInfo info) throws JSONException {
         JSONObject json = new JSONObject();
-        json.put("packageName", info.getPackageName());
-        json.put("higherVersionCode", info.getVersionRolledBackFrom().getLongVersionCode());
-        json.put("lowerVersionCode", info.getVersionRolledBackTo().getLongVersionCode());
+        json.put("versionRolledBackFrom", toJson(info.getVersionRolledBackFrom()));
+        json.put("versionRolledBackTo", toJson(info.getVersionRolledBackTo()));
+
+        IntArray pendingBackups = info.getPendingBackups();
+        List<RestoreInfo> pendingRestores = info.getPendingRestores();
+        json.put("pendingBackups", convertToJsonArray(pendingBackups));
+        json.put("pendingRestores", convertToJsonArray(pendingRestores));
+
         return json;
     }
 
     private PackageRollbackInfo packageRollbackInfoFromJson(JSONObject json) throws JSONException {
-        String packageName = json.getString("packageName");
-        long higherVersionCode = json.getLong("higherVersionCode");
-        long lowerVersionCode = json.getLong("lowerVersionCode");
-        return new PackageRollbackInfo(
-                new VersionedPackage(packageName, higherVersionCode),
-                new VersionedPackage(packageName, lowerVersionCode));
+        VersionedPackage versionRolledBackFrom = versionedPackageFromJson(
+                json.getJSONObject("versionRolledBackFrom"));
+        VersionedPackage versionRolledBackTo = versionedPackageFromJson(
+                json.getJSONObject("versionRolledBackTo"));
+
+        final IntArray pendingBackups = convertToIntArray(
+                json.getJSONArray("pendingBackups"));
+        final ArrayList<RestoreInfo> pendingRestores = convertToRestoreInfoArray(
+                json.getJSONArray("pendingRestores"));
+
+        return new PackageRollbackInfo(versionRolledBackFrom, versionRolledBackTo,
+                pendingBackups, pendingRestores);
+    }
+
+    private JSONArray versionedPackagesToJson(List<VersionedPackage> packages)
+            throws JSONException {
+        JSONArray json = new JSONArray();
+        for (VersionedPackage pkg : packages) {
+            json.put(toJson(pkg));
+        }
+        return json;
+    }
+
+    private List<VersionedPackage> versionedPackagesFromJson(JSONArray json) throws JSONException {
+        List<VersionedPackage> packages = new ArrayList<>();
+        for (int i = 0; i < json.length(); ++i) {
+            packages.add(versionedPackageFromJson(json.getJSONObject(i)));
+        }
+        return packages;
     }
 
     private JSONArray toJson(List<PackageRollbackInfo> infos) throws JSONException {
diff --git a/services/core/java/com/android/server/stats/StatsCompanionService.java b/services/core/java/com/android/server/stats/StatsCompanionService.java
index c6d2870..2378c57 100644
--- a/services/core/java/com/android/server/stats/StatsCompanionService.java
+++ b/services/core/java/com/android/server/stats/StatsCompanionService.java
@@ -23,6 +23,7 @@
 import static com.android.server.am.MemoryStatUtil.readMemoryStatFromProcfs;
 import static com.android.server.am.MemoryStatUtil.readRssHighWaterMarkFromProcfs;
 
+import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.ActivityManagerInternal;
 import android.app.AlarmManager;
@@ -83,6 +84,7 @@
 import android.telephony.ModemActivityInfo;
 import android.telephony.TelephonyManager;
 import android.util.ArrayMap;
+import android.util.ArraySet;
 import android.util.Log;
 import android.util.Slog;
 import android.util.StatsLog;
@@ -96,6 +98,7 @@
 import com.android.internal.os.BinderCallsStats.ExportedCallStat;
 import com.android.internal.os.KernelCpuSpeedReader;
 import com.android.internal.os.KernelCpuThreadReader;
+import com.android.internal.os.KernelCpuThreadReaderSettingsObserver;
 import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidActiveTimeReader;
 import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidClusterTimeReader;
 import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidFreqTimeReader;
@@ -112,6 +115,7 @@
 import com.android.server.SystemService;
 import com.android.server.SystemServiceManager;
 import com.android.server.am.MemoryStatUtil.MemoryStat;
+import com.android.server.role.RoleManagerServiceInternal;
 import com.android.server.storage.DiskStatsFileLogger;
 import com.android.server.storage.DiskStatsLoggingService;
 
@@ -200,7 +204,7 @@
             "zygote64",
     };
 
-    private static final int CPU_TIME_PER_THREAD_FREQ_NUM_FREQUENCIES = 8;
+    private static final int CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES = 8;
 
     static final class CompanionHandler extends Handler {
         CompanionHandler(Looper looper) {
@@ -329,7 +333,8 @@
         handlerThread.start();
         mHandler = new CompanionHandler(handlerThread.getLooper());
 
-        mKernelCpuThreadReader = KernelCpuThreadReader.create();
+        mKernelCpuThreadReader =
+                KernelCpuThreadReaderSettingsObserver.getSettingsModifiedReader(mContext);
     }
 
     @Override
@@ -1675,8 +1680,8 @@
             return;
         }
         int[] cpuFrequencies = mKernelCpuThreadReader.getCpuFrequenciesKhz();
-        if (cpuFrequencies.length != CPU_TIME_PER_THREAD_FREQ_NUM_FREQUENCIES) {
-            Slog.w(TAG, "Expected " + CPU_TIME_PER_THREAD_FREQ_NUM_FREQUENCIES
+        if (cpuFrequencies.length > CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES) {
+            Slog.w(TAG, "Expected maximum " + CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES
                     + " frequencies, but got " + cpuFrequencies.length);
             return;
         }
@@ -1700,9 +1705,17 @@
                 e.writeInt(threadCpuUsage.threadId);
                 e.writeString(processCpuUsage.processName);
                 e.writeString(threadCpuUsage.threadName);
-                for (int k = 0; k < CPU_TIME_PER_THREAD_FREQ_NUM_FREQUENCIES; k++) {
-                    e.writeInt(cpuFrequencies[k]);
-                    e.writeInt(threadCpuUsage.usageTimesMillis[k]);
+                for (int k = 0; k < CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES; k++) {
+                    if (k < cpuFrequencies.length) {
+                        e.writeInt(cpuFrequencies[k]);
+                        e.writeInt(threadCpuUsage.usageTimesMillis[k]);
+                    } else {
+                        // If we have no more frequencies to write, we still must write empty data.
+                        // We know that this data is empty (and not just zero) because all
+                        // frequencies are expected to be greater than zero
+                        e.writeInt(0);
+                        e.writeInt(0);
+                    }
                 }
                 pulledData.add(e);
             }
@@ -1781,6 +1794,60 @@
     }
 
     /**
+     * Add a RoleHolder atom for each package that holds a role.
+     *
+     * @param elapsedNanos the time since boot
+     * @param wallClockNanos the time on the clock
+     * @param pulledData the data sink to write to
+     */
+    private void pullRoleHolders(long elapsedNanos, final long wallClockNanos,
+            @NonNull List<StatsLogEventWrapper> pulledData) {
+        long callingToken = Binder.clearCallingIdentity();
+        try {
+            PackageManager pm = mContext.getPackageManager();
+            RoleManagerServiceInternal rm =
+                    LocalServices.getService(RoleManagerServiceInternal.class);
+
+            List<UserInfo> users = mContext.getSystemService(UserManager.class).getUsers();
+
+            int numUsers = users.size();
+            for (int userNum = 0; userNum < numUsers; userNum++) {
+                UserHandle user = users.get(userNum).getUserHandle();
+
+                ArrayMap<String, ArraySet<String>> roles = rm.getRoleHoldersAsUser(user);
+
+                int numRoles = roles.size();
+                for (int roleNum = 0; roleNum < numRoles; roleNum++) {
+                    String roleName = roles.keyAt(roleNum);
+                    ArraySet<String> holders = roles.valueAt(roleNum);
+
+                    int numHolders = holders.size();
+                    for (int holderNum = 0; holderNum < numHolders; holderNum++) {
+                        String holderName = holders.valueAt(holderNum);
+
+                        PackageInfo pkg;
+                        try {
+                            pkg = pm.getPackageInfoAsUser(holderName, 0, user.getIdentifier());
+                        } catch (PackageManager.NameNotFoundException e) {
+                            Log.w(TAG, "Role holder " + holderName + " not found");
+                            return;
+                        }
+
+                        StatsLogEventWrapper e = new StatsLogEventWrapper(StatsLog.ROLE_HOLDER,
+                                elapsedNanos, wallClockNanos);
+                        e.writeInt(pkg.applicationInfo.uid);
+                        e.writeString(holderName);
+                        e.writeString(roleName);
+                        pulledData.add(e);
+                    }
+                }
+            }
+        } finally {
+            Binder.restoreCallingIdentity(callingToken);
+        }
+    }
+
+    /**
      * Pulls various data.
      */
     @Override // Binder call
@@ -1954,6 +2021,10 @@
                 pullDebugFailingElapsedClock(tagId, elapsedNanos, wallClockNanos, ret);
                 break;
             }
+            case StatsLog.ROLE_HOLDER: {
+                pullRoleHolders(elapsedNanos, wallClockNanos, ret);
+                break;
+            }
             default:
                 Slog.w(TAG, "No such tagId data as " + tagId);
                 return null;
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index 7e87c29..d932a40 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -19,6 +19,7 @@
 import static android.app.StatusBarManager.DISABLE2_GLOBAL_ACTIONS;
 import static android.view.Display.DEFAULT_DISPLAY;
 
+import android.annotation.Nullable;
 import android.app.ActivityThread;
 import android.app.Notification;
 import android.app.StatusBarManager;
@@ -42,10 +43,12 @@
 import android.text.TextUtils;
 import android.util.ArrayMap;
 import android.util.Log;
+import android.util.Pair;
 import android.util.Slog;
 import android.util.SparseArray;
 
 import com.android.internal.R;
+import com.android.internal.annotations.GuardedBy;
 import com.android.internal.statusbar.IStatusBar;
 import com.android.internal.statusbar.IStatusBarService;
 import com.android.internal.statusbar.NotificationVisibility;
@@ -669,7 +672,7 @@
     // TODO(b/117478341): make it aware of multi-display if needed.
     /**
      * Disable additional status bar features. Pass the bitwise-or of the DISABLE2_* flags.
-     * To re-enable everything, pass {@link #DISABLE_NONE}.
+     * To re-enable everything, pass {@link #DISABLE2_NONE}.
      *
      * Warning: Only pass DISABLE2_* flags into this function, do not use DISABLE_* flags.
      */
@@ -707,7 +710,7 @@
         final int net2 = gatherDisableActionsLocked(mCurrentUserId, 2);
 
         // TODO(b/113914868): investigation log for disappearing home button
-        if (whichFlag == 1 && pkg.contains("systemui")) {
+        if (whichFlag == 1 && pkg != null && pkg.contains("systemui")) {
             String disabledData = "{ ";
             for (int i = 0; i < mDisableRecords.size(); i++) {
                 DisableRecord tok = mDisableRecords.get(i);
@@ -733,6 +736,30 @@
         }
     }
 
+    /**
+     * Get the currently applied disable flags, in the form of one Pair<Integer, Integer>.
+     *
+     * @return pair of disable flags in the form of (disabled1, disabled2), where (0, 0) indicates
+     * no flags are set for this token.
+     */
+    @Override
+    public int[] getDisableFlags(IBinder token, int userId) {
+        enforceStatusBar();
+
+        int disable1 = 0;
+        int disable2 = 0;
+        synchronized (mLock) {
+            // Find a matching record if it exists
+            DisableRecord record = findMatchingRecordLocked(token, userId).second;
+            if (record != null) {
+                disable1 = record.what1;
+                disable2 = record.what2;
+            }
+        }
+
+        return new int[] {disable1, disable2};
+    }
+
     @Override
     public void setIcon(String slot, String iconPackage, int iconId, int iconLevel,
             String contentDescription) {
@@ -1266,13 +1293,13 @@
 
     @Override
     public void onNotificationSmartReplySent(
-            String key, int replyIndex, CharSequence reply, boolean generatedByAssistant)
-            throws RemoteException {
+            String key, int replyIndex, CharSequence reply, boolean generatedByAssistant,
+            int notificationLocation) throws RemoteException {
         enforceStatusBarService();
         long identity = Binder.clearCallingIdentity();
         try {
             mNotificationDelegate.onNotificationSmartReplySent(key, replyIndex, reply,
-                    generatedByAssistant);
+                    generatedByAssistant, notificationLocation);
         } finally {
             Binder.restoreCallingIdentity(identity);
         }
@@ -1305,7 +1332,7 @@
     @Override
     public void onShellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err,
             String[] args, ShellCallback callback, ResultReceiver resultReceiver) {
-        (new StatusBarShellCommand(this)).exec(
+        (new StatusBarShellCommand(this, mContext)).exec(
                 this, in, out, err, args, callback, resultReceiver);
     }
 
@@ -1325,16 +1352,9 @@
         }
 
         // Find matching record, if any
-        final int N = mDisableRecords.size();
-        DisableRecord record = null;
-        int i;
-        for (i = 0; i < N; i++) {
-            DisableRecord r = mDisableRecords.get(i);
-            if (r.token == token && r.userId == userId) {
-                record = r;
-                break;
-            }
-        }
+        Pair<Integer, DisableRecord> match = findMatchingRecordLocked(token, userId);
+        int i = match.first;
+        DisableRecord record = match.second;
 
         // Remove record if binder is already dead
         if (!token.isBinderAlive()) {
@@ -1361,6 +1381,23 @@
         mDisableRecords.add(record);
     }
 
+    @Nullable
+    @GuardedBy("mLock")
+    private Pair<Integer, DisableRecord> findMatchingRecordLocked(IBinder token, int userId) {
+        final int numRecords = mDisableRecords.size();
+        DisableRecord record = null;
+        int i;
+        for (i = 0; i < numRecords; i++) {
+            DisableRecord r = mDisableRecords.get(i);
+            if (r.token == token && r.userId == userId) {
+                record = r;
+                break;
+            }
+        }
+
+        return new Pair<Integer, DisableRecord>(i, record);
+    }
+
     // lock on mDisableRecords
     int gatherDisableActionsLocked(int userId, int which) {
         final int N = mDisableRecords.size();
diff --git a/services/core/java/com/android/server/statusbar/StatusBarShellCommand.java b/services/core/java/com/android/server/statusbar/StatusBarShellCommand.java
index 4e20f01..ff01d46 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarShellCommand.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarShellCommand.java
@@ -14,21 +14,31 @@
 
 package com.android.server.statusbar;
 
+import static android.app.StatusBarManager.DEFAULT_SETUP_DISABLE2_FLAGS;
+import static android.app.StatusBarManager.DEFAULT_SETUP_DISABLE_FLAGS;
+import static android.app.StatusBarManager.DISABLE2_NONE;
+import static android.app.StatusBarManager.DISABLE_NONE;
+
 import android.content.ComponentName;
+import android.content.Context;
+import android.os.Binder;
+import android.os.IBinder;
 import android.os.RemoteException;
 import android.os.ShellCommand;
 import android.service.quicksettings.TileService;
 
-import com.android.internal.statusbar.IStatusBarService;
-
 import java.io.PrintWriter;
 
 public class StatusBarShellCommand extends ShellCommand {
 
-    private final StatusBarManagerService mInterface;
+    private static final IBinder sToken = new StatusBarShellCommandToken();
 
-    public StatusBarShellCommand(StatusBarManagerService service) {
+    private final StatusBarManagerService mInterface;
+    private final Context mContext;
+
+    public StatusBarShellCommand(StatusBarManagerService service, Context context) {
         mInterface = service;
+        mContext = context;
     }
 
     @Override
@@ -56,6 +66,8 @@
                     return 0;
                 case "get-status-icons":
                     return runGetStatusIcons();
+                case "disable-for-setup":
+                    return runDisableForSetup();
                 default:
                     return handleDefaultCommands(cmd);
             }
@@ -104,6 +116,22 @@
         return 0;
     }
 
+    private int runDisableForSetup() {
+        String arg = getNextArgRequired();
+        String pkg = mContext.getPackageName();
+        boolean disable = Boolean.parseBoolean(arg);
+
+        if (disable) {
+            mInterface.disable(DEFAULT_SETUP_DISABLE_FLAGS, sToken, pkg);
+            mInterface.disable2(DEFAULT_SETUP_DISABLE2_FLAGS, sToken, pkg);
+        } else {
+            mInterface.disable(DISABLE_NONE, sToken, pkg);
+            mInterface.disable2(DISABLE2_NONE, sToken, pkg);
+        }
+
+        return 0;
+    }
+
     @Override
     public void onHelp() {
         final PrintWriter pw = getOutPrintWriter();
@@ -135,5 +163,14 @@
         pw.println("  get-status-icons");
         pw.println("    Print the list of status bar icons and the order they appear in");
         pw.println("");
+        pw.println("  disable-for-setup DISABLE");
+        pw.println("    If true, disable status bar components unsuitable for device setup");
+        pw.println("");
+    }
+
+    /**
+     * Token to send to StatusBarManagerService for disable* commands
+     */
+    private static final class StatusBarShellCommandToken extends Binder {
     }
 }
diff --git a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java b/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java
deleted file mode 100644
index 5f71b0b..0000000
--- a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.timezonedetector;
-
-import com.android.internal.util.DumpUtils;
-import com.android.server.SystemService;
-import android.app.timezonedetector.ITimeZoneDetectorService;
-import android.content.Context;
-import android.util.Slog;
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-
-public final class TimeZoneDetectorService extends ITimeZoneDetectorService.Stub {
-    private static final String TAG = "timezonedetector.TimeZoneDetectorService";
-
-    public static class Lifecycle extends SystemService {
-
-        public Lifecycle(Context context) {
-            super(context);
-        }
-
-        @Override
-        public void onStart() {
-            TimeZoneDetectorService service = TimeZoneDetectorService.create(getContext());
-            // Publish the binder service so it can be accessed from other (appropriately
-            // permissioned) processes.
-            publishBinderService(Context.TIME_ZONE_DETECTOR_SERVICE, service);
-        }
-    }
-
-    private final Context mContext;
-
-    private static TimeZoneDetectorService create(Context context) {
-        return new TimeZoneDetectorService(context);
-    }
-
-    public TimeZoneDetectorService(Context context) {
-        mContext = context;
-    }
-
-    @Override
-    public void stubbedCall() {
-        // Empty call for initial tests.
-        Slog.d(TAG, "stubbedCall() called");
-        // TODO: Remove when there are real methods.
-    }
-
-    @Override
-    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
-        if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
-        // TODO: Implement when there is state.
-    }
-}
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
index b0ef8a0..071dde7 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
@@ -2243,12 +2243,9 @@
         synchronized (mLock) {
             mInAmbientMode = inAmbientMode;
             final WallpaperData data = mWallpaperMap.get(mCurrentUserId);
-            final boolean hasConnection = data != null && data.connection != null;
-            final WallpaperInfo info = hasConnection ? data.connection.mInfo : null;
-
             // The wallpaper info is null for image wallpaper, also use the engine in this case.
-            if (hasConnection && (info == null && isAodImageWallpaperEnabled()
-                    || info != null && info.supportsAmbientMode())) {
+            if (data != null && data.connection != null && (data.connection.mInfo == null
+                    || data.connection.mInfo.supportsAmbientMode())) {
                 // TODO(multi-display) Extends this method with specific display.
                 engine = data.connection.getDisplayConnectorOrCreate(DEFAULT_DISPLAY).mEngine;
             } else {
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 8f39f3d..38e8785 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -1916,6 +1916,8 @@
      * @return true if the input activity should be made visible, ignoring any effect Keyguard
      * might have on the visibility
      *
+     * TODO(b/123540470): Combine this method and {@link #shouldBeVisible(boolean)}.
+     *
      * @see {@link ActivityStack#checkKeyguardVisibility}
      */
     boolean shouldBeVisibleIgnoringKeyguard(boolean behindFullscreenActivity) {
@@ -1926,6 +1928,36 @@
         return !behindFullscreenActivity || mLaunchTaskBehind;
     }
 
+    boolean shouldBeVisible(boolean behindFullscreenActivity) {
+        // Check whether activity should be visible without Keyguard influence
+        visibleIgnoringKeyguard = shouldBeVisibleIgnoringKeyguard(behindFullscreenActivity);
+
+        final ActivityStack stack = getActivityStack();
+        if (stack == null) {
+            return false;
+        }
+
+        // Whether this activity is the top activity of this stack.
+        final boolean isTop = this == stack.getTopActivity();
+        // Exclude the case where this is the top activity in a pinned stack.
+        final boolean isTopNotPinnedStack = stack.isAttached()
+                && stack.getDisplay().isTopNotPinnedStack(stack);
+        // Now check whether it's really visible depending on Keyguard state.
+        return stack.checkKeyguardVisibility(this,
+                visibleIgnoringKeyguard, isTop && isTopNotPinnedStack);
+    }
+
+    boolean shouldBeVisible() {
+        final ActivityStack stack = getActivityStack();
+        if (stack == null) {
+            return false;
+        }
+
+        // TODO: Use real value of behindFullscreenActivity calculated using the same logic in
+        // ActivityStack#ensureActivitiesVisibleLocked().
+        return shouldBeVisible(!stack.shouldBeVisible(null /* starting */));
+    }
+
     void makeVisibleIfNeeded(ActivityRecord starting, boolean reportToClient) {
         // This activity is not currently visible, but is running. Tell it to become visible.
         if (mState == RESUMED || this == starting) {
@@ -2033,7 +2065,8 @@
      * - should be either the topmost in task, or right below the top activity that is finishing
      * If all of these conditions are not met at the same time, the activity cannot be made active.
      */
-    private boolean shouldMakeActive(ActivityRecord activeActivity) {
+    @VisibleForTesting
+    boolean shouldMakeActive(ActivityRecord activeActivity) {
         // If the activity is stopped, stopping, cycle to an active state. We avoid doing
         // this when there is an activity waiting to become translucent as the extra binder
         // calls will lead to noticeable jank. A later call to
@@ -2048,6 +2081,11 @@
             return false;
         }
 
+        if (!mStackSupervisor.readyToResume()) {
+            // Making active is currently deferred (e.g. because an activity launch is in progress).
+            return false;
+        }
+
         if (this.mLaunchTaskBehind) {
             // This activity is being launched from behind, which means that it's not intended to be
             // presented to user right now, even if it's set to be visible.
@@ -2848,11 +2886,7 @@
             return true;
         }
 
-        // TODO: We should add ActivityRecord.shouldBeVisible() that checks if the activity should
-        // be visible based on the stack, task, and lockscreen state and use that here instead. The
-        // method should be based on the logic in ActivityStack.ensureActivitiesVisibleLocked().
-        // Skip updating configuration for activity is a stack that shouldn't be visible.
-        if (!stack.shouldBeVisible(null /* starting */)) {
+        if (!shouldBeVisible()) {
             if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION,
                     "Skipping config check invisible stack: " + this);
             return true;
diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java
index 549567a..16c44aa 100644
--- a/services/core/java/com/android/server/wm/ActivityStack.java
+++ b/services/core/java/com/android/server/wm/ActivityStack.java
@@ -148,7 +148,6 @@
 import android.util.IntArray;
 import android.util.Log;
 import android.util.Slog;
-import android.util.SparseArray;
 import android.util.proto.ProtoOutputStream;
 import android.view.Display;
 
@@ -377,8 +376,6 @@
     /** Stores the override windowing-mode from before a transient mode change (eg. split) */
     private int mRestoreOverrideWindowingMode = WINDOWING_MODE_UNDEFINED;
 
-    private final SparseArray<Rect> mTmpBounds = new SparseArray<>();
-    private final SparseArray<Rect> mTmpInsetBounds = new SparseArray<>();
     private final Rect mTmpRect = new Rect();
     private final Rect mTmpRect2 = new Rect();
     private final Rect mTmpRect3 = new Rect();
@@ -2095,8 +2092,6 @@
             final boolean stackShouldBeVisible = shouldBeVisible(starting);
             boolean behindFullscreenActivity = !stackShouldBeVisible;
             boolean resumeNextActivity = isFocusable() && isInStackLocked(starting) == null;
-            final boolean isTopNotPinnedStack =
-                    isAttached() && getDisplay().isTopNotPinnedStack(this);
             for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
                 final TaskRecord task = mTaskHistory.get(taskNdx);
                 final ArrayList<ActivityRecord> activities = task.mActivities;
@@ -2114,11 +2109,7 @@
                     // Check whether activity should be visible without Keyguard influence
                     final boolean visibleIgnoringKeyguard = r.shouldBeVisibleIgnoringKeyguard(
                             behindFullscreenActivity);
-                    r.visibleIgnoringKeyguard = visibleIgnoringKeyguard;
-
-                    // Now check whether it's really visible depending on Keyguard state.
-                    final boolean reallyVisible = checkKeyguardVisibility(r,
-                            visibleIgnoringKeyguard, isTop && isTopNotPinnedStack);
+                    final boolean reallyVisible = r.shouldBeVisible(behindFullscreenActivity);
                     if (visibleIgnoringKeyguard) {
                         behindFullscreenActivity = updateBehindFullscreen(!stackShouldBeVisible,
                                 behindFullscreenActivity, r);
@@ -4674,6 +4665,14 @@
         removeHistoryRecordsForAppLocked(mStackSupervisor.mFinishingActivities, app,
                 "mFinishingActivities");
 
+        final boolean isProcessRemoved = app.isRemoved();
+        if (isProcessRemoved) {
+            // The package of the died process should be force-stopped, so make its activities as
+            // finishing to prevent the process from being started again if the next top (or being
+            // visible) activity also resides in the same process.
+            app.makeFinishingForProcessRemoved();
+        }
+
         boolean hasVisibleActivities = false;
 
         // Clean out the history list.
@@ -4726,7 +4725,7 @@
                                 + " stateNotNeeded=" + r.stateNotNeeded
                                 + " finishing=" + r.finishing
                                 + " state=" + r.getState() + " callers=" + Debug.getCallers(5));
-                        if (!r.finishing) {
+                        if (!r.finishing || isProcessRemoved) {
                             Slog.w(TAG, "Force removing " + r + ": app died, no saved state");
                             EventLog.writeEvent(EventLogTags.AM_FINISH_ACTIVITY,
                                     r.mUserId, System.identityHashCode(r),
@@ -4998,22 +4997,11 @@
         // Update override configurations of all tasks in the stack.
         final Rect taskBounds = tempTaskBounds != null ? tempTaskBounds : bounds;
 
-        mTmpBounds.clear();
-        mTmpInsetBounds.clear();
-
         for (int i = mTaskHistory.size() - 1; i >= 0; i--) {
             final TaskRecord task = mTaskHistory.get(i);
             if (task.isResizeable()) {
                 task.updateOverrideConfiguration(taskBounds, tempTaskInsetBounds);
             }
-
-            if (task.hasDisplayedBounds()) {
-                mTmpBounds.put(task.taskId, task.getDisplayedBounds());
-                mTmpInsetBounds.put(task.taskId, task.getRequestedOverrideBounds());
-            } else {
-                mTmpBounds.put(task.taskId, task.getRequestedOverrideBounds());
-                mTmpInsetBounds.put(task.taskId, null);
-            }
         }
 
         setBounds(bounds);
@@ -5131,12 +5119,6 @@
                     }
                     didSomething = true;
                     Slog.i(TAG, "  Force finishing activity " + r);
-                    if (sameComponent) {
-                        if (r.hasProcess()) {
-                            r.app.setRemoved(true);
-                        }
-                        r.app = null;
-                    }
                     lastTask = r.getTaskRecord();
                     finishActivityLocked(r, Activity.RESULT_CANCELED, null, "force-stop",
                             true);
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index 95a6f71..1d71d876 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -926,6 +926,10 @@
         if (callerApp != null && callerApp.hasForegroundActivities()) {
             return false;
         }
+        // don't abort if the callerApp is instrumenting with background activity starts privileges
+        if (callerApp != null && callerApp.isInstrumentingWithBackgroundActivityStartPrivileges()) {
+            return false;
+        }
         // don't abort if the callingUid is in the foreground or is a persistent system process
         final int callingUidProcState = mService.getUidStateLocked(callingUid);
         final boolean callingUidHasAnyVisibleWindow =
@@ -976,6 +980,10 @@
         if (mSupervisor.mRecentTasks.isCallerRecents(callingUid)) {
             return false;
         }
+        // don't abort if the callingPackage is a device owner
+        if (mService.getDevicePolicyManager().isDeviceOwnerApp(callingPackage)) {
+            return false;
+        }
         // anything that has fallen through would currently be aborted
         Slog.w(TAG, "Background activity start [callingPackage: " + callingPackage
                 + "; callingUid: " + callingUid
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 5fabde4..14c4814 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -151,6 +151,7 @@
 import android.app.WaitResult;
 import android.app.WindowConfiguration;
 import android.app.admin.DevicePolicyCache;
+import android.app.admin.DevicePolicyManager;
 import android.app.assist.AssistContent;
 import android.app.assist.AssistStructure;
 import android.app.usage.UsageStatsManagerInternal;
@@ -349,11 +350,20 @@
 
     /* Global service lock used by the package the owns this service. */
     final WindowManagerGlobalLock mGlobalLock = new WindowManagerGlobalLock();
+    /**
+     * It is the same instance as {@link mGlobalLock}, just declared as a type that the
+     * locked-region-code-injection does't recognize it. It is used to skip wrapping priority
+     * booster for places that are already in the scope of another booster (e.g. computing oom-adj).
+     *
+     * @see WindowManagerThreadPriorityBooster
+     */
+    final Object mGlobalLockWithoutBoost = mGlobalLock;
     ActivityStackSupervisor mStackSupervisor;
     RootActivityContainer mRootActivityContainer;
     WindowManagerService mWindowManager;
     private UserManagerService mUserManager;
     private AppOpsService mAppOpsService;
+    private DevicePolicyManager mDpm;
     /** All active uids in the system. */
     private final SparseArray<Integer> mActiveUids = new SparseArray<>();
     private final SparseArray<String> mPendingTempWhitelist = new SparseArray<>();
@@ -828,6 +838,13 @@
         return mAppOpsService;
     }
 
+    DevicePolicyManager getDevicePolicyManager() {
+        if (mDpm == null) {
+            mDpm = mContext.getSystemService(DevicePolicyManager.class);
+        }
+        return mDpm;
+    }
+
     boolean hasUserRestriction(String restriction, int userId) {
         return getUserManager().hasUserRestriction(restriction, userId);
     }
@@ -6837,7 +6854,7 @@
 
         @Override
         public WindowProcessController getTopApp() {
-            synchronized (mGlobalLock) {
+            synchronized (mGlobalLockWithoutBoost) {
                 final ActivityRecord top = mRootActivityContainer.getTopResumedActivity();
                 return top != null ? top.app : null;
             }
@@ -6845,7 +6862,7 @@
 
         @Override
         public void rankTaskLayersIfNeeded() {
-            synchronized (mGlobalLock) {
+            synchronized (mGlobalLockWithoutBoost) {
                 if (mRootActivityContainer != null) {
                     mRootActivityContainer.rankTaskLayersIfNeeded();
                 }
@@ -6889,28 +6906,28 @@
 
         @Override
         public void onUidActive(int uid, int procState) {
-            synchronized (mGlobalLock) {
+            synchronized (mGlobalLockWithoutBoost) {
                 mActiveUids.put(uid, procState);
             }
         }
 
         @Override
         public void onUidInactive(int uid) {
-            synchronized (mGlobalLock) {
+            synchronized (mGlobalLockWithoutBoost) {
                 mActiveUids.remove(uid);
             }
         }
 
         @Override
         public void onActiveUidsCleared() {
-            synchronized (mGlobalLock) {
+            synchronized (mGlobalLockWithoutBoost) {
                 mActiveUids.clear();
             }
         }
 
         @Override
         public void onUidProcStateChanged(int uid, int procState) {
-            synchronized (mGlobalLock) {
+            synchronized (mGlobalLockWithoutBoost) {
                 if (mActiveUids.get(uid) != null) {
                     mActiveUids.put(uid, procState);
                 }
@@ -6919,14 +6936,14 @@
 
         @Override
         public void onUidAddedToPendingTempWhitelist(int uid, String tag) {
-            synchronized (mGlobalLock) {
+            synchronized (mGlobalLockWithoutBoost) {
                 mPendingTempWhitelist.put(uid, tag);
             }
         }
 
         @Override
         public void onUidRemovedFromPendingTempWhitelist(int uid) {
-            synchronized (mGlobalLock) {
+            synchronized (mGlobalLockWithoutBoost) {
                 mPendingTempWhitelist.remove(uid);
             }
         }
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index 3237fe0..29ba166 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -978,8 +978,8 @@
     }
 
     @Override
-    void onParentSet() {
-        super.onParentSet();
+    void onParentChanged() {
+        super.onParentChanged();
 
         final Task task = getTask();
 
diff --git a/services/core/java/com/android/server/wm/ConfigurationContainer.java b/services/core/java/com/android/server/wm/ConfigurationContainer.java
index ce3fb51..d86cf0f 100644
--- a/services/core/java/com/android/server/wm/ConfigurationContainer.java
+++ b/services/core/java/com/android/server/wm/ConfigurationContainer.java
@@ -532,7 +532,7 @@
     /**
      * Must be called when new parent for the container was set.
      */
-    protected void onParentChanged() {
+    void onParentChanged() {
         final ConfigurationContainer parent = getParent();
         // Removing parent usually means that we've detached this entity to destroy it or to attach
         // to another parent. In both cases we don't need to update the configuration now.
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 7a9ff52..9fb922f 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -29,6 +29,7 @@
 import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
 import static android.view.Display.DEFAULT_DISPLAY;
 import static android.view.Display.FLAG_PRIVATE;
+import static android.view.Display.INVALID_DISPLAY;
 import static android.view.InsetsState.TYPE_IME;
 import static android.view.InsetsState.TYPE_NAVIGATION_BAR;
 import static android.view.InsetsState.TYPE_TOP_BAR;
@@ -46,6 +47,7 @@
 import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
 import static android.view.WindowManager.LayoutParams.FLAG_SECURE;
 import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
+import static android.view.WindowManager.LayoutParams.FLAG_SPLIT_TOUCH;
 import static android.view.WindowManager.LayoutParams.NEEDS_MENU_SET_TRUE;
 import static android.view.WindowManager.LayoutParams.NEEDS_MENU_UNSET;
 import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
@@ -143,9 +145,11 @@
 import android.graphics.Region;
 import android.graphics.Region.Op;
 import android.hardware.display.DisplayManagerInternal;
+import android.os.Binder;
 import android.os.Debug;
 import android.os.Handler;
 import android.os.IBinder;
+import android.os.Process;
 import android.os.RemoteException;
 import android.os.SystemClock;
 import android.os.Trace;
@@ -160,6 +164,7 @@
 import android.view.Gravity;
 import android.view.InputChannel;
 import android.view.InputDevice;
+import android.view.InputWindowHandle;
 import android.view.InsetsState.InternalInsetType;
 import android.view.MagnificationSpec;
 import android.view.RemoteAnimationDefinition;
@@ -519,6 +524,9 @@
 
     private final InsetsStateController mInsetsStateController;
 
+    private SurfaceControl mParentSurfaceControl;
+    private InputWindowHandle mPortalWindowHandle;
+
     // Last systemUiVisibility we received from status bar.
     private int mLastStatusBarVisibility = 0;
     // Last systemUiVisibility we dispatched to windows.
@@ -1659,35 +1667,42 @@
         final int len = devices != null ? devices.length : 0;
         for (int i = 0; i < len; i++) {
             InputDevice device = devices[i];
-            if (!device.isVirtual()) {
-                final int sources = device.getSources();
-                final int presenceFlag = device.isExternal() ?
-                        WindowManagerPolicy.PRESENCE_EXTERNAL :
-                        WindowManagerPolicy.PRESENCE_INTERNAL;
+            // Ignore virtual input device.
+            if (device.isVirtual()) {
+                continue;
+            }
 
-                // TODO(multi-display): Configure on per-display basis.
-                if (mWmService.mIsTouchDevice) {
-                    if ((sources & InputDevice.SOURCE_TOUCHSCREEN) ==
-                            InputDevice.SOURCE_TOUCHSCREEN) {
-                        config.touchscreen = Configuration.TOUCHSCREEN_FINGER;
-                    }
-                } else {
-                    config.touchscreen = Configuration.TOUCHSCREEN_NOTOUCH;
-                }
+            // Check if input device can dispatch events to current display.
+            // If display type is virtual, will follow the default display.
+            if (!mWmService.mInputManager.canDispatchToDisplay(device.getId(),
+                    displayInfo.type == Display.TYPE_VIRTUAL ? DEFAULT_DISPLAY : mDisplayId)) {
+                continue;
+            }
 
-                if ((sources & InputDevice.SOURCE_TRACKBALL) == InputDevice.SOURCE_TRACKBALL) {
-                    config.navigation = Configuration.NAVIGATION_TRACKBALL;
-                    navigationPresence |= presenceFlag;
-                } else if ((sources & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD
-                        && config.navigation == Configuration.NAVIGATION_NONAV) {
-                    config.navigation = Configuration.NAVIGATION_DPAD;
-                    navigationPresence |= presenceFlag;
-                }
+            final int sources = device.getSources();
+            final int presenceFlag = device.isExternal()
+                    ? WindowManagerPolicy.PRESENCE_EXTERNAL : WindowManagerPolicy.PRESENCE_INTERNAL;
 
-                if (device.getKeyboardType() == InputDevice.KEYBOARD_TYPE_ALPHABETIC) {
-                    config.keyboard = Configuration.KEYBOARD_QWERTY;
-                    keyboardPresence |= presenceFlag;
+            if (mWmService.mIsTouchDevice) {
+                if ((sources & InputDevice.SOURCE_TOUCHSCREEN) == InputDevice.SOURCE_TOUCHSCREEN) {
+                    config.touchscreen = Configuration.TOUCHSCREEN_FINGER;
                 }
+            } else {
+                config.touchscreen = Configuration.TOUCHSCREEN_NOTOUCH;
+            }
+
+            if ((sources & InputDevice.SOURCE_TRACKBALL) == InputDevice.SOURCE_TRACKBALL) {
+                config.navigation = Configuration.NAVIGATION_TRACKBALL;
+                navigationPresence |= presenceFlag;
+            } else if ((sources & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD
+                    && config.navigation == Configuration.NAVIGATION_NONAV) {
+                config.navigation = Configuration.NAVIGATION_DPAD;
+                navigationPresence |= presenceFlag;
+            }
+
+            if (device.getKeyboardType() == InputDevice.KEYBOARD_TYPE_ALPHABETIC) {
+                config.keyboard = Configuration.KEYBOARD_QWERTY;
+                keyboardPresence |= presenceFlag;
             }
         }
 
@@ -2412,10 +2427,7 @@
             win.getTouchableRegion(mTmpRegion);
             mTouchExcludeRegion.op(mTmpRegion, Region.Op.UNION);
         }
-        for (int i = mTapExcludeProvidingWindows.size() - 1; i >= 0; i--) {
-            final WindowState win = mTapExcludeProvidingWindows.valueAt(i);
-            win.amendTapExcludeRegion(mTouchExcludeRegion);
-        }
+        amendWindowTapExcludeRegion(mTouchExcludeRegion);
         // TODO(multi-display): Support docked stacks on secondary displays.
         if (mDisplayId == DEFAULT_DISPLAY && getSplitScreenPrimaryStack() != null) {
             mDividerControllerLocked.getTouchRegion(mTmpRect);
@@ -2427,6 +2439,18 @@
         }
     }
 
+    /**
+     * Union the region with all the tap exclude region provided by windows on this display.
+     *
+     * @param inOutRegion The region to be amended.
+     */
+    void amendWindowTapExcludeRegion(Region inOutRegion) {
+        for (int i = mTapExcludeProvidingWindows.size() - 1; i >= 0; i--) {
+            final WindowState win = mTapExcludeProvidingWindows.valueAt(i);
+            win.amendTapExcludeRegion(inOutRegion);
+        }
+    }
+
     @Override
     void switchUser() {
         super.switchUser();
@@ -3588,6 +3612,13 @@
     private void updateBounds() {
         calculateBounds(mDisplayInfo, mTmpBounds);
         setBounds(mTmpBounds);
+        if (mPortalWindowHandle != null && mParentSurfaceControl != null) {
+            mPortalWindowHandle.touchableRegion.getBounds(mTmpRect);
+            if (!mTmpBounds.equals(mTmpRect)) {
+                mPortalWindowHandle.touchableRegion.set(mTmpBounds);
+                mPendingTransaction.setInputWindowInfo(mParentSurfaceControl, mPortalWindowHandle);
+            }
+        }
     }
 
     // Determines the current display bounds based on the current state
@@ -4358,8 +4389,8 @@
         }
 
         @Override
-        void onParentSet() {
-            super.onParentSet();
+        void onParentChanged() {
+            super.onParentChanged();
             if (getParent() != null) {
                 mAppAnimationLayer = makeChildSurface(null)
                         .setName("animationLayer")
@@ -4614,10 +4645,10 @@
     }
 
     @Override
-    void onParentSet() {
+    void onParentChanged() {
         // Since we are the top of the SurfaceControl hierarchy here
         // we create the root surfaces explicitly rather than chaining
-        // up as the default implementation in onParentSet does. So we
+        // up as the default implementation in onParentChanged does. So we
         // explicitly do NOT call super here.
     }
 
@@ -4832,15 +4863,43 @@
                 || mWmService.mForceDesktopModeOnExternalDisplays;
     }
 
-     /**
+    /**
      * Re-parent the DisplayContent's top surfaces, {@link #mWindowingLayer} and
      * {@link #mOverlayLayer} to the specified surfaceControl.
      *
-     * @param surfaceControlHandle The new SurfaceControl, where the DisplayContent's
-     *                             surfaces will be re-parented to.
+     * @param sc The new SurfaceControl, where the DisplayContent's surfaces will be re-parented to.
      */
     void reparentDisplayContent(SurfaceControl sc) {
-        mPendingTransaction.reparent(mWindowingLayer, sc)
-                .reparent(mOverlayLayer, sc);
+        mParentSurfaceControl = sc;
+        if (mPortalWindowHandle == null) {
+            mPortalWindowHandle = createPortalWindowHandle(sc.toString());
+        }
+        mPendingTransaction.setInputWindowInfo(sc, mPortalWindowHandle)
+                .reparent(mWindowingLayer, sc).reparent(mOverlayLayer, sc);
+    }
+
+    /**
+     * Create a portal window handle for input. This window transports any touch to the display
+     * indicated by {@link InputWindowHandle#portalToDisplayId} if the touch hits this window.
+     *
+     * @param name The name of the portal window handle.
+     * @return the new portal window handle.
+     */
+    private InputWindowHandle createPortalWindowHandle(String name) {
+        // Let surface flinger to set the display ID of this input window handle because we don't
+        // know which display the parent surface control is on.
+        final InputWindowHandle portalWindowHandle = new InputWindowHandle(
+                null /* inputApplicationHandle */, null /* clientWindow */, INVALID_DISPLAY);
+        portalWindowHandle.name = name;
+        portalWindowHandle.token = new Binder();
+        portalWindowHandle.layoutParamsFlags =
+                FLAG_SPLIT_TOUCH | FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCH_MODAL;
+        getBounds(mTmpBounds);
+        portalWindowHandle.touchableRegion.set(mTmpBounds);
+        portalWindowHandle.scaleFactor = 1f;
+        portalWindowHandle.ownerPid = Process.myPid();
+        portalWindowHandle.ownerUid = Process.myUid();
+        portalWindowHandle.portalToDisplayId = mDisplayId;
+        return portalWindowHandle;
     }
 }
diff --git a/services/core/java/com/android/server/wm/TapExcludeRegionHolder.java b/services/core/java/com/android/server/wm/TapExcludeRegionHolder.java
index cbc936f..0a4ab67 100644
--- a/services/core/java/com/android/server/wm/TapExcludeRegionHolder.java
+++ b/services/core/java/com/android/server/wm/TapExcludeRegionHolder.java
@@ -49,7 +49,9 @@
     void amendRegion(Region region, Rect boundingRegion) {
         for (int i = mTapExcludeRects.size() - 1; i>= 0 ; --i) {
             final Rect rect = mTapExcludeRects.valueAt(i);
-            rect.intersect(boundingRegion);
+            if (boundingRegion != null) {
+                rect.intersect(boundingRegion);
+            }
             region.union(rect);
         }
     }
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 476bd6e..7a86c96 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -252,8 +252,8 @@
     }
 
     @Override
-    void onParentSet() {
-        super.onParentSet();
+    void onParentChanged() {
+        super.onParentChanged();
 
         // Update task bounds if needed.
         adjustBoundsForDisplayChangeIfNeeded(getDisplayContent());
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotPersister.java b/services/core/java/com/android/server/wm/TaskSnapshotPersister.java
index e6d646c..3c9a46b 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotPersister.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotPersister.java
@@ -26,6 +26,7 @@
 import android.app.ActivityManager.TaskSnapshot;
 import android.graphics.Bitmap;
 import android.graphics.Bitmap.Config;
+import android.hardware.HardwareBuffer;
 import android.os.Process;
 import android.os.SystemClock;
 import android.util.ArraySet;
@@ -359,7 +360,11 @@
         }
 
         boolean writeBuffer() {
-            final Bitmap bitmap = Bitmap.createHardwareBitmap(mSnapshot.getSnapshot());
+            // TODO(b/116112787) TaskSnapshot needs bookkeep the ColorSpace of the
+            // hardware bitmap when created.
+            final Bitmap bitmap = Bitmap.wrapHardwareBuffer(
+                    HardwareBuffer.createFromGraphicBuffer(mSnapshot.getSnapshot()),
+                    mSnapshot.getColorSpace());
             if (bitmap == null) {
                 Slog.e(TAG, "Invalid task snapshot hw bitmap");
                 return false;
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index 8ed7d04..6d4bcdc 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -66,7 +66,6 @@
 import android.util.DisplayMetrics;
 import android.util.EventLog;
 import android.util.Slog;
-import android.util.SparseArray;
 import android.util.proto.ProtoOutputStream;
 import android.view.DisplayCutout;
 import android.view.DisplayInfo;
@@ -186,33 +185,6 @@
         return mChildren.get(mChildren.size() - 1);
     }
 
-    /**
-     * Set the bounds of the stack and its containing tasks.
-     * @param stackBounds New stack bounds. Passing in null sets the bounds to fullscreen.
-     * @param taskBounds Bounds for individual tasks, keyed by task id.
-     * @param taskTempInsetBounds Inset bounds for individual tasks, keyed by task id.
-     * @return True if the stack bounds was changed.
-     * */
-    boolean setBounds(
-            Rect stackBounds, SparseArray<Rect> taskBounds, SparseArray<Rect> taskTempInsetBounds) {
-        setBounds(stackBounds);
-
-        // Update bounds of containing tasks.
-        for (int taskNdx = mChildren.size() - 1; taskNdx >= 0; --taskNdx) {
-            final Task task = mChildren.get(taskNdx);
-            final Rect insetBounds =
-                    taskTempInsetBounds != null ? taskTempInsetBounds.get(task.mTaskId) : null;
-            if (insetBounds != null) {
-                task.setBounds(insetBounds);
-                task.setOverrideDisplayedBounds(taskBounds.get(task.mTaskId));
-            } else {
-                task.setBounds(taskBounds.get(task.mTaskId));
-                task.setOverrideDisplayedBounds(null);
-            }
-        }
-        return true;
-    }
-
     void prepareFreezingTaskBounds() {
         for (int taskNdx = mChildren.size() - 1; taskNdx >= 0; --taskNdx) {
             final Task task = mChildren.get(taskNdx);
@@ -799,23 +771,6 @@
     }
 
     /**
-     * Re-sizes a stack and its containing tasks.
-     *
-     * @param bounds New stack bounds. Passing in null sets the bounds to fullscreen.
-     * @param taskBounds Bounds for tasks in the resized stack, keyed by task id.
-     * @param taskTempInsetBounds Inset bounds for individual tasks, keyed by task id.
-     */
-    void resize(Rect bounds, SparseArray<Rect> taskBounds,
-            SparseArray<Rect> taskTempInsetBounds) {
-        // We might trigger a configuration change. Save the current task bounds for freezing.
-        prepareFreezingTaskBounds();
-        if (setBounds(bounds, taskBounds, taskTempInsetBounds) && isVisible()) {
-            getDisplayContent().setLayoutNeeded();
-            mWmService.mWindowPlacerLocked.performSurfacePlacement();
-        }
-    }
-
-    /**
      * Calculate an amount by which to expand the stack bounds in each direction.
      * Used to make room for shadows in the pinned windowing mode.
      */
@@ -1041,8 +996,8 @@
     }
 
     @Override
-    void onParentSet() {
-        super.onParentSet();
+    void onParentChanged() {
+        super.onParentChanged();
 
         if (getParent() != null || mDisplayContent == null) {
             return;
diff --git a/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java b/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java
index 2e5df45..dd94af6 100644
--- a/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java
+++ b/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java
@@ -70,6 +70,18 @@
                     // method target window will lose the focus.
                     return;
                 }
+                final Region windowTapExcludeRegion = Region.obtain();
+                mDisplayContent.amendWindowTapExcludeRegion(windowTapExcludeRegion);
+                if (windowTapExcludeRegion.contains(x, y)) {
+                    windowTapExcludeRegion.recycle();
+                    // The user is tapping on the window tap exclude region. We don't move this
+                    // display to top. A window tap exclude region, for example, may be set by an
+                    // ActivityView, and the region would match the bounds of both the ActivityView
+                    // and the virtual display in it. In this case, we would take the tap that is on
+                    // the embedded virtual display instead of this display.
+                    return;
+                }
+                windowTapExcludeRegion.recycle();
                 WindowContainer parent = mDisplayContent.getParent();
                 if (parent != null && parent.getTopChild() != mDisplayContent) {
                     parent.positionChildAt(WindowContainer.POSITION_TOP, mDisplayContent,
@@ -81,9 +93,6 @@
 
     @Override
     public void onPointerEvent(MotionEvent motionEvent) {
-        if (motionEvent.getDisplayId() != getDisplayId()) {
-            return;
-        }
         switch (motionEvent.getActionMasked()) {
             case MotionEvent.ACTION_DOWN: {
                 final int x = (int) motionEvent.getX();
diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java
index c15afc5..74fb3fa 100644
--- a/services/core/java/com/android/server/wm/WallpaperController.java
+++ b/services/core/java/com/android/server/wm/WallpaperController.java
@@ -34,8 +34,10 @@
 import static com.android.server.wm.WindowManagerService.H.WALLPAPER_DRAW_PENDING_TIMEOUT;
 
 import android.graphics.Bitmap;
+import android.graphics.ColorSpace;
 import android.graphics.GraphicBuffer;
 import android.graphics.Rect;
+import android.hardware.HardwareBuffer;
 import android.os.Bundle;
 import android.os.Debug;
 import android.os.IBinder;
@@ -729,7 +731,10 @@
             Slog.w(TAG_WM, "Failed to screenshot wallpaper");
             return null;
         }
-        return Bitmap.createHardwareBitmap(wallpaperBuffer);
+        // TODO(b/116112787) Now that hardware bitmap creation can take color space, we
+        // should continue to fix screenshot.
+        return Bitmap.wrapHardwareBuffer(HardwareBuffer.createFromGraphicBuffer(wallpaperBuffer),
+                                         ColorSpace.get(ColorSpace.Named.SRGB));
     }
 
     private WindowState getTopVisibleWallpaper() {
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index 1905877..f330569 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -161,23 +161,16 @@
 
     final protected void setParent(WindowContainer<WindowContainer> parent) {
         mParent = parent;
-        // Removing parent usually means that we've detached this entity to destroy it or to attach
-        // to another parent. In both cases we don't need to update the configuration now.
-        if (mParent != null) {
-            // Update full configuration of this container and all its children.
-            onConfigurationChanged(mParent.getConfiguration());
-            // Update merged override configuration of this container and all its children.
-            onMergedOverrideConfigurationChanged();
-        }
-
-        onParentSet();
+        onParentChanged();
     }
 
     /**
      * Callback that is triggered when @link WindowContainer#setParent(WindowContainer)} was called.
      * Supposed to be overridden and contain actions that should be executed after parent was set.
      */
-    void onParentSet() {
+    @Override
+    void onParentChanged() {
+        super.onParentChanged();
         if (mParent == null) {
             return;
         }
diff --git a/services/core/java/com/android/server/wm/WindowManagerInternal.java b/services/core/java/com/android/server/wm/WindowManagerInternal.java
index e204697..33e46f4 100644
--- a/services/core/java/com/android/server/wm/WindowManagerInternal.java
+++ b/services/core/java/com/android/server/wm/WindowManagerInternal.java
@@ -313,6 +313,22 @@
     public abstract void waitForAllWindowsDrawn(Runnable callback, long timeout);
 
     /**
+     * Overrides the display size.
+     *
+     * @param displayId The display to override the display size.
+     * @param width The width to override.
+     * @param height The height to override.
+     */
+    public abstract void setForcedDisplaySize(int displayId, int width, int height);
+
+    /**
+     * Recover the display size to real display size.
+     *
+     * @param displayId The display to recover the display size.
+     */
+    public abstract void clearForcedDisplaySize(int displayId);
+
+    /**
      * Adds a window token for a given window type.
      *
      * @param token The token to add.
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index e6581df..975e62a 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -192,6 +192,7 @@
 import android.view.DisplayInfo;
 import android.view.Gravity;
 import android.view.IAppTransitionAnimationSpecsFuture;
+import android.view.IDisplayFoldListener;
 import android.view.IDockedStackListener;
 import android.view.IInputFilter;
 import android.view.IOnKeyguardExitResult;
@@ -3748,6 +3749,16 @@
     }
 
     @Override
+    public void registerDisplayFoldListener(IDisplayFoldListener listener) {
+        mPolicy.registerDisplayFoldListener(listener);
+    }
+
+    @Override
+    public void unregisterDisplayFoldListener(IDisplayFoldListener listener) {
+        mPolicy.unregisterDisplayFoldListener(listener);
+    }
+
+    @Override
     public int getPreferredOptionsPanelGravity(int displayId) {
         synchronized (mGlobalLock) {
             final DisplayContent displayContent = mRoot.getDisplayContent(displayId);
@@ -6045,6 +6056,7 @@
                 pw.println("    d[isplays]: active display contents");
                 pw.println("    t[okens]: token list");
                 pw.println("    w[indows]: window list");
+                pw.println("    trace: write Winscope trace to file");
                 pw.println("  cmd may also be a NAME to dump windows.  NAME may");
                 pw.println("    be a partial substring in a window name, a");
                 pw.println("    Window hex object identifier, or");
@@ -6118,6 +6130,11 @@
                     mRoot.forAllWindows(w -> {pw.println(w);}, true /* traverseTopToBottom */);
                 }
                 return;
+            } else if ("trace".equals(cmd)) {
+                synchronized (mGlobalLock) {
+                    mWindowTracing.writeTraceToFile();
+                }
+                return;
             } else {
                 // Dumping a single name?
                 if (!dumpWindows(pw, cmd, args, opti, dumpAll)) {
@@ -6515,8 +6532,13 @@
 
     /**
      * Update a tap exclude region with a rectangular area in the window identified by the provided
-     * id. Touches on this region will not switch focus to this window. Passing an empty rect will
-     * remove the area from the exclude region of this window.
+     * id. Touches down on this region will not:
+     * <ol>
+     * <li>Switch focus to this window.</li>
+     * <li>Move the display of this window to top.</li>
+     * <li>Send the touch events to this window.</li>
+     * </ol>
+     * Passing an empty rect will remove the area from the exclude region of this window.
      */
     void updateTapExcludeRegion(IWindow client, int regionId, int left, int top, int width,
             int height) {
@@ -6937,6 +6959,16 @@
         }
 
         @Override
+        public void setForcedDisplaySize(int displayId, int width, int height) {
+            WindowManagerService.this.setForcedDisplaySize(displayId, width, height);
+        }
+
+        @Override
+        public void clearForcedDisplaySize(int displayId) {
+            WindowManagerService.this.clearForcedDisplaySize(displayId);
+        }
+
+        @Override
         public void addWindowToken(IBinder token, int type, int displayId) {
             WindowManagerService.this.addWindowToken(token, type, displayId);
         }
diff --git a/services/core/java/com/android/server/wm/WindowManagerShellCommand.java b/services/core/java/com/android/server/wm/WindowManagerShellCommand.java
index 6865ce3..83e3c71 100644
--- a/services/core/java/com/android/server/wm/WindowManagerShellCommand.java
+++ b/services/core/java/com/android/server/wm/WindowManagerShellCommand.java
@@ -72,8 +72,7 @@
                     // XXX this should probably be changed to use openFileForSystem() to create
                     // the output trace file, so the shell gets the correct semantics for where
                     // trace files can be written.
-                    return mInternal.mWindowTracing.onShellCommand(this,
-                            getNextArgRequired());
+                    return mInternal.mWindowTracing.onShellCommand(this);
                 case "set-user-rotation":
                     return runSetDisplayUserRotation(pw);
                 case "set-fix-to-user-rotation":
diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java
index 07f26b4..37e2200 100644
--- a/services/core/java/com/android/server/wm/WindowProcessController.java
+++ b/services/core/java/com/android/server/wm/WindowProcessController.java
@@ -138,6 +138,8 @@
     private volatile boolean mDebugging;
     // Active instrumentation running in process?
     private volatile boolean mInstrumenting;
+    // Active instrumentation with background activity starts privilege running in process?
+    private volatile boolean mInstrumentingWithBackgroundActivityStartPrivileges;
     // This process it perceptible by the user.
     private volatile boolean mPerceptible;
     // Set to true when process was launched with a wrapper attached
@@ -362,14 +364,24 @@
         return mAllowBackgroundActivityStarts;
     }
 
-    public void setInstrumenting(boolean instrumenting) {
+    public void setInstrumenting(boolean instrumenting,
+            boolean hasBackgroundActivityStartPrivileges) {
         mInstrumenting = instrumenting;
+        mInstrumentingWithBackgroundActivityStartPrivileges = hasBackgroundActivityStartPrivileges;
     }
 
     boolean isInstrumenting() {
         return mInstrumenting;
     }
 
+    /**
+     * @return true if the instrumentation was started by a holder of
+     * START_ACTIVITIES_FROM_BACKGROUND permission
+     */
+    boolean isInstrumentingWithBackgroundActivityStartPrivileges() {
+        return mInstrumentingWithBackgroundActivityStartPrivileges;
+    }
+
     public void setPerceptible(boolean perceptible) {
         mPerceptible = perceptible;
     }
@@ -394,13 +406,13 @@
     }
 
     public void addPackage(String packageName) {
-        synchronized (mAtm.mGlobalLock) {
+        synchronized (mAtm.mGlobalLockWithoutBoost) {
             mPkgList.add(packageName);
         }
     }
 
     public void clearPackageList() {
-        synchronized (mAtm.mGlobalLock) {
+        synchronized (mAtm.mGlobalLockWithoutBoost) {
             mPkgList.clear();
         }
     }
@@ -416,20 +428,24 @@
         mActivities.remove(r);
     }
 
-    public void clearActivities() {
-        synchronized (mAtm.mGlobalLock) {
-            mActivities.clear();
+    void makeFinishingForProcessRemoved() {
+        for (int i = mActivities.size() - 1; i >= 0; --i) {
+            mActivities.get(i).makeFinishingLocked();
         }
     }
 
+    void clearActivities() {
+        mActivities.clear();
+    }
+
     public boolean hasActivities() {
-        synchronized (mAtm.mGlobalLock) {
+        synchronized (mAtm.mGlobalLockWithoutBoost) {
             return !mActivities.isEmpty();
         }
     }
 
     public boolean hasVisibleActivities() {
-        synchronized (mAtm.mGlobalLock) {
+        synchronized (mAtm.mGlobalLockWithoutBoost) {
             for (int i = mActivities.size() - 1; i >= 0; --i) {
                 final ActivityRecord r = mActivities.get(i);
                 if (r.visible) {
@@ -441,7 +457,7 @@
     }
 
     public boolean hasActivitiesOrRecentTasks() {
-        synchronized (mAtm.mGlobalLock) {
+        synchronized (mAtm.mGlobalLockWithoutBoost) {
             return !mActivities.isEmpty() || !mRecentTasks.isEmpty();
         }
     }
@@ -456,15 +472,13 @@
         }
     }
 
-    public void finishActivities() {
-        synchronized (mAtm.mGlobalLock) {
-            ArrayList<ActivityRecord> activities = new ArrayList<>(mActivities);
-            for (int i = 0; i < activities.size(); i++) {
-                final ActivityRecord r = activities.get(i);
-                if (!r.finishing && r.isInStackLocked()) {
-                    r.getActivityStack().finishActivityLocked(r, Activity.RESULT_CANCELED,
-                            null, "finish-heavy", true);
-                }
+    void finishActivities() {
+        ArrayList<ActivityRecord> activities = new ArrayList<>(mActivities);
+        for (int i = 0; i < activities.size(); i++) {
+            final ActivityRecord r = activities.get(i);
+            if (!r.finishing && r.isInStackLocked()) {
+                r.getActivityStack().finishActivityLocked(r, Activity.RESULT_CANCELED,
+                        null, "finish-heavy", true);
             }
         }
     }
@@ -525,15 +539,13 @@
     }
 
 
-    public void updateIntentForHeavyWeightActivity(Intent intent) {
-        synchronized (mAtm.mGlobalLock) {
-            if (mActivities.isEmpty()) {
-                return;
-            }
-            ActivityRecord hist = mActivities.get(0);
-            intent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP, hist.packageName);
-            intent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK, hist.getTaskRecord().taskId);
+    void updateIntentForHeavyWeightActivity(Intent intent) {
+        if (mActivities.isEmpty()) {
+            return;
         }
+        ActivityRecord hist = mActivities.get(0);
+        intent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP, hist.packageName);
+        intent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK, hist.getTaskRecord().taskId);
     }
 
     boolean shouldKillProcessForRemovedTask(TaskRecord tr) {
@@ -603,7 +615,7 @@
     }
 
     public int computeOomAdjFromActivities(int minTaskLayer, ComputeOomAdjCallback callback) {
-        synchronized (mAtm.mGlobalLock) {
+        synchronized (mAtm.mGlobalLockWithoutBoost) {
             final int activitiesSize = mActivities.size();
             for (int j = 0; j < activitiesSize; j++) {
                 final ActivityRecord r = mActivities.get(j);
@@ -693,12 +705,8 @@
         mAtm.mH.sendMessage(m);
     }
 
-    void setRemoved(boolean removed) {
-        if (mListener == null) return;
-        // Posting on handler so WM lock isn't held when we call into AM.
-        final Message m = PooledLambda.obtainMessage(
-                WindowProcessListener::setRemoved, mListener, removed);
-        mAtm.mH.sendMessage(m);
+    boolean isRemoved() {
+        return mListener == null ? false : mListener.isRemoved();
     }
 
     void clearWaitingToKill() {
@@ -840,18 +848,16 @@
     }
 
     public boolean hasRecentTasks() {
-        synchronized (mAtm.mGlobalLock) {
+        synchronized (mAtm.mGlobalLockWithoutBoost) {
             return !mRecentTasks.isEmpty();
         }
     }
 
-    public void clearRecentTasks() {
-        synchronized (mAtm.mGlobalLock) {
-            for (int i = mRecentTasks.size() - 1; i >= 0; i--) {
-                mRecentTasks.get(i).clearRootProcess();
-            }
-            mRecentTasks.clear();
+    void clearRecentTasks() {
+        for (int i = mRecentTasks.size() - 1; i >= 0; i--) {
+            mRecentTasks.get(i).clearRootProcess();
         }
+        mRecentTasks.clear();
     }
 
     public void appEarlyNotResponding(String annotation, Runnable killAppCallback) {
@@ -905,19 +911,19 @@
     }
 
     public void onTopProcChanged() {
-        synchronized (mAtm.mGlobalLock) {
+        synchronized (mAtm.mGlobalLockWithoutBoost) {
             mAtm.mVrController.onTopProcChangedLocked(this);
         }
     }
 
     public boolean isHomeProcess() {
-        synchronized (mAtm.mGlobalLock) {
+        synchronized (mAtm.mGlobalLockWithoutBoost) {
             return this == mAtm.mHomeProcess;
         }
     }
 
     public boolean isPreviousProcess() {
-        synchronized (mAtm.mGlobalLock) {
+        synchronized (mAtm.mGlobalLockWithoutBoost) {
             return this == mAtm.mPreviousProcess;
         }
     }
diff --git a/services/core/java/com/android/server/wm/WindowProcessListener.java b/services/core/java/com/android/server/wm/WindowProcessListener.java
index bce5e2d..d732e4e 100644
--- a/services/core/java/com/android/server/wm/WindowProcessListener.java
+++ b/services/core/java/com/android/server/wm/WindowProcessListener.java
@@ -44,8 +44,11 @@
     void updateProcessInfo(boolean updateServiceConnectionActivities, boolean updateLru,
             boolean activityChange, boolean updateOomAdj);
 
-    /** Set process package been removed from device. */
-    void setRemoved(boolean removed);
+    /**
+     * Returns true if the process is removed and we should completely clean up the related records
+     * belonging to this process.
+     */
+    boolean isRemoved();
 
     /** Returns the total time (in milliseconds) spent executing in both user and system code. */
     long getCpuTime();
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 4f12010..05c19b5 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -536,7 +536,7 @@
     private final Point mSurfacePosition = new Point();
 
     /**
-     * A region inside of this window to be excluded from touch-related focus switches.
+     * A region inside of this window to be excluded from touch.
      */
     private TapExcludeRegionHolder mTapExcludeRegionHolder;
 
@@ -747,8 +747,8 @@
     }
 
     @Override
-    void onParentSet() {
-        super.onParentSet();
+    void onParentChanged() {
+        super.onParentChanged();
         setDrawnStateEvaluated(false /*evaluated*/);
 
         getDisplayContent().reapplyMagnificationSpec();
@@ -2168,6 +2168,24 @@
             }
             region.set(mTmpRect);
             cropRegionToStackBoundsIfNeeded(region);
+            subtractTouchExcludeRegionIfNeeded(region);
+        } else if (modal && mTapExcludeRegionHolder != null) {
+            final Region touchExcludeRegion = Region.obtain();
+            amendTapExcludeRegion(touchExcludeRegion);
+            if (!touchExcludeRegion.isEmpty()) {
+                // Remove touch modal because there are some areas that cannot be touched.
+                flags |= FLAG_NOT_TOUCH_MODAL;
+                // Give it a large touchable region at first because it was touch modal. The window
+                // might be moved on the display, so the touchable region should be large enough to
+                // ensure it covers the whole display, no matter where it is moved.
+                getDisplayContent().getBounds(mTmpRect);
+                final int dw = mTmpRect.width();
+                final int dh = mTmpRect.height();
+                region.set(-dw, -dh, dw + dw, dh + dh);
+                // Subtract the area that cannot be touched.
+                region.op(touchExcludeRegion, Region.Op.DIFFERENCE);
+            }
+            touchExcludeRegion.recycle();
         } else {
             // Not modal or full screen modal
             getTouchableRegion(region);
@@ -2837,6 +2855,7 @@
             }
         }
         cropRegionToStackBoundsIfNeeded(outRegion);
+        subtractTouchExcludeRegionIfNeeded(outRegion);
     }
 
     private void cropRegionToStackBoundsIfNeeded(Region region) {
@@ -2855,6 +2874,22 @@
     }
 
     /**
+     * If this window has areas that cannot be touched, we subtract those areas from its touchable
+     * region.
+     */
+    private void subtractTouchExcludeRegionIfNeeded(Region touchableRegion) {
+        if (mTapExcludeRegionHolder == null) {
+            return;
+        }
+        final Region touchExcludeRegion = Region.obtain();
+        amendTapExcludeRegion(touchExcludeRegion);
+        if (!touchExcludeRegion.isEmpty()) {
+            touchableRegion.op(touchExcludeRegion, Region.Op.DIFFERENCE);
+        }
+        touchExcludeRegion.recycle();
+    }
+
+    /**
      * Report a focus change.  Must be called with no locks held, and consistently
      * from the same serialized thread (such as dispatched from a handler).
      */
@@ -4728,11 +4763,25 @@
         mTapExcludeRegionHolder.updateRegion(regionId, left, top, width, height);
         // Trigger touch exclude region update on current display.
         currentDisplay.updateTouchExcludeRegion();
+        // Trigger touchable region update for this window.
+        currentDisplay.getInputMonitor().updateInputWindowsLw(true /* force */);
     }
 
-    /** Union the region with current tap exclude region that this window provides. */
+    /**
+     * Union the region with current tap exclude region that this window provides.
+     *
+     * @param region The region to be amended. It is on the screen coordinates.
+     */
     void amendTapExcludeRegion(Region region) {
-        mTapExcludeRegionHolder.amendRegion(region, getBounds());
+        final Region tempRegion = Region.obtain();
+        mTmpRect.set(mWindowFrames.mFrame);
+        mTmpRect.offsetTo(0, 0);
+        mTapExcludeRegionHolder.amendRegion(tempRegion, mTmpRect);
+        // The region held by the holder is on the window coordinates. We need to translate it to
+        // the screen coordinates.
+        tempRegion.translate(mWindowFrames.mFrame.left, mWindowFrames.mFrame.top);
+        region.op(tempRegion, Region.Op.UNION);
+        tempRegion.recycle();
     }
 
     @Override
diff --git a/services/core/java/com/android/server/wm/WindowTraceBuffer.java b/services/core/java/com/android/server/wm/WindowTraceBuffer.java
index 936ee85..2f672f2 100644
--- a/services/core/java/com/android/server/wm/WindowTraceBuffer.java
+++ b/services/core/java/com/android/server/wm/WindowTraceBuffer.java
@@ -23,12 +23,15 @@
 import android.os.Trace;
 import android.util.proto.ProtoOutputStream;
 
+import com.android.internal.annotations.VisibleForTesting;
+
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
+import java.util.ArrayDeque;
+import java.util.Arrays;
+import java.util.Queue;
 
 /**
  * Buffer used for window tracing.
@@ -36,16 +39,15 @@
 abstract class WindowTraceBuffer {
     private static final long MAGIC_NUMBER_VALUE = ((long) MAGIC_NUMBER_H << 32) | MAGIC_NUMBER_L;
 
-    final Object mBufferSizeLock = new Object();
-    final BlockingQueue<byte[]> mBuffer;
+    final Object mBufferLock = new Object();
+    final Queue<byte[]> mBuffer = new ArrayDeque<>();
+    final File mTraceFile;
     int mBufferSize;
     private final int mBufferCapacity;
-    private final File mTraceFile;
 
     WindowTraceBuffer(int size, File traceFile) throws IOException {
         mBufferCapacity = size;
         mTraceFile = traceFile;
-        mBuffer = new LinkedBlockingQueue<>();
 
         initTraceFile();
     }
@@ -57,65 +59,45 @@
     /**
      * Inserts the specified element into this buffer.
      *
-     * This method is synchronized with {@code #take()} and {@code #clear()}
-     * for consistency.
-     *
      * @param proto the element to add
-     * @return {@code true} if the inserted item was inserted into the buffer
      * @throws IllegalStateException if the element cannot be added because it is larger
      *                               than the buffer size.
      */
-    boolean add(ProtoOutputStream proto) throws InterruptedException {
+    void add(ProtoOutputStream proto) {
         byte[] protoBytes = proto.getBytes();
         int protoLength = protoBytes.length;
         if (protoLength > mBufferCapacity) {
             throw new IllegalStateException("Trace object too large for the buffer. Buffer size:"
                     + mBufferCapacity + " Object size: " + protoLength);
         }
-        synchronized (mBufferSizeLock) {
-            boolean canAdd = canAdd(protoBytes);
+        synchronized (mBufferLock) {
+            boolean canAdd = canAdd(protoLength);
             if (canAdd) {
                 mBuffer.offer(protoBytes);
                 mBufferSize += protoLength;
             }
-            return canAdd;
+            mBufferLock.notify();
         }
     }
 
-    void writeNextBufferElementToFile() throws IOException {
-        byte[] proto;
+    /**
+     * Stops the buffer execution and flush all buffer content to the disk.
+     *
+     * @throws IOException if the buffer cannot write its contents to the {@link #mTraceFile}
+     */
+    void dump() throws IOException, InterruptedException {
         try {
-            proto = take();
-        } catch (InterruptedException e) {
-            Thread.currentThread().interrupt();
-            return;
-        }
-
-        try {
-            Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "writeToFile");
-            try (OutputStream os = new FileOutputStream(mTraceFile, true)) {
-                os.write(proto);
-            }
+            Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "writeTraceToFile");
+            writeTraceToFile();
         } finally {
             Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
         }
     }
 
-    /**
-     * Retrieves and removes the head of this queue, waiting if necessary
-     * until an element becomes available.
-     *
-     * This method is synchronized with {@code #add(ProtoOutputStream)} and {@code #clear()}
-     * for consistency.
-     *
-     * @return the head of this buffer, or {@code null} if this buffer is empty
-     */
-    private byte[] take() throws InterruptedException {
-        byte[] item = mBuffer.take();
-        synchronized (mBufferSizeLock) {
-            mBufferSize -= item.length;
-            return item;
-        }
+    @VisibleForTesting
+    boolean contains(byte[] other) {
+        return mBuffer.stream()
+                .anyMatch(p -> Arrays.equals(p, other));
     }
 
     private void initTraceFile() throws IOException {
@@ -132,25 +114,31 @@
      * Checks if the element can be added to the buffer. The element is already certain to be
      * smaller than the overall buffer size.
      *
-     * @param protoBytes byte array representation of the Proto object to add
-     * @return <tt>true<</tt> if the element can be added to the buffer or not
+     * @param protoLength byte array representation of the Proto object to add
+     * @return {@code true} if the element can be added to the buffer or not
      */
-    abstract boolean canAdd(byte[] protoBytes) throws InterruptedException;
+    abstract boolean canAdd(int protoLength);
 
     /**
      * Flush all buffer content to the disk.
      *
      * @throws IOException if the buffer cannot write its contents to the {@link #mTraceFile}
      */
-    abstract void writeToDisk() throws IOException, InterruptedException;
+    abstract void writeTraceToFile() throws IOException, InterruptedException;
 
     /**
-     * Builder for a {@code WindowTraceBuffer} which creates a {@link WindowTraceQueueBuffer}
+     * Builder for a {@code WindowTraceBuffer} which creates a {@link WindowTraceRingBuffer} for
+     * continuous mode or a {@link WindowTraceQueueBuffer} otherwise
      */
     static class Builder {
+        private boolean mContinuous;
         private File mTraceFile;
         private int mBufferCapacity;
 
+        Builder setContinuousMode(boolean continuous) {
+            mContinuous = continuous;
+            return this;
+        }
 
         Builder setTraceFile(File traceFile) {
             mTraceFile = traceFile;
@@ -175,7 +163,11 @@
                 throw new IllegalArgumentException("A valid trace file must be specified.");
             }
 
-            return new WindowTraceQueueBuffer(mBufferCapacity, mTraceFile);
+            if (mContinuous) {
+                return new WindowTraceRingBuffer(mBufferCapacity, mTraceFile);
+            } else {
+                return new WindowTraceQueueBuffer(mBufferCapacity, mTraceFile);
+            }
         }
     }
 }
diff --git a/services/core/java/com/android/server/wm/WindowTraceQueueBuffer.java b/services/core/java/com/android/server/wm/WindowTraceQueueBuffer.java
index b7fc7ac..eaedde9 100644
--- a/services/core/java/com/android/server/wm/WindowTraceQueueBuffer.java
+++ b/services/core/java/com/android/server/wm/WindowTraceQueueBuffer.java
@@ -18,10 +18,14 @@
 
 import static android.os.Build.IS_USER;
 
+import android.util.Log;
+
 import com.android.internal.annotations.VisibleForTesting;
 
 import java.io.File;
+import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.OutputStream;
 
 /**
  * A buffer structure backed by a {@link java.util.concurrent.BlockingQueue} to store the first
@@ -29,14 +33,17 @@
  * Once the buffer is full it will no longer accepts new elements.
  */
 class WindowTraceQueueBuffer extends WindowTraceBuffer {
-    private Thread mWriterThread;
+    private static final String TAG = "WindowTracing";
+
+    private Thread mConsumerThread;
     private boolean mCancel;
 
     @VisibleForTesting
-    WindowTraceQueueBuffer(int size, File traceFile, boolean startWriterThread) throws IOException {
+    WindowTraceQueueBuffer(int size, File traceFile, boolean startConsumerThread)
+            throws IOException {
         super(size, traceFile);
-        if (startWriterThread) {
-            initializeWriterThread();
+        if (startConsumerThread) {
+            initializeConsumerThread();
         }
     }
 
@@ -44,45 +51,56 @@
         this(size, traceFile, !IS_USER);
     }
 
-    private void initializeWriterThread() {
+    private void initializeConsumerThread() {
         mCancel = false;
-        mWriterThread = new Thread(() -> {
+        mConsumerThread = new Thread(() -> {
             try {
                 loop();
+            } catch (InterruptedException e) {
+                Log.i(TAG, "Interrupting trace consumer thread");
             } catch (IOException e) {
-                throw new IllegalStateException("Failed to execute trace write loop thread", e);
+                Log.e(TAG, "Failed to execute trace consumer thread", e);
             }
         }, "window_tracing");
-        mWriterThread.start();
+        mConsumerThread.start();
     }
 
-    private void loop() throws IOException {
+    private void loop() throws IOException, InterruptedException {
         while (!mCancel) {
-            writeNextBufferElementToFile();
-        }
-    }
+            byte[] proto;
+            synchronized (mBufferLock) {
+                mBufferLock.wait();
 
-    private void restartWriterThread() throws InterruptedException {
-        if (mWriterThread != null) {
-            mCancel = true;
-            mWriterThread.interrupt();
-            mWriterThread.join();
-            initializeWriterThread();
+                proto = mBuffer.poll();
+                if (proto != null) {
+                    mBufferSize -= proto.length;
+                }
+            }
+
+            if (proto != null) {
+                try (OutputStream os = new FileOutputStream(mTraceFile, true)) {
+                    os.write(proto);
+                }
+            }
         }
     }
 
     @Override
-    boolean canAdd(byte[] protoBytes) {
+    boolean canAdd(int protoLength) {
         long availableSpace = getAvailableSpace();
-        return availableSpace >= protoBytes.length;
+        return availableSpace >= protoLength;
     }
 
     @Override
-    void writeToDisk() throws InterruptedException {
-        while (!mBuffer.isEmpty()) {
-            mBufferSizeLock.wait();
-            mBufferSizeLock.notify();
+    void writeTraceToFile() throws InterruptedException {
+        synchronized (mBufferLock) {
+            mCancel = true;
+            mBufferLock.notify();
         }
-        restartWriterThread();
+
+        if (mConsumerThread != null) {
+            mConsumerThread.join();
+            mConsumerThread = null;
+        }
     }
 }
diff --git a/services/core/java/com/android/server/wm/WindowTraceRingBuffer.java b/services/core/java/com/android/server/wm/WindowTraceRingBuffer.java
new file mode 100644
index 0000000..7c69f23
--- /dev/null
+++ b/services/core/java/com/android/server/wm/WindowTraceRingBuffer.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.wm;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * A ring buffer to store the {@code #size size} bytes of window trace data.
+ * The buffer operates on a trace entry level, that is, if the new trace data is larger than the
+ * available buffer space, the buffer will discard as many full trace entries as necessary to fit
+ * the new trace.
+ */
+class WindowTraceRingBuffer extends WindowTraceBuffer {
+    WindowTraceRingBuffer(int size, File traceFile) throws IOException {
+        super(size, traceFile);
+    }
+
+    @Override
+    boolean canAdd(int protoLength) {
+        long availableSpace = getAvailableSpace();
+
+        while (availableSpace < protoLength) {
+            discardOldest();
+            availableSpace = getAvailableSpace();
+        }
+
+        return true;
+    }
+
+    @Override
+    void writeTraceToFile() throws IOException {
+        synchronized (mBufferLock) {
+            try (OutputStream os = new FileOutputStream(mTraceFile, true)) {
+                while (!mBuffer.isEmpty()) {
+                    byte[] proto;
+                    proto = mBuffer.poll();
+                    mBufferSize -= proto.length;
+                    os.write(proto);
+                }
+            }
+        }
+    }
+
+    private void discardOldest() {
+        byte[] item = mBuffer.poll();
+        if (item == null) {
+            throw new IllegalStateException("No element to discard from buffer");
+        }
+        mBufferSize -= item.length;
+    }
+}
diff --git a/services/core/java/com/android/server/wm/WindowTracing.java b/services/core/java/com/android/server/wm/WindowTracing.java
index 63539c4..4c9a917 100644
--- a/services/core/java/com/android/server/wm/WindowTracing.java
+++ b/services/core/java/com/android/server/wm/WindowTracing.java
@@ -53,6 +53,7 @@
 
     private WindowTraceBuffer mTraceBuffer;
 
+    private boolean mContinuousMode;
     private boolean mEnabled;
     private volatile boolean mEnabledLockFree;
 
@@ -70,13 +71,11 @@
         synchronized (mLock) {
             logAndPrintln(pw, "Start tracing to " + mBufferBuilder.getFile() + ".");
             if (mTraceBuffer != null) {
-                try {
-                    mTraceBuffer.writeToDisk();
-                } catch (InterruptedException e) {
-                    logAndPrintln(pw, "Error: Unable to flush the previous buffer.");
-                }
+                writeTraceToFileLocked();
             }
-            mTraceBuffer = mBufferBuilder.build();
+            mTraceBuffer = mBufferBuilder
+                    .setContinuousMode(mContinuousMode)
+                    .build();
             mEnabled = mEnabledLockFree = true;
         }
     }
@@ -104,29 +103,29 @@
                     logAndPrintln(pw, "ERROR: tracing was re-enabled while waiting for flush.");
                     throw new IllegalStateException("tracing enabled while waiting for flush.");
                 }
-                try {
-                    mTraceBuffer.writeToDisk();
-                } catch (IOException e) {
-                    Log.e(TAG, "Unable to write buffer to file", e);
-                } catch (InterruptedException e) {
-                    Log.e(TAG, "Unable to interrupt window tracing file write thread", e);
-                }
+                writeTraceToFileLocked();
+                mTraceBuffer = null;
             }
             logAndPrintln(pw, "Trace written to " + mBufferBuilder.getFile() + ".");
         }
     }
 
+    private void setContinuousMode(boolean continuous, PrintWriter pw) {
+        logAndPrintln(pw, "Setting window tracing continuous mode to " + continuous);
+
+        if (mEnabled) {
+            logAndPrintln(pw, "Trace is currently active, change will take effect once the "
+                    + "trace is restarted.");
+        }
+        mContinuousMode = continuous;
+    }
+
     private void appendTraceEntry(ProtoOutputStream proto) {
         if (!mEnabledLockFree) {
             return;
         }
 
-        try {
-            mTraceBuffer.add(proto);
-        } catch (InterruptedException e) {
-            Log.e(TAG, "Unable to add element to trace", e);
-            Thread.currentThread().interrupt();
-        }
+        mTraceBuffer.add(proto);
     }
 
     boolean isEnabled() {
@@ -138,9 +137,10 @@
         return new WindowTracing(file);
     }
 
-    int onShellCommand(ShellCommand shell, String cmd) {
+    int onShellCommand(ShellCommand shell) {
         PrintWriter pw = shell.getOutPrintWriter();
         try {
+            String cmd = shell.getNextArgRequired();
             switch (cmd) {
                 case "start":
                     startTrace(pw);
@@ -148,6 +148,9 @@
                 case "stop":
                     stopTrace(pw);
                     return 0;
+                case "continuous":
+                    setContinuousMode(Boolean.valueOf(shell.getNextArgRequired()), pw);
+                    return 0;
                 default:
                     pw.println("Unknown command: " + cmd);
                     return -1;
@@ -162,6 +165,7 @@
         if (!isEnabled()) {
             return;
         }
+
         ProtoOutputStream os = new ProtoOutputStream();
         long tokenOuter = os.start(ENTRY);
         os.write(ELAPSED_REALTIME_NANOS, SystemClock.elapsedRealtimeNanos());
@@ -179,4 +183,33 @@
         appendTraceEntry(os);
         Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
     }
+
+    /**
+     * Writes the trace buffer to disk. This method has no internal synchronization and should be
+     * externally synchronized
+     */
+    private void writeTraceToFileLocked() {
+        if (mTraceBuffer == null) {
+            return;
+        }
+
+        try {
+            mTraceBuffer.dump();
+        } catch (IOException e) {
+            Log.e(TAG, "Unable to write buffer to file", e);
+        } catch (InterruptedException e) {
+            Log.e(TAG, "Unable to interrupt window tracing file write thread", e);
+        }
+    }
+
+    /**
+     * Writes the trace buffer to disk and clones it into a new file for the bugreport.
+     * This method is synchronized with {@code #startTrace(PrintWriter)} and
+     * {@link #stopTrace(PrintWriter)}.
+     */
+    void writeTraceToFile() {
+        synchronized (mLock) {
+            writeTraceToFileLocked();
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/wm/utils/WmDisplayCutout.java b/services/core/java/com/android/server/wm/utils/WmDisplayCutout.java
index ea3f758..98bad93 100644
--- a/services/core/java/com/android/server/wm/utils/WmDisplayCutout.java
+++ b/services/core/java/com/android/server/wm/utils/WmDisplayCutout.java
@@ -170,4 +170,9 @@
     public int hashCode() {
         return Objects.hash(mInner, mFrameSize);
     }
+
+    @Override
+    public String toString() {
+        return "WmDisplayCutout{" + mInner + ", mFrameSize=" + mFrameSize + '}';
+    }
 }
diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp
index ff0b0d6..33317b5 100644
--- a/services/core/jni/com_android_server_input_InputManagerService.cpp
+++ b/services/core/jni/com_android_server_input_InputManagerService.cpp
@@ -1652,6 +1652,13 @@
     im->setCustomPointerIcon(spriteIcon);
 }
 
+static jboolean nativeCanDispatchToDisplay(JNIEnv* env, jclass /* clazz */, jlong ptr,
+        jint deviceId, jint displayId) {
+
+    NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
+    return im->getInputManager()->getReader()->canDispatchToDisplay(deviceId, displayId);
+}
+
 // ----------------------------------------------------------------------------
 
 static const JNINativeMethod gInputManagerMethods[] = {
@@ -1726,6 +1733,8 @@
             (void*) nativeReloadPointerIcons },
     { "nativeSetCustomPointerIcon", "(JLandroid/view/PointerIcon;)V",
             (void*) nativeSetCustomPointerIcon },
+    { "nativeCanDispatchToDisplay", "(JII)Z",
+            (void*) nativeCanDispatchToDisplay },
 };
 
 #define FIND_CLASS(var, className) \
diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
index f3c19d0..cbc3791 100644
--- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
+++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
@@ -73,6 +73,8 @@
 static jmethodID method_correctionsGetLatitudeDegrees;
 static jmethodID method_correctionsGetLongitudeDegrees;
 static jmethodID method_correctionsGetAltitudeMeters;
+static jmethodID method_correctionsGetHorPosUncMeters;
+static jmethodID method_correctionsGetVerPosUncMeters;
 static jmethodID method_correctionsGetToaGpsNanosecondsOfWeek;
 static jmethodID method_correctionsGetSingleSatCorrectionList;
 static jmethodID method_listSize;
@@ -2233,6 +2235,12 @@
         method_correctionsGetAltitudeMeters = env->GetMethodID(
             measCorrClass, "getAltitudeMeters", "()D");
 
+        method_correctionsGetHorPosUncMeters = env->GetMethodID(
+            measCorrClass, "getHorizontalPositionUncertaintyMeters", "()D");
+
+        method_correctionsGetVerPosUncMeters = env->GetMethodID(
+            measCorrClass, "getVerticalPositionUncertaintyMeters", "()D");
+
         method_correctionsGetToaGpsNanosecondsOfWeek = env->GetMethodID(
             measCorrClass, "getToaGpsNanosecondsOfWeek", "()J");
 
@@ -2246,6 +2254,10 @@
         correctionsObj, method_correctionsGetLongitudeDegrees);
     jdouble altitudeDegreesCorr = env->CallDoubleMethod(
         correctionsObj, method_correctionsGetAltitudeMeters);
+    jdouble horizontalPositionUncertaintyMeters = env->CallDoubleMethod(
+        correctionsObj, method_correctionsGetHorPosUncMeters);
+    jdouble verticalPositionUncertaintyMeters = env->CallDoubleMethod(
+            correctionsObj, method_correctionsGetVerPosUncMeters);
     jlong toaGpsNanosOfWeek = env->CallLongMethod(
         correctionsObj, method_correctionsGetToaGpsNanosecondsOfWeek);
     jobject singleSatCorrectionList = env->CallObjectMethod(correctionsObj,
@@ -2348,6 +2360,8 @@
         .latitudeDegrees = latitudeDegreesCorr,
         .longitudeDegrees = longitudeDegreesCorr,
         .altitudeMeters = altitudeDegreesCorr,
+        .horizontalPositionUncertaintyMeters = horizontalPositionUncertaintyMeters,
+        .verticalPositionUncertaintyMeters = verticalPositionUncertaintyMeters,
         .toaGpsNanosecondsOfWeek = static_cast<uint64_t>(toaGpsNanosOfWeek),
         .satCorrections = list,
     };
diff --git a/services/core/jni/com_android_server_security_VerityUtils.cpp b/services/core/jni/com_android_server_security_VerityUtils.cpp
index 7dd30bd..988d75c 100644
--- a/services/core/jni/com_android_server_security_VerityUtils.cpp
+++ b/services/core/jni/com_android_server_security_VerityUtils.cpp
@@ -29,14 +29,69 @@
 
 #include <android-base/unique_fd.h>
 
-// TODO(112037636): Always include once fsverity.h is upstreamed and backported.
-#define HAS_FSVERITY 0
-
-#if HAS_FSVERITY
+// TODO(112037636): Always include once fsverity.h is upstreamed.
+#if __has_include(<linux/fsverity.h>)
 #include <linux/fsverity.h>
+#else
+
+// Before fs-verity is upstreamed, use the current snapshot for development.
+// https://git.kernel.org/pub/scm/linux/kernel/git/ebiggers/linux.git/tree/include/uapi/linux/fsverity.h?h=fsverity
+
+#include <linux/limits.h>
+#include <linux/ioctl.h>
+#include <linux/types.h>
+
+struct fsverity_digest {
+    __u16 digest_algorithm;
+    __u16 digest_size; /* input/output */
+    __u8 digest[];
+};
+
+#define FS_IOC_ENABLE_VERITY	_IO('f', 133)
+#define FS_IOC_MEASURE_VERITY	_IOWR('f', 134, struct fsverity_digest)
+
+#define FS_VERITY_MAGIC		"FSVerity"
+
+#define FS_VERITY_ALG_SHA256	1
+
+struct fsverity_descriptor {
+    __u8 magic[8];		/* must be FS_VERITY_MAGIC */
+    __u8 major_version;	/* must be 1 */
+    __u8 minor_version;	/* must be 0 */
+    __u8 log_data_blocksize;/* log2(data-bytes-per-hash), e.g. 12 for 4KB */
+    __u8 log_tree_blocksize;/* log2(tree-bytes-per-hash), e.g. 12 for 4KB */
+    __le16 data_algorithm;	/* hash algorithm for data blocks */
+    __le16 tree_algorithm;	/* hash algorithm for tree blocks */
+    __le32 flags;		/* flags */
+    __le32 __reserved1;	/* must be 0 */
+    __le64 orig_file_size;	/* size of the original file data */
+    __le16 auth_ext_count;	/* number of authenticated extensions */
+    __u8 __reserved2[30];	/* must be 0 */
+};
+
+#define FS_VERITY_EXT_ROOT_HASH		1
+#define FS_VERITY_EXT_PKCS7_SIGNATURE	3
+
+struct fsverity_extension {
+    __le32 length;
+    __le16 type;		/* Type of this extension (see codes above) */
+    __le16 __reserved;	/* Reserved, must be 0 */
+};
+
+struct fsverity_digest_disk {
+    __le16 digest_algorithm;
+    __le16 digest_size;
+    __u8 digest[];
+};
+
+struct fsverity_footer {
+    __le32 desc_reverse_offset;	/* distance to fsverity_descriptor */
+    __u8 magic[8];			/* FS_VERITY_MAGIC */
+} __packed;
+
+#endif
 
 const int kSha256Bytes = 32;
-#endif
 
 namespace android {
 
@@ -76,7 +131,6 @@
 };
 
 int enableFsverity(JNIEnv* env, jobject /* clazz */, jstring filePath) {
-#if HAS_FSVERITY
     const char* path = env->GetStringUTFChars(filePath, nullptr);
     ::android::base::unique_fd rfd(open(path, O_RDONLY | O_CLOEXEC));
     if (rfd.get() < 0) {
@@ -86,14 +140,9 @@
       return errno;
     }
     return 0;
-#else
-    LOG_ALWAYS_FATAL("fs-verity is used while not enabled");
-    return ENOSYS;
-#endif  // HAS_FSVERITY
 }
 
 int measureFsverity(JNIEnv* env, jobject /* clazz */, jstring filePath) {
-#if HAS_FSVERITY
     auto raii = JavaByteArrayHolder::newArray(env, sizeof(fsverity_digest) + kSha256Bytes);
     fsverity_digest* data = reinterpret_cast<fsverity_digest*>(raii->getRaw());
     data->digest_size = kSha256Bytes;  // the only input/output parameter
@@ -107,14 +156,9 @@
       return errno;
     }
     return 0;
-#else
-    LOG_ALWAYS_FATAL("fs-verity is used while not enabled");
-    return ENOSYS;
-#endif  // HAS_FSVERITY
 }
 
 jbyteArray constructFsveritySignedData(JNIEnv* env, jobject /* clazz */, jbyteArray digest) {
-#if HAS_FSVERITY
     auto raii = JavaByteArrayHolder::newArray(env, sizeof(fsverity_digest_disk) + kSha256Bytes);
     fsverity_digest_disk* data = reinterpret_cast<fsverity_digest_disk*>(raii->getRaw());
 
@@ -129,15 +173,10 @@
     memcpy(data->digest, src, kSha256Bytes);
 
     return raii->release();
-#else
-    LOG_ALWAYS_FATAL("fs-verity is used while not enabled");
-    return 0;
-#endif  // HAS_FSVERITY
 }
 
 
 jbyteArray constructFsverityDescriptor(JNIEnv* env, jobject /* clazz */, jlong fileSize) {
-#if HAS_FSVERITY
     auto raii = JavaByteArrayHolder::newArray(env, sizeof(fsverity_descriptor));
     fsverity_descriptor* desc = reinterpret_cast<fsverity_descriptor*>(raii->getRaw());
 
@@ -153,15 +192,10 @@
     desc->auth_ext_count = 1;
 
     return raii->release();
-#else
-    LOG_ALWAYS_FATAL("fs-verity is used while not enabled");
-    return 0;
-#endif  // HAS_FSVERITY
 }
 
 jbyteArray constructFsverityExtension(JNIEnv* env, jobject /* clazz */, jshort extensionId,
         jint extensionDataSize) {
-#if HAS_FSVERITY
     auto raii = JavaByteArrayHolder::newArray(env, sizeof(fsverity_extension));
     fsverity_extension* ext = reinterpret_cast<fsverity_extension*>(raii->getRaw());
 
@@ -169,15 +203,10 @@
     ext->type = extensionId;
 
     return raii->release();
-#else
-    LOG_ALWAYS_FATAL("fs-verity is used while not enabled");
-    return 0;
-#endif  // HAS_FSVERITY
 }
 
 jbyteArray constructFsverityFooter(JNIEnv* env, jobject /* clazz */,
         jint offsetToDescriptorHead) {
-#if HAS_FSVERITY
     auto raii = JavaByteArrayHolder::newArray(env, sizeof(fsverity_footer));
     fsverity_footer* footer = reinterpret_cast<fsverity_footer*>(raii->getRaw());
 
@@ -185,10 +214,6 @@
     memcpy(footer->magic, FS_VERITY_MAGIC, sizeof(footer->magic));
 
     return raii->release();
-#else
-    LOG_ALWAYS_FATAL("fs-verity is used while not enabled");
-    return 0;
-#endif  // HAS_FSVERITY
 }
 
 const JNINativeMethod sMethods[] = {
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index f79f9bc..8f5ce74 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -74,20 +74,14 @@
 import static android.content.pm.PackageManager.MATCH_UNINSTALLED_PACKAGES;
 import static android.provider.Settings.Global.PRIVATE_DNS_MODE;
 import static android.provider.Settings.Global.PRIVATE_DNS_SPECIFIER;
-
 import static android.provider.Telephony.Carriers.DPC_URI;
 import static android.provider.Telephony.Carriers.ENFORCE_KEY;
 import static android.provider.Telephony.Carriers.ENFORCE_MANAGED_URI;
 
-import static com.android.internal.logging.nano.MetricsProto.MetricsEvent
-        .PROVISIONING_ENTRY_POINT_ADB;
-import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker
-        .STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW;
-
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.PROVISIONING_ENTRY_POINT_ADB;
+import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW;
 import static com.android.server.devicepolicy.TransferOwnershipMetadataManager.ADMIN_TYPE_DEVICE_OWNER;
 import static com.android.server.devicepolicy.TransferOwnershipMetadataManager.ADMIN_TYPE_PROFILE_OWNER;
-
-
 import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
 
 import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT;
@@ -240,11 +234,11 @@
 import com.android.internal.util.FunctionalUtils.ThrowingRunnable;
 import com.android.internal.util.JournaledFile;
 import com.android.internal.util.Preconditions;
+import com.android.internal.util.StatLogger;
 import com.android.internal.util.XmlUtils;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.server.LocalServices;
 import com.android.server.LockGuard;
-import com.android.internal.util.StatLogger;
 import com.android.server.SystemServerInitThreadPool;
 import com.android.server.SystemService;
 import com.android.server.devicepolicy.DevicePolicyManagerService.ActiveAdmin.TrustAgentInfo;
@@ -1925,7 +1919,11 @@
         }
 
         AlarmManager getAlarmManager() {
-            return (AlarmManager) mContext.getSystemService(AlarmManager.class);
+            return mContext.getSystemService(AlarmManager.class);
+        }
+
+        ConnectivityManager getConnectivityManager() {
+            return mContext.getSystemService(ConnectivityManager.class);
         }
 
         IWindowManager getIWindowManager() {
@@ -6308,7 +6306,8 @@
      * @throws UnsupportedOperationException if the package does not support being set as always-on.
      */
     @Override
-    public boolean setAlwaysOnVpnPackage(ComponentName admin, String vpnPackage, boolean lockdown)
+    public boolean setAlwaysOnVpnPackage(ComponentName admin, String vpnPackage, boolean lockdown,
+            List<String> lockdownWhitelist)
             throws SecurityException {
         enforceProfileOrDeviceOwner(admin);
 
@@ -6316,11 +6315,23 @@
         final long token = mInjector.binderClearCallingIdentity();
         try {
             if (vpnPackage != null && !isPackageInstalledForUser(vpnPackage, userId)) {
-                return false;
+                Slog.w(LOG_TAG, "Non-existent VPN package specified: " + vpnPackage);
+                throw new ServiceSpecificException(
+                        DevicePolicyManager.ERROR_VPN_PACKAGE_NOT_FOUND, vpnPackage);
             }
-            ConnectivityManager connectivityManager = (ConnectivityManager)
-                    mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
-            if (!connectivityManager.setAlwaysOnVpnPackageForUser(userId, vpnPackage, lockdown)) {
+
+            if (vpnPackage != null && lockdown && lockdownWhitelist != null) {
+                for (String packageName : lockdownWhitelist) {
+                    if (!isPackageInstalledForUser(packageName, userId)) {
+                        Slog.w(LOG_TAG, "Non-existent package in VPN whitelist: " + packageName);
+                        throw new ServiceSpecificException(
+                                DevicePolicyManager.ERROR_VPN_PACKAGE_NOT_FOUND, packageName);
+                    }
+                }
+            }
+            // If some package is uninstalled after the check above, it will be ignored by CM.
+            if (!mInjector.getConnectivityManager().setAlwaysOnVpnPackageForUser(
+                    userId, vpnPackage, lockdown, lockdownWhitelist)) {
                 throw new UnsupportedOperationException();
             }
             DevicePolicyEventLogger
@@ -6337,16 +6348,40 @@
     }
 
     @Override
-    public String getAlwaysOnVpnPackage(ComponentName admin)
+    public String getAlwaysOnVpnPackage(ComponentName admin) throws SecurityException {
+        enforceProfileOrDeviceOwner(admin);
+
+        final int userId = mInjector.userHandleGetCallingUserId();
+        final long token = mInjector.binderClearCallingIdentity();
+        try {
+            return mInjector.getConnectivityManager().getAlwaysOnVpnPackageForUser(userId);
+        } finally {
+            mInjector.binderRestoreCallingIdentity(token);
+        }
+    }
+
+    @Override
+    public boolean isAlwaysOnVpnLockdownEnabled(ComponentName admin) throws SecurityException {
+        enforceProfileOrDeviceOwner(admin);
+
+        final int userId = mInjector.userHandleGetCallingUserId();
+        final long token = mInjector.binderClearCallingIdentity();
+        try {
+            return mInjector.getConnectivityManager().isVpnLockdownEnabled(userId);
+        } finally {
+            mInjector.binderRestoreCallingIdentity(token);
+        }
+    }
+
+    @Override
+    public List<String> getAlwaysOnVpnLockdownWhitelist(ComponentName admin)
             throws SecurityException {
         enforceProfileOrDeviceOwner(admin);
 
         final int userId = mInjector.userHandleGetCallingUserId();
         final long token = mInjector.binderClearCallingIdentity();
-        try{
-            ConnectivityManager connectivityManager = (ConnectivityManager)
-                    mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
-            return connectivityManager.getAlwaysOnVpnPackageForUser(userId);
+        try {
+            return mInjector.getConnectivityManager().getVpnLockdownWhitelist(userId);
         } finally {
             mInjector.binderRestoreCallingIdentity(token);
         }
@@ -6819,9 +6854,7 @@
         enforceDeviceOwner(who);
         long token = mInjector.binderClearCallingIdentity();
         try {
-            ConnectivityManager connectivityManager = (ConnectivityManager)
-                    mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
-            connectivityManager.setGlobalProxy(proxyInfo);
+            mInjector.getConnectivityManager().setGlobalProxy(proxyInfo);
         } finally {
             mInjector.binderRestoreCallingIdentity(token);
         }
@@ -7677,18 +7710,7 @@
             }
 
             // Shutting down backup manager service permanently.
-            long ident = mInjector.binderClearCallingIdentity();
-            try {
-                if (mInjector.getIBackupManager() != null) {
-                    mInjector.getIBackupManager()
-                            .setBackupServiceActive(UserHandle.USER_SYSTEM, false);
-                }
-            } catch (RemoteException e) {
-                throw new IllegalStateException("Failed deactivating backup service.", e);
-            } finally {
-                mInjector.binderRestoreCallingIdentity(ident);
-            }
-
+            toggleBackupServiceActive(UserHandle.USER_SYSTEM, /* makeActive= */ false);
             if (isAdb()) {
                 // Log device owner provisioning was started using adb.
                 MetricsLogger.action(mContext, PROVISIONING_ENTRY_POINT_ADB, LOG_TAG_DEVICE_OWNER);
@@ -7716,7 +7738,7 @@
                 saveUserRestrictionsLocked(userId);
             }
 
-            ident = mInjector.binderClearCallingIdentity();
+            long ident = mInjector.binderClearCallingIdentity();
             try {
                 // TODO Send to system too?
                 sendOwnerChangedBroadcast(DevicePolicyManager.ACTION_DEVICE_OWNER_CHANGED, userId);
@@ -7973,6 +7995,9 @@
                         .write();
             }
 
+            // Shutting down backup manager service permanently.
+            toggleBackupServiceActive(userHandle, /* makeActive= */ false);
+
             mOwners.setProfileOwner(who, ownerName, userHandle);
             mOwners.writeProfileOwner(userHandle);
             Slog.i(LOG_TAG, "Profile owner set: " + who + " on user " + userHandle);
@@ -7996,6 +8021,22 @@
         }
     }
 
+
+    private void toggleBackupServiceActive(int userId, boolean makeActive) {
+        long ident = mInjector.binderClearCallingIdentity();
+        try {
+            if (mInjector.getIBackupManager() != null) {
+                mInjector.getIBackupManager()
+                        .setBackupServiceActive(userId, makeActive);
+            }
+        } catch (RemoteException e) {
+            throw new IllegalStateException("Failed deactivating backup service.", e);
+        } finally {
+            mInjector.binderRestoreCallingIdentity(ident);
+        }
+
+    }
+
     @Override
     public void clearProfileOwner(ComponentName who) {
         if (!mHasFeature) {
@@ -8323,16 +8364,22 @@
                 != PackageManager.PERMISSION_GRANTED) {
             return false;
         }
-        // Allow access to the device owner.
+
+        // Allow access to the device owner or delegate cert installer.
         ComponentName deviceOwner = getDeviceOwnerComponent(true);
-        if (deviceOwner != null && deviceOwner.getPackageName().equals(packageName)) {
+        if (deviceOwner != null && (deviceOwner.getPackageName().equals(packageName)
+                    || isCallerDelegate(packageName, uid, DELEGATION_CERT_INSTALL))) {
             return true;
         }
-        // Allow access to the profile owner for the specified user.
+        // Allow access to the profile owner for the specified user, or delegate cert installer
         ComponentName profileOwner = getProfileOwnerAsUser(userHandle);
-        if (profileOwner != null && profileOwner.getPackageName().equals(packageName)) {
+        if (profileOwner != null && (profileOwner.getPackageName().equals(packageName)
+                    || isCallerDelegate(packageName, uid, DELEGATION_CERT_INSTALL))) {
             return true;
         }
+
+        Log.w(LOG_TAG, String.format("Package if %s (uid=%d, pid=%d) cannot access Device IDs",
+                    packageName, uid, pid));
         return false;
     }
 
@@ -12748,22 +12795,9 @@
             return;
         }
         Preconditions.checkNotNull(admin);
-        synchronized (getLockObject()) {
-            getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
-        }
-
-        final long ident = mInjector.binderClearCallingIdentity();
-        try {
-            IBackupManager ibm = mInjector.getIBackupManager();
-            if (ibm != null) {
-                ibm.setBackupServiceActive(UserHandle.USER_SYSTEM, enabled);
-            }
-        } catch (RemoteException e) {
-            throw new IllegalStateException(
-                "Failed " + (enabled ? "" : "de") + "activating backup service.", e);
-        } finally {
-            mInjector.binderRestoreCallingIdentity(ident);
-        }
+        enforceProfileOrDeviceOwner(admin);
+        int userId = mInjector.userHandleGetCallingUserId();
+        toggleBackupServiceActive(userId, enabled);
     }
 
     @Override
@@ -12772,11 +12806,13 @@
         if (!mHasFeature) {
             return true;
         }
+
+        enforceProfileOrDeviceOwner(admin);
         synchronized (getLockObject()) {
             try {
-                getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
                 IBackupManager ibm = mInjector.getIBackupManager();
-                return ibm != null && ibm.isBackupServiceActive(UserHandle.USER_SYSTEM);
+                return ibm != null && ibm.isBackupServiceActive(
+                    mInjector.userHandleGetCallingUserId());
             } catch (RemoteException e) {
                 throw new IllegalStateException("Failed requesting backup service state.", e);
             }
@@ -14042,6 +14078,10 @@
 
         enforceCrossUsersPermission(userHandle);
         synchronized (getLockObject()) {
+            if (mInjector.settingsSecureGetIntForUser(
+                    Settings.Secure.CROSS_PROFILE_CALENDAR_ENABLED, 0, userHandle) == 0) {
+                return false;
+            }
             final ActiveAdmin admin = getProfileOwnerAdminLocked(userHandle);
             if (admin != null) {
                 if (admin.mCrossProfileCalendarPackages == null) {
@@ -14168,7 +14208,8 @@
                         + "calendar APIs", packageName));
                 return false;
             }
-            final Intent intent = new Intent(CalendarContract.ACTION_VIEW_WORK_CALENDAR_EVENT);
+            final Intent intent = new Intent(
+                    CalendarContract.ACTION_VIEW_MANAGED_PROFILE_CALENDAR_EVENT);
             intent.setPackage(packageName);
             intent.putExtra(CalendarContract.EXTRA_EVENT_ID, eventId);
             intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, start);
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 5861368..71ed5ae 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -55,6 +55,7 @@
 import android.os.Trace;
 import android.os.UserHandle;
 import android.os.storage.IStorageManager;
+import android.provider.DeviceConfig;
 import android.provider.Settings;
 import android.sysprop.VoldProperties;
 import android.text.TextUtils;
@@ -90,7 +91,9 @@
 import com.android.server.display.DisplayManagerService;
 import com.android.server.dreams.DreamManagerService;
 import com.android.server.emergency.EmergencyAffordanceService;
+import com.android.server.gpu.GpuService;
 import com.android.server.hdmi.HdmiControlService;
+import com.android.server.incident.IncidentCompanionService;
 import com.android.server.input.InputManagerService;
 import com.android.server.inputmethod.InputMethodManagerService;
 import com.android.server.inputmethod.MultiClientInputMethodManagerService;
@@ -260,8 +263,6 @@
             "com.android.internal.car.CarServiceHelperService";
     private static final String TIME_DETECTOR_SERVICE_CLASS =
             "com.android.server.timedetector.TimeDetectorService$Lifecycle";
-    private static final String TIME_ZONE_DETECTOR_SERVICE_CLASS =
-            "com.android.server.timezonedetector.TimeZoneDetectorService$Lifecycle";
     private static final String ACCESSIBILITY_MANAGER_SERVICE_CLASS =
             "com.android.server.accessibility.AccessibilityManagerService$Lifecycle";
     private static final String ADB_SERVICE_CLASS =
@@ -811,6 +812,11 @@
         traceBeginAndSlog("StartBugreportManagerService");
         mSystemServiceManager.startService(BugreportManagerService.class);
         traceEnd();
+
+        // Serivce for GPU and GPU driver.
+        traceBeginAndSlog("GpuService");
+        mSystemServiceManager.startService(GpuService.class);
+        traceEnd();
     }
 
     /**
@@ -819,6 +825,7 @@
     private void startOtherServices() {
         final Context context = mSystemContext;
         VibratorService vibrator = null;
+        DynamicAndroidService dynamicAndroid = null;
         IStorageManager storageManager = null;
         NetworkManagementService networkManagement = null;
         IpSecService ipSecService = null;
@@ -937,6 +944,11 @@
             ServiceManager.addService("vibrator", vibrator);
             traceEnd();
 
+            traceBeginAndSlog("StartDynamicAndroidService");
+            dynamicAndroid = new DynamicAndroidService(context);
+            ServiceManager.addService("dynamic_android", dynamicAndroid);
+            traceEnd();
+
             if (!isWatch) {
                 traceBeginAndSlog("StartConsumerIrService");
                 consumerIr = new ConsumerIrService(context);
@@ -1414,14 +1426,6 @@
                     reportWtf("starting StartTimeDetectorService service", e);
                 }
                 traceEnd();
-
-                traceBeginAndSlog("StartTimeZoneDetectorService");
-                try {
-                    mSystemServiceManager.startService(TIME_ZONE_DETECTOR_SERVICE_CLASS);
-                } catch (Throwable e) {
-                    reportWtf("starting StartTimeZoneDetectorService service", e);
-                }
-                traceEnd();
             }
 
             if (!isWatch) {
@@ -1856,6 +1860,11 @@
         mSystemServiceManager.startService(StatsCompanionService.Lifecycle.class);
         traceEnd();
 
+        // Incidentd and dumpstated helper
+        traceBeginAndSlog("StartIncidentCompanionService");
+        mSystemServiceManager.startService(IncidentCompanionService.class);
+        traceEnd();
+
         if (safeMode) {
             traceBeginAndSlog("EnterSafeModeAndDisableJitCompilation");
             mActivityManagerService.enterSafeMode();
@@ -2212,10 +2221,9 @@
     }
 
     private void startContentCaptureService(@NonNull Context context) {
-
-        // Check if it was explicitly enabled by Settings
-        final String settings = Settings.Global.getString(context.getContentResolver(),
-                Settings.Global.CONTENT_CAPTURE_SERVICE_EXPLICITLY_ENABLED);
+        // Check if it was explicitly enabled by DeviceConfig
+        final String settings = DeviceConfig.getProperty(DeviceConfig.ContentCapture.NAMESPACE,
+                DeviceConfig.ContentCapture.PROPERTY_CONTENTCAPTURE_ENABLED);
         if (settings == null) {
             // Better be safe than sorry...
             Slog.d(TAG, "ContentCaptureService disabled because its not set by OEM");
@@ -2224,7 +2232,7 @@
         switch (settings) {
             case "always":
                 // Should be used only during development
-                Slog.d(TAG, "ContentCaptureService explicitly enabled by Settings");
+                Slog.d(TAG, "ContentCaptureService explicitly enabled by DeviceConfig");
                 break;
             case "default":
                 // Default case: check if OEM overlaid the resource that defines the service.
diff --git a/services/net/Android.bp b/services/net/Android.bp
index 30c7de5..638ec95 100644
--- a/services/net/Android.bp
+++ b/services/net/Android.bp
@@ -9,12 +9,6 @@
         "java/android/net/ip/InterfaceController.java", // TODO: move to NetworkStack with tethering
         "java/android/net/util/InterfaceParams.java", // TODO: move to NetworkStack with IpServer
         "java/android/net/shared/*.java",
-    ],
-}
-
-java_library {
-    name: "services-netlink-lib",
-    srcs: [
         "java/android/net/netlink/*.java",
-    ]
+    ],
 }
diff --git a/services/net/java/android/net/ip/InterfaceController.java b/services/net/java/android/net/ip/InterfaceController.java
index b3af67c..970bc9c 100644
--- a/services/net/java/android/net/ip/InterfaceController.java
+++ b/services/net/java/android/net/ip/InterfaceController.java
@@ -17,7 +17,6 @@
 package android.net.ip;
 
 import android.net.INetd;
-import android.net.InterfaceConfiguration;
 import android.net.InterfaceConfigurationParcel;
 import android.net.LinkAddress;
 import android.net.util.SharedLog;
@@ -49,14 +48,18 @@
         mLog = log;
     }
 
-    private boolean setInterfaceConfig(InterfaceConfiguration config) {
-        final InterfaceConfigurationParcel cfgParcel = config.toParcel(mIfName);
-
+    private boolean setInterfaceAddress(LinkAddress addr) {
+        final InterfaceConfigurationParcel ifConfig = new InterfaceConfigurationParcel();
+        ifConfig.ifName = mIfName;
+        ifConfig.ipv4Addr = addr.getAddress().getHostAddress();
+        ifConfig.prefixLength = addr.getPrefixLength();
+        ifConfig.hwAddr = "";
+        ifConfig.flags = new String[0];
         try {
-            mNetd.interfaceSetCfg(cfgParcel);
+            mNetd.interfaceSetCfg(ifConfig);
         } catch (RemoteException | ServiceSpecificException e) {
             logError("Setting IPv4 address to %s/%d failed: %s",
-                    cfgParcel.ipv4Addr, cfgParcel.prefixLength, e);
+                    ifConfig.ipv4Addr, ifConfig.prefixLength, e);
             return false;
         }
         return true;
@@ -69,18 +72,14 @@
         if (!(address.getAddress() instanceof Inet4Address)) {
             return false;
         }
-        final InterfaceConfiguration ifConfig = new InterfaceConfiguration();
-        ifConfig.setLinkAddress(address);
-        return setInterfaceConfig(ifConfig);
+        return setInterfaceAddress(address);
     }
 
     /**
      * Clear the IPv4Address of the interface.
      */
     public boolean clearIPv4Address() {
-        final InterfaceConfiguration ifConfig = new InterfaceConfiguration();
-        ifConfig.setLinkAddress(new LinkAddress("0.0.0.0/0"));
-        return setInterfaceConfig(ifConfig);
+        return setInterfaceAddress(new LinkAddress("0.0.0.0/0"));
     }
 
     private boolean setEnableIPv6(boolean enabled) {
diff --git a/services/net/java/android/net/ip/IpServer.java b/services/net/java/android/net/ip/IpServer.java
index f7360f5..7910c9a 100644
--- a/services/net/java/android/net/ip/IpServer.java
+++ b/services/net/java/android/net/ip/IpServer.java
@@ -40,7 +40,7 @@
 import android.net.ip.RouterAdvertisementDaemon.RaParams;
 import android.net.util.InterfaceParams;
 import android.net.util.InterfaceSet;
-import android.net.shared.NetdService;
+import android.net.util.NetdService;
 import android.net.util.SharedLog;
 import android.os.INetworkManagementService;
 import android.os.Looper;
diff --git a/services/net/java/android/net/netlink/NetlinkSocket.java b/services/net/java/android/net/netlink/NetlinkSocket.java
index 2a98d90..16f72bd 100644
--- a/services/net/java/android/net/netlink/NetlinkSocket.java
+++ b/services/net/java/android/net/netlink/NetlinkSocket.java
@@ -27,14 +27,13 @@
 import static android.system.OsConstants.SO_RCVTIMEO;
 import static android.system.OsConstants.SO_SNDTIMEO;
 
+import android.net.util.SocketUtils;
 import android.system.ErrnoException;
 import android.system.Os;
-import android.system.StructTimeval;
 import android.util.Log;
 
-import libcore.io.IoUtils;
-
 import java.io.FileDescriptor;
+import java.io.IOException;
 import java.io.InterruptedIOException;
 import java.net.SocketException;
 import java.nio.ByteBuffer;
@@ -95,7 +94,11 @@
             Log.e(TAG, errPrefix, e);
             throw new ErrnoException(errPrefix, EIO, e);
         } finally {
-            IoUtils.closeQuietly(fd);
+            try {
+                SocketUtils.closeSocket(fd);
+            } catch (IOException e) {
+                // Nothing we can do here
+            }
         }
     }
 
@@ -106,7 +109,7 @@
     }
 
     public static void connectToKernel(FileDescriptor fd) throws ErrnoException, SocketException {
-        Os.connect(fd, makeNetlinkSocketAddress(0, 0));
+        SocketUtils.connectSocket(fd, makeNetlinkSocketAddress(0, 0));
     }
 
     private static void checkTimeout(long timeoutMs) {
@@ -125,7 +128,7 @@
             throws ErrnoException, IllegalArgumentException, InterruptedIOException {
         checkTimeout(timeoutMs);
 
-        Os.setsockoptTimeval(fd, SOL_SOCKET, SO_RCVTIMEO, StructTimeval.fromMillis(timeoutMs));
+        SocketUtils.setSocketTimeValueOption(fd, SOL_SOCKET, SO_RCVTIMEO, timeoutMs);
 
         ByteBuffer byteBuffer = ByteBuffer.allocate(bufsize);
         int length = Os.read(fd, byteBuffer);
@@ -148,7 +151,7 @@
             FileDescriptor fd, byte[] bytes, int offset, int count, long timeoutMs)
             throws ErrnoException, IllegalArgumentException, InterruptedIOException {
         checkTimeout(timeoutMs);
-        Os.setsockoptTimeval(fd, SOL_SOCKET, SO_SNDTIMEO, StructTimeval.fromMillis(timeoutMs));
+        SocketUtils.setSocketTimeValueOption(fd, SOL_SOCKET, SO_SNDTIMEO, timeoutMs);
         return Os.write(fd, bytes, offset, count);
     }
 }
diff --git a/services/net/java/android/net/shared/InitialConfiguration.java b/services/net/java/android/net/shared/InitialConfiguration.java
index bc2373f..4ad7138 100644
--- a/services/net/java/android/net/shared/InitialConfiguration.java
+++ b/services/net/java/android/net/shared/InitialConfiguration.java
@@ -20,6 +20,7 @@
 import static android.net.shared.ParcelableUtil.toParcelableArray;
 import static android.text.TextUtils.join;
 
+import android.net.InetAddresses;
 import android.net.InitialConfigurationParcelable;
 import android.net.IpPrefix;
 import android.net.IpPrefixParcelable;
@@ -27,7 +28,7 @@
 import android.net.LinkAddressParcelable;
 import android.net.RouteInfo;
 
-import java.net.Inet6Address;
+import java.net.Inet4Address;
 import java.net.InetAddress;
 import java.util.HashSet;
 import java.util.List;
@@ -43,6 +44,8 @@
     private static final int RFC6177_MIN_PREFIX_LENGTH = 48;
     private static final int RFC7421_PREFIX_LENGTH = 64;
 
+    public static final InetAddress INET6_ANY = InetAddresses.parseNumericAddress("::");
+
     /**
      * Create a InitialConfiguration that is a copy of the specified configuration.
      */
@@ -102,7 +105,7 @@
             return false;
         }
         // There no more than one IPv4 address
-        if (ipAddresses.stream().filter(LinkAddress::isIPv4).count() > 1) {
+        if (ipAddresses.stream().filter(InitialConfiguration::isIPv4).count() > 1) {
             return false;
         }
 
@@ -184,11 +187,11 @@
     }
 
     private static boolean isPrefixLengthCompliant(LinkAddress addr) {
-        return addr.isIPv4() || isCompliantIPv6PrefixLength(addr.getPrefixLength());
+        return isIPv4(addr) || isCompliantIPv6PrefixLength(addr.getPrefixLength());
     }
 
     private static boolean isPrefixLengthCompliant(IpPrefix prefix) {
-        return prefix.isIPv4() || isCompliantIPv6PrefixLength(prefix.getPrefixLength());
+        return isIPv4(prefix) || isCompliantIPv6PrefixLength(prefix.getPrefixLength());
     }
 
     private static boolean isCompliantIPv6PrefixLength(int prefixLength) {
@@ -196,8 +199,16 @@
                 && (prefixLength <= RFC7421_PREFIX_LENGTH);
     }
 
+    private static boolean isIPv4(IpPrefix prefix) {
+        return prefix.getAddress() instanceof Inet4Address;
+    }
+
+    private static boolean isIPv4(LinkAddress addr) {
+        return addr.getAddress() instanceof Inet4Address;
+    }
+
     private static boolean isIPv6DefaultRoute(IpPrefix prefix) {
-        return prefix.getAddress().equals(Inet6Address.ANY);
+        return prefix.getAddress().equals(INET6_ANY);
     }
 
     private static boolean isIPv6GUA(LinkAddress addr) {
diff --git a/services/net/java/android/net/shared/IpConfigurationParcelableUtil.java b/services/net/java/android/net/shared/IpConfigurationParcelableUtil.java
index 0007350..1f0525e 100644
--- a/services/net/java/android/net/shared/IpConfigurationParcelableUtil.java
+++ b/services/net/java/android/net/shared/IpConfigurationParcelableUtil.java
@@ -44,11 +44,11 @@
             @Nullable StaticIpConfiguration config) {
         if (config == null) return null;
         final StaticIpConfigurationParcelable p = new StaticIpConfigurationParcelable();
-        p.ipAddress = LinkPropertiesParcelableUtil.toStableParcelable(config.ipAddress);
-        p.gateway = parcelAddress(config.gateway);
+        p.ipAddress = LinkPropertiesParcelableUtil.toStableParcelable(config.getIpAddress());
+        p.gateway = parcelAddress(config.getGateway());
         p.dnsServers = toParcelableArray(
-                config.dnsServers, IpConfigurationParcelableUtil::parcelAddress, String.class);
-        p.domains = config.domains;
+                config.getDnsServers(), IpConfigurationParcelableUtil::parcelAddress, String.class);
+        p.domains = config.getDomains();
         return p;
     }
 
@@ -59,11 +59,13 @@
             @Nullable StaticIpConfigurationParcelable p) {
         if (p == null) return null;
         final StaticIpConfiguration config = new StaticIpConfiguration();
-        config.ipAddress = LinkPropertiesParcelableUtil.fromStableParcelable(p.ipAddress);
-        config.gateway = unparcelAddress(p.gateway);
-        config.dnsServers.addAll(fromParcelableArray(
-                p.dnsServers, IpConfigurationParcelableUtil::unparcelAddress));
-        config.domains = p.domains;
+        config.setIpAddress(LinkPropertiesParcelableUtil.fromStableParcelable(p.ipAddress));
+        config.setGateway(unparcelAddress(p.gateway));
+        for (InetAddress addr : fromParcelableArray(
+                p.dnsServers, IpConfigurationParcelableUtil::unparcelAddress)) {
+            config.addDnsServer(addr);
+        }
+        config.setDomains(p.domains);
         return config;
     }
 
diff --git a/services/net/java/android/net/shared/NetworkObserverRegistry.java b/services/net/java/android/net/shared/NetworkObserverRegistry.java
deleted file mode 100644
index 36945f5..0000000
--- a/services/net/java/android/net/shared/NetworkObserverRegistry.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.net.shared;
-
-import static android.Manifest.permission.NETWORK_STACK;
-
-import android.content.Context;
-import android.net.INetd;
-import android.net.INetdUnsolicitedEventListener;
-import android.net.INetworkManagementEventObserver;
-import android.net.InetAddresses;
-import android.net.IpPrefix;
-import android.net.LinkAddress;
-import android.net.RouteInfo;
-import android.os.Handler;
-import android.os.RemoteCallbackList;
-import android.os.RemoteException;
-import android.os.SystemClock;
-
-/**
- * A class for reporting network events to clients.
- *
- * Implements INetdUnsolicitedEventListener and registers with netd, and relays those events to
- * all INetworkManagementEventObserver objects that have registered with it.
- *
- * TODO: Make the notifyXyz methods protected once subclasses (e.g., the NetworkManagementService
- * subclass) no longer call them directly.
- *
- * TODO: change from RemoteCallbackList to direct in-process callbacks.
- */
-public class NetworkObserverRegistry extends INetdUnsolicitedEventListener.Stub {
-
-    private final Context mContext;
-    private final Handler mDaemonHandler;
-    private static final String TAG = "NetworkObserverRegistry";
-
-    /**
-     * Constructs a new instance and registers it with netd.
-     * This method should only be called once since netd will reject multiple registrations from
-     * the same process.
-     */
-    public NetworkObserverRegistry(Context context, Handler handler, INetd netd)
-            throws RemoteException {
-        mContext = context;
-        mDaemonHandler = handler;
-        netd.registerUnsolicitedEventListener(this);
-    }
-
-    private final RemoteCallbackList<INetworkManagementEventObserver> mObservers =
-            new RemoteCallbackList<>();
-
-    /**
-     * Registers the specified observer and start sending callbacks to it.
-     * This method may be called on any thread.
-     */
-    public void registerObserver(INetworkManagementEventObserver observer) {
-        mContext.enforceCallingOrSelfPermission(NETWORK_STACK, TAG);
-        mObservers.register(observer);
-    }
-
-    /**
-     * Unregisters the specified observer and stop sending callbacks to it.
-     * This method may be called on any thread.
-     */
-    public void unregisterObserver(INetworkManagementEventObserver observer) {
-        mContext.enforceCallingOrSelfPermission(NETWORK_STACK, TAG);
-        mObservers.unregister(observer);
-    }
-
-    @FunctionalInterface
-    private interface NetworkManagementEventCallback {
-        void sendCallback(INetworkManagementEventObserver o) throws RemoteException;
-    }
-
-    private void invokeForAllObservers(NetworkManagementEventCallback eventCallback) {
-        final int length = mObservers.beginBroadcast();
-        try {
-            for (int i = 0; i < length; i++) {
-                try {
-                    eventCallback.sendCallback(mObservers.getBroadcastItem(i));
-                } catch (RemoteException | RuntimeException e) {
-                }
-            }
-        } finally {
-            mObservers.finishBroadcast();
-        }
-    }
-
-    /**
-     * Notify our observers of a change in the data activity state of the interface
-     */
-    public void notifyInterfaceClassActivity(int type, boolean isActive, long tsNanos,
-            int uid, boolean fromRadio) {
-        invokeForAllObservers(o -> o.interfaceClassDataActivityChanged(
-                Integer.toString(type), isActive, tsNanos));
-    }
-
-    @Override
-    public void onInterfaceClassActivityChanged(boolean isActive,
-            int label, long timestamp, int uid) throws RemoteException {
-        final long timestampNanos;
-        if (timestamp <= 0) {
-            timestampNanos = SystemClock.elapsedRealtimeNanos();
-        } else {
-            timestampNanos = timestamp;
-        }
-        mDaemonHandler.post(() -> notifyInterfaceClassActivity(label, isActive,
-                timestampNanos, uid, false));
-    }
-
-    /**
-     * Notify our observers of a limit reached.
-     */
-    @Override
-    public void onQuotaLimitReached(String alertName, String ifName) throws RemoteException {
-        mDaemonHandler.post(() -> notifyLimitReached(alertName, ifName));
-    }
-
-    /**
-     * Notify our observers of a limit reached.
-     */
-    public void notifyLimitReached(String limitName, String iface) {
-        invokeForAllObservers(o -> o.limitReached(limitName, iface));
-    }
-
-    @Override
-    public void onInterfaceDnsServerInfo(String ifName,
-            long lifetime, String[] servers) throws RemoteException {
-        mDaemonHandler.post(() -> notifyInterfaceDnsServerInfo(ifName, lifetime, servers));
-    }
-
-    /**
-     * Notify our observers of DNS server information received.
-     */
-    public void notifyInterfaceDnsServerInfo(String iface, long lifetime, String[] addresses) {
-        invokeForAllObservers(o -> o.interfaceDnsServerInfo(iface, lifetime, addresses));
-    }
-
-    @Override
-    public void onInterfaceAddressUpdated(String addr,
-            String ifName, int flags, int scope) throws RemoteException {
-        final LinkAddress address = new LinkAddress(addr, flags, scope);
-        mDaemonHandler.post(() -> notifyAddressUpdated(ifName, address));
-    }
-
-    /**
-     * Notify our observers of a new or updated interface address.
-     */
-    public void notifyAddressUpdated(String iface, LinkAddress address) {
-        invokeForAllObservers(o -> o.addressUpdated(iface, address));
-    }
-
-    @Override
-    public void onInterfaceAddressRemoved(String addr,
-            String ifName, int flags, int scope) throws RemoteException {
-        final LinkAddress address = new LinkAddress(addr, flags, scope);
-        mDaemonHandler.post(() -> notifyAddressRemoved(ifName, address));
-    }
-
-    /**
-     * Notify our observers of a deleted interface address.
-     */
-    public void notifyAddressRemoved(String iface, LinkAddress address) {
-        invokeForAllObservers(o -> o.addressRemoved(iface, address));
-    }
-
-
-    @Override
-    public void onInterfaceAdded(String ifName) throws RemoteException {
-        mDaemonHandler.post(() -> notifyInterfaceAdded(ifName));
-    }
-
-    /**
-     * Notify our observers of an interface addition.
-     */
-    public void notifyInterfaceAdded(String iface) {
-        invokeForAllObservers(o -> o.interfaceAdded(iface));
-    }
-
-    @Override
-    public void onInterfaceRemoved(String ifName) throws RemoteException {
-        mDaemonHandler.post(() -> notifyInterfaceRemoved(ifName));
-    }
-
-    /**
-     * Notify our observers of an interface removal.
-     */
-    public void notifyInterfaceRemoved(String iface) {
-        invokeForAllObservers(o -> o.interfaceRemoved(iface));
-    }
-
-    @Override
-    public void onInterfaceChanged(String ifName, boolean up) throws RemoteException {
-        mDaemonHandler.post(() -> notifyInterfaceStatusChanged(ifName, up));
-    }
-
-    /**
-     * Notify our observers of an interface status change
-     */
-    public void notifyInterfaceStatusChanged(String iface, boolean up) {
-        invokeForAllObservers(o -> o.interfaceStatusChanged(iface, up));
-    }
-
-    @Override
-    public void onInterfaceLinkStateChanged(String ifName, boolean up) throws RemoteException {
-        mDaemonHandler.post(() -> notifyInterfaceLinkStateChanged(ifName, up));
-    }
-
-    /**
-     * Notify our observers of an interface link state change
-     * (typically, an Ethernet cable has been plugged-in or unplugged).
-     */
-    public void notifyInterfaceLinkStateChanged(String iface, boolean up) {
-        invokeForAllObservers(o -> o.interfaceLinkStateChanged(iface, up));
-    }
-
-    @Override
-    public void onRouteChanged(boolean updated,
-            String route, String gateway, String ifName) throws RemoteException {
-        final RouteInfo processRoute = new RouteInfo(new IpPrefix(route),
-                ("".equals(gateway)) ? null : InetAddresses.parseNumericAddress(gateway),
-                ifName);
-        mDaemonHandler.post(() -> notifyRouteChange(updated, processRoute));
-    }
-
-    /**
-     * Notify our observers of a route change.
-     */
-    public void notifyRouteChange(boolean updated, RouteInfo route) {
-        if (updated) {
-            invokeForAllObservers(o -> o.routeUpdated(route));
-        } else {
-            invokeForAllObservers(o -> o.routeRemoved(route));
-        }
-    }
-
-    @Override
-    public void onStrictCleartextDetected(int uid, String hex) throws RemoteException {
-        // Don't do anything here because this is not a method of INetworkManagementEventObserver.
-        // Only the NMS subclass will implement this.
-    }
-}
diff --git a/services/net/java/android/net/shared/NetdService.java b/services/net/java/android/net/util/NetdService.java
similarity index 99%
rename from services/net/java/android/net/shared/NetdService.java
rename to services/net/java/android/net/util/NetdService.java
index f5ae725..d4cd5bd 100644
--- a/services/net/java/android/net/shared/NetdService.java
+++ b/services/net/java/android/net/util/NetdService.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package android.net.shared;
+package android.net.util;
 
 import android.content.Context;
 import android.net.INetd;
diff --git a/services/robotests/backup/src/com/android/server/backup/internal/SetupObserverTest.java b/services/robotests/backup/src/com/android/server/backup/internal/SetupObserverTest.java
index bfb2b14..44e9e6a 100644
--- a/services/robotests/backup/src/com/android/server/backup/internal/SetupObserverTest.java
+++ b/services/robotests/backup/src/com/android/server/backup/internal/SetupObserverTest.java
@@ -18,17 +18,19 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import android.app.job.JobScheduler;
 import android.content.Context;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.platform.test.annotations.Presubmit;
 import android.provider.Settings;
 
+import com.android.server.backup.FullBackupJob;
+import com.android.server.backup.JobIdManager;
 import com.android.server.backup.KeyValueBackupJob;
 import com.android.server.backup.TransportManager;
 import com.android.server.backup.UserBackupManagerService;
 import com.android.server.backup.testing.BackupManagerServiceTestUtils;
-import com.android.server.backup.testing.TestUtils;
 import com.android.server.testing.shadows.ShadowApplicationPackageManager;
 
 import org.junit.Before;
@@ -38,7 +40,9 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowJobScheduler;
 
 import java.io.File;
 
@@ -47,7 +51,7 @@
  * UserBackupManagerService}.
  */
 @RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowApplicationPackageManager.class})
+@Config(shadows = {ShadowApplicationPackageManager.class, ShadowJobScheduler.class})
 @Presubmit
 public class SetupObserverTest {
     private static final String TAG = "SetupObserverTest";
@@ -58,6 +62,7 @@
     private Context mContext;
     private UserBackupManagerService mUserBackupManagerService;
     private HandlerThread mHandlerThread;
+    private ShadowJobScheduler mShadowJobScheduler;
 
     /** Setup state. */
     @Before
@@ -73,6 +78,7 @@
                         new File(mContext.getDataDir(), "test1"),
                         new File(mContext.getDataDir(), "test2"),
                         mTransportManager);
+        mShadowJobScheduler = Shadows.shadowOf(mContext.getSystemService(JobScheduler.class));
     }
 
     /** Test observer handles changes from not setup -> setup correctly. */
@@ -121,17 +127,27 @@
         // Setup conditions for a full backup job to be scheduled.
         mUserBackupManagerService.setEnabled(true);
         mUserBackupManagerService.enqueueFullBackup("testPackage", /* lastBackedUp */ 0);
-        // Clear the handler of all pending tasks. This is to prevent the below assertion on the
-        // handler from encountering false positives due to other tasks being scheduled as part of
-        // setup work.
-        TestUtils.runToEndOfTasks(mHandlerThread.getLooper());
 
         setupObserver.onChange(true);
 
-        assertThat(KeyValueBackupJob.isScheduled(mUserBackupManagerService.getUserId())).isTrue();
-        // Verifies that the full backup job is scheduled. The job is scheduled via a posted message
-        // on the backup handler so we verify that a message exists.
-        assertThat(mUserBackupManagerService.getBackupHandler().hasMessagesOrCallbacks()).isTrue();
+        assertThat(
+                        mShadowJobScheduler.getPendingJob(
+                                getJobIdForUser(
+                                        KeyValueBackupJob.MIN_JOB_ID,
+                                        KeyValueBackupJob.MAX_JOB_ID,
+                                        USER_ID)))
+                .isNotNull();
+        assertThat(
+                        mShadowJobScheduler.getPendingJob(
+                                getJobIdForUser(
+                                        FullBackupJob.MIN_JOB_ID,
+                                        FullBackupJob.MAX_JOB_ID,
+                                        USER_ID)))
+                .isNotNull();
+    }
+
+    private int getJobIdForUser(int min, int max, int userId) {
+        return JobIdManager.getJobIdForUserId(min, max, userId);
     }
 
     private void changeSetupCompleteSettingForUser(boolean value, int userId) {
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java
index b63138e..4bf62c6 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java
@@ -19,17 +19,33 @@
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
+import static com.android.server.job.controllers.JobStatus.CONSTRAINT_BACKGROUND_NOT_RESTRICTED;
+import static com.android.server.job.controllers.JobStatus.CONSTRAINT_BATTERY_NOT_LOW;
+import static com.android.server.job.controllers.JobStatus.CONSTRAINT_CHARGING;
+import static com.android.server.job.controllers.JobStatus.CONSTRAINT_CONNECTIVITY;
+import static com.android.server.job.controllers.JobStatus.CONSTRAINT_CONTENT_TRIGGER;
+import static com.android.server.job.controllers.JobStatus.CONSTRAINT_DEADLINE;
+import static com.android.server.job.controllers.JobStatus.CONSTRAINT_DEVICE_NOT_DOZING;
+import static com.android.server.job.controllers.JobStatus.CONSTRAINT_IDLE;
+import static com.android.server.job.controllers.JobStatus.CONSTRAINT_STORAGE_NOT_LOW;
+import static com.android.server.job.controllers.JobStatus.CONSTRAINT_TIMING_DELAY;
+import static com.android.server.job.controllers.JobStatus.CONSTRAINT_WITHIN_QUOTA;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
 import android.app.job.JobInfo;
+import android.app.usage.UsageStatsManagerInternal;
 import android.content.ComponentName;
 import android.content.pm.PackageManagerInternal;
 import android.os.SystemClock;
+import android.provider.MediaStore;
 
 import androidx.test.runner.AndroidJUnit4;
 
 import com.android.server.LocalServices;
+import com.android.server.job.JobSchedulerInternal;
 import com.android.server.job.JobSchedulerService;
 
 import org.junit.After;
@@ -37,6 +53,7 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoSession;
+import org.mockito.quality.Strictness;
 
 import java.time.Clock;
 import java.time.ZoneOffset;
@@ -51,10 +68,15 @@
     public void setUp() throws Exception {
         mMockingSession = mockitoSession()
                 .initMocks(this)
+                .strictness(Strictness.LENIENT)
                 .mockStatic(LocalServices.class)
                 .startMocking();
+        doReturn(mock(JobSchedulerInternal.class))
+                .when(() -> LocalServices.getService(JobSchedulerInternal.class));
         doReturn(mock(PackageManagerInternal.class))
                 .when(() -> LocalServices.getService(PackageManagerInternal.class));
+        doReturn(mock(UsageStatsManagerInternal.class))
+                .when(() -> LocalServices.getService(UsageStatsManagerInternal.class));
 
         // Freeze the clocks at this moment in time
         JobSchedulerService.sSystemClock =
@@ -91,6 +113,462 @@
         assertEquals(1, createJobStatus(now - 2000, now).getFractionRunTime(), DELTA);
     }
 
+    /**
+     * Test {@link JobStatus#wouldBeReadyWithConstraint} on explicit constraints that weren't
+     * requested.
+     */
+    @Test
+    public void testWouldBeReadyWithConstraint_NonRequestedConstraints() {
+        // Job with no explicit constraints.
+        final JobStatus job = createJobStatus(
+                new JobInfo.Builder(101, new ComponentName("foo", "bar")).build());
+
+        markImplicitConstraintsSatisfied(job, false);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_IDLE));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_BATTERY_NOT_LOW));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_STORAGE_NOT_LOW));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_TIMING_DELAY));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_DEADLINE));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONNECTIVITY));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER));
+
+        markImplicitConstraintsSatisfied(job, true);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING));
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_IDLE));
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_BATTERY_NOT_LOW));
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_STORAGE_NOT_LOW));
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_TIMING_DELAY));
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_DEADLINE));
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CONNECTIVITY));
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER));
+    }
+
+    @Test
+    public void testWouldBeReadyWithConstraint_RequestedCharging() {
+        final JobInfo jobInfo =
+                new JobInfo.Builder(101, new ComponentName("foo", "bar"))
+                        .setRequiresCharging(true)
+                        .build();
+        final JobStatus job = createJobStatus(jobInfo);
+
+        markImplicitConstraintsSatisfied(job, true);
+        job.setChargingConstraintSatisfied(false);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING));
+        job.setChargingConstraintSatisfied(true);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING));
+
+        markImplicitConstraintsSatisfied(job, false);
+        job.setChargingConstraintSatisfied(false);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING));
+        job.setChargingConstraintSatisfied(true);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING));
+    }
+
+    @Test
+    public void testWouldBeReadyWithConstraint_RequestedDeviceIdle() {
+        final JobInfo jobInfo =
+                new JobInfo.Builder(101, new ComponentName("foo", "bar"))
+                        .setRequiresDeviceIdle(true)
+                        .build();
+        final JobStatus job = createJobStatus(jobInfo);
+
+        markImplicitConstraintsSatisfied(job, true);
+        job.setIdleConstraintSatisfied(false);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_IDLE));
+        job.setIdleConstraintSatisfied(true);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_IDLE));
+
+        markImplicitConstraintsSatisfied(job, false);
+        job.setIdleConstraintSatisfied(false);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_IDLE));
+        job.setIdleConstraintSatisfied(true);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_IDLE));
+    }
+
+    @Test
+    public void testWouldBeReadyWithConstraint_RequestedBatteryNotLow() {
+        final JobInfo jobInfo =
+                new JobInfo.Builder(101, new ComponentName("foo", "bar"))
+                        .setRequiresBatteryNotLow(true)
+                        .build();
+        final JobStatus job = createJobStatus(jobInfo);
+
+        markImplicitConstraintsSatisfied(job, true);
+        job.setBatteryNotLowConstraintSatisfied(false);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_BATTERY_NOT_LOW));
+        job.setBatteryNotLowConstraintSatisfied(true);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_BATTERY_NOT_LOW));
+
+        markImplicitConstraintsSatisfied(job, false);
+        job.setBatteryNotLowConstraintSatisfied(false);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_BATTERY_NOT_LOW));
+        job.setBatteryNotLowConstraintSatisfied(true);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_BATTERY_NOT_LOW));
+    }
+
+    @Test
+    public void testWouldBeReadyWithConstraint_RequestedStorageNotLow() {
+        final JobInfo jobInfo =
+                new JobInfo.Builder(101, new ComponentName("foo", "bar"))
+                        .setRequiresStorageNotLow(true)
+                        .build();
+        final JobStatus job = createJobStatus(jobInfo);
+
+        markImplicitConstraintsSatisfied(job, true);
+        job.setStorageNotLowConstraintSatisfied(false);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_STORAGE_NOT_LOW));
+        job.setStorageNotLowConstraintSatisfied(true);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_STORAGE_NOT_LOW));
+
+        markImplicitConstraintsSatisfied(job, false);
+        job.setStorageNotLowConstraintSatisfied(false);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_STORAGE_NOT_LOW));
+        job.setStorageNotLowConstraintSatisfied(true);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_STORAGE_NOT_LOW));
+    }
+
+    @Test
+    public void testWouldBeReadyWithConstraint_RequestedTimingDelay() {
+        final JobInfo jobInfo =
+                new JobInfo.Builder(101, new ComponentName("foo", "bar"))
+                        .setMinimumLatency(60_000)
+                        .build();
+        final JobStatus job = createJobStatus(jobInfo);
+
+        markImplicitConstraintsSatisfied(job, true);
+        job.setTimingDelayConstraintSatisfied(false);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_TIMING_DELAY));
+        job.setTimingDelayConstraintSatisfied(true);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_TIMING_DELAY));
+
+        markImplicitConstraintsSatisfied(job, false);
+        job.setTimingDelayConstraintSatisfied(false);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_TIMING_DELAY));
+        job.setTimingDelayConstraintSatisfied(true);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_TIMING_DELAY));
+    }
+
+    @Test
+    public void testWouldBeReadyWithConstraint_RequestedOverrideDeadline() {
+        final JobInfo jobInfo =
+                new JobInfo.Builder(101, new ComponentName("foo", "bar"))
+                        .setOverrideDeadline(300_000)
+                        .build();
+        final JobStatus job = createJobStatus(jobInfo);
+
+        markImplicitConstraintsSatisfied(job, true);
+        job.setDeadlineConstraintSatisfied(false);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_DEADLINE));
+        job.setDeadlineConstraintSatisfied(true);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_DEADLINE));
+
+        markImplicitConstraintsSatisfied(job, false);
+        job.setDeadlineConstraintSatisfied(false);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_DEADLINE));
+        job.setDeadlineConstraintSatisfied(true);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_DEADLINE));
+    }
+
+    @Test
+    public void testWouldBeReadyWithConstraint_RequestedConnectivity() {
+        final JobInfo jobInfo =
+                new JobInfo.Builder(101, new ComponentName("foo", "bar"))
+                        .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
+                        .build();
+        final JobStatus job = createJobStatus(jobInfo);
+
+        markImplicitConstraintsSatisfied(job, true);
+        job.setConnectivityConstraintSatisfied(false);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CONNECTIVITY));
+        job.setConnectivityConstraintSatisfied(true);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CONNECTIVITY));
+
+        markImplicitConstraintsSatisfied(job, false);
+        job.setConnectivityConstraintSatisfied(false);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONNECTIVITY));
+        job.setConnectivityConstraintSatisfied(true);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONNECTIVITY));
+    }
+
+    @Test
+    public void testWouldBeReadyWithConstraint_RequestedContentTrigger() {
+        final JobInfo jobInfo =
+                new JobInfo.Builder(101, new ComponentName("foo", "bar"))
+                        .addTriggerContentUri(new JobInfo.TriggerContentUri(
+                                MediaStore.Images.Media.INTERNAL_CONTENT_URI,
+                                JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS))
+                        .build();
+        final JobStatus job = createJobStatus(jobInfo);
+
+        markImplicitConstraintsSatisfied(job, true);
+        job.setContentTriggerConstraintSatisfied(false);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER));
+        job.setContentTriggerConstraintSatisfied(true);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER));
+
+        markImplicitConstraintsSatisfied(job, false);
+        job.setContentTriggerConstraintSatisfied(false);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER));
+        job.setContentTriggerConstraintSatisfied(true);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER));
+    }
+
+    @Test
+    public void testWouldBeReadyWithConstraint_RequestedMixture_NoDeadline() {
+        final JobInfo jobInfo =
+                new JobInfo.Builder(101, new ComponentName("foo", "bar"))
+                        .setRequiresCharging(true)
+                        .setRequiredNetworkType(JobInfo.NETWORK_TYPE_CELLULAR)
+                        .addTriggerContentUri(new JobInfo.TriggerContentUri(
+                                MediaStore.Images.Media.INTERNAL_CONTENT_URI,
+                                JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS))
+                        .build();
+        final JobStatus job = createJobStatus(jobInfo);
+
+        markImplicitConstraintsSatisfied(job, false);
+
+        job.setChargingConstraintSatisfied(false);
+        job.setConnectivityConstraintSatisfied(false);
+        job.setContentTriggerConstraintSatisfied(false);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONNECTIVITY));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER));
+        job.setChargingConstraintSatisfied(true);
+        job.setConnectivityConstraintSatisfied(true);
+        job.setContentTriggerConstraintSatisfied(true);
+        // Still false because implicit constraints aren't satisfied.
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONNECTIVITY));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER));
+
+        markImplicitConstraintsSatisfied(job, true);
+
+        job.setChargingConstraintSatisfied(false);
+        job.setConnectivityConstraintSatisfied(false);
+        job.setContentTriggerConstraintSatisfied(false);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONNECTIVITY));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER));
+
+        // Turn on constraints one at a time.
+        job.setChargingConstraintSatisfied(true);
+        job.setConnectivityConstraintSatisfied(false);
+        job.setContentTriggerConstraintSatisfied(false);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONNECTIVITY));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER));
+
+        job.setChargingConstraintSatisfied(false);
+        job.setConnectivityConstraintSatisfied(false);
+        job.setContentTriggerConstraintSatisfied(true);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONNECTIVITY));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER));
+
+        job.setChargingConstraintSatisfied(false);
+        job.setConnectivityConstraintSatisfied(true);
+        job.setContentTriggerConstraintSatisfied(false);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONNECTIVITY));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER));
+
+        // With two of the 3 constraints satisfied (and implicit constraints also satisfied), only
+        // the unsatisfied constraint should return true.
+        job.setChargingConstraintSatisfied(true);
+        job.setConnectivityConstraintSatisfied(false);
+        job.setContentTriggerConstraintSatisfied(true);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING));
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CONNECTIVITY));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER));
+
+        job.setChargingConstraintSatisfied(true);
+        job.setConnectivityConstraintSatisfied(true);
+        job.setContentTriggerConstraintSatisfied(false);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONNECTIVITY));
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER));
+
+        job.setChargingConstraintSatisfied(false);
+        job.setConnectivityConstraintSatisfied(true);
+        job.setContentTriggerConstraintSatisfied(true);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONNECTIVITY));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER));
+
+        job.setChargingConstraintSatisfied(true);
+        job.setConnectivityConstraintSatisfied(true);
+        job.setContentTriggerConstraintSatisfied(true);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING));
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CONNECTIVITY));
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER));
+    }
+
+    @Test
+    public void testWouldBeReadyWithConstraint_RequestedMixture_WithDeadline() {
+        final JobInfo jobInfo =
+                new JobInfo.Builder(101, new ComponentName("foo", "bar"))
+                        .setRequiresCharging(true)
+                        .setOverrideDeadline(300_000)
+                        .addTriggerContentUri(new JobInfo.TriggerContentUri(
+                                MediaStore.Images.Media.INTERNAL_CONTENT_URI,
+                                JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS))
+                        .build();
+        final JobStatus job = createJobStatus(jobInfo);
+
+        markImplicitConstraintsSatisfied(job, false);
+
+        job.setChargingConstraintSatisfied(false);
+        job.setContentTriggerConstraintSatisfied(false);
+        job.setDeadlineConstraintSatisfied(false);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_DEADLINE));
+        job.setChargingConstraintSatisfied(true);
+        job.setContentTriggerConstraintSatisfied(true);
+        job.setDeadlineConstraintSatisfied(true);
+        // Still false because implicit constraints aren't satisfied.
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_DEADLINE));
+
+        markImplicitConstraintsSatisfied(job, true);
+
+        job.setChargingConstraintSatisfied(false);
+        job.setContentTriggerConstraintSatisfied(false);
+        job.setDeadlineConstraintSatisfied(false);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER));
+        // Once implicit constraint are satisfied, deadline constraint should always return true.
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_DEADLINE));
+
+        // Turn on constraints one at a time.
+        job.setChargingConstraintSatisfied(true);
+        job.setContentTriggerConstraintSatisfied(false);
+        job.setDeadlineConstraintSatisfied(false);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING));
+        // Deadline should force isReady to be true, but isn't needed for the job to be
+        // considered ready.
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER));
+        // Once implicit constraint are satisfied, deadline constraint should always return true.
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_DEADLINE));
+
+        job.setChargingConstraintSatisfied(false);
+        job.setContentTriggerConstraintSatisfied(true);
+        job.setDeadlineConstraintSatisfied(false);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING));
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER));
+        // Once implicit constraint are satisfied, deadline constraint should always return true.
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_DEADLINE));
+
+        job.setChargingConstraintSatisfied(false);
+        job.setContentTriggerConstraintSatisfied(false);
+        job.setDeadlineConstraintSatisfied(true);
+        // Since the deadline constraint is satisfied, none of the other explicit constraints are
+        // needed.
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING));
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER));
+        // Once implicit constraint are satisfied, deadline constraint should always return true.
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_DEADLINE));
+
+        // With two of the 3 constraints satisfied (and implicit constraints also satisfied), only
+        // the unsatisfied constraint should return true.
+        job.setChargingConstraintSatisfied(true);
+        job.setContentTriggerConstraintSatisfied(true);
+        job.setDeadlineConstraintSatisfied(false);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING));
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER));
+        // Once implicit constraint are satisfied, deadline constraint should always return true.
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_DEADLINE));
+
+        job.setChargingConstraintSatisfied(true);
+        job.setContentTriggerConstraintSatisfied(false);
+        job.setDeadlineConstraintSatisfied(true);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING));
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER));
+        // Once implicit constraint are satisfied, deadline constraint should always return true.
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_DEADLINE));
+
+        job.setChargingConstraintSatisfied(false);
+        job.setContentTriggerConstraintSatisfied(true);
+        job.setDeadlineConstraintSatisfied(true);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING));
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER));
+        // Once implicit constraint are satisfied, deadline constraint should always return true.
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_DEADLINE));
+
+        job.setChargingConstraintSatisfied(true);
+        job.setContentTriggerConstraintSatisfied(true);
+        job.setDeadlineConstraintSatisfied(true);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CHARGING));
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_CONTENT_TRIGGER));
+        // Once implicit constraint are satisfied, deadline constraint should always return true.
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_DEADLINE));
+    }
+
+    @Test
+    public void testWouldBeReadyWithConstraint_ImplicitDeviceNotDozing() {
+        // Job with no explicit constraints.
+        final JobStatus job = createJobStatus(
+                new JobInfo.Builder(101, new ComponentName("foo", "bar")).build());
+
+        markImplicitConstraintsSatisfied(job, false);
+        job.setDeviceNotDozingConstraintSatisfied(false, false);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_DEVICE_NOT_DOZING));
+        job.setDeviceNotDozingConstraintSatisfied(true, false);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_DEVICE_NOT_DOZING));
+
+        markImplicitConstraintsSatisfied(job, true);
+        job.setDeviceNotDozingConstraintSatisfied(false, false);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_DEVICE_NOT_DOZING));
+        job.setDeviceNotDozingConstraintSatisfied(true, false);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_DEVICE_NOT_DOZING));
+    }
+
+    @Test
+    public void testWouldBeReadyWithConstraint_ImplicitQuota() {
+        // Job with no explicit constraints.
+        final JobStatus job = createJobStatus(
+                new JobInfo.Builder(101, new ComponentName("foo", "bar")).build());
+
+        markImplicitConstraintsSatisfied(job, false);
+        job.setQuotaConstraintSatisfied(false);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_WITHIN_QUOTA));
+        job.setQuotaConstraintSatisfied(true);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_WITHIN_QUOTA));
+
+        markImplicitConstraintsSatisfied(job, true);
+        job.setQuotaConstraintSatisfied(false);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_WITHIN_QUOTA));
+        job.setQuotaConstraintSatisfied(true);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_WITHIN_QUOTA));
+    }
+
+    @Test
+    public void testWouldBeReadyWithConstraint_ImplicitBackgroundNotRestricted() {
+        // Job with no explicit constraints.
+        final JobStatus job = createJobStatus(
+                new JobInfo.Builder(101, new ComponentName("foo", "bar")).build());
+
+        markImplicitConstraintsSatisfied(job, false);
+        job.setBackgroundNotRestrictedConstraintSatisfied(false);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_BACKGROUND_NOT_RESTRICTED));
+        job.setBackgroundNotRestrictedConstraintSatisfied(true);
+        assertFalse(job.wouldBeReadyWithConstraint(CONSTRAINT_BACKGROUND_NOT_RESTRICTED));
+
+        markImplicitConstraintsSatisfied(job, true);
+        job.setBackgroundNotRestrictedConstraintSatisfied(false);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_BACKGROUND_NOT_RESTRICTED));
+        job.setBackgroundNotRestrictedConstraintSatisfied(true);
+        assertTrue(job.wouldBeReadyWithConstraint(CONSTRAINT_BACKGROUND_NOT_RESTRICTED));
+    }
+
+    private void markImplicitConstraintsSatisfied(JobStatus job, boolean isSatisfied) {
+        job.setQuotaConstraintSatisfied(isSatisfied);
+        job.setDeviceNotDozingConstraintSatisfied(isSatisfied, false);
+        job.setBackgroundNotRestrictedConstraintSatisfied(isSatisfied);
+    }
+
     private static JobStatus createJobStatus(long earliestRunTimeElapsedMillis,
             long latestRunTimeElapsedMillis) {
         final JobInfo job = new JobInfo.Builder(101, new ComponentName("foo", "bar"))
@@ -98,4 +576,8 @@
         return new JobStatus(job, 0, null, -1, 0, 0, null, earliestRunTimeElapsedMillis,
                 latestRunTimeElapsedMillis, 0, 0, null, 0);
     }
+
+    private static JobStatus createJobStatus(JobInfo job) {
+        return JobStatus.createFromJobInfo(job, 0, null, -1, "JobStatusTest");
+    }
 }
diff --git a/services/tests/mockingservicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java b/services/tests/mockingservicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java
index 5009d64..86e8598 100644
--- a/services/tests/mockingservicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java
@@ -16,6 +16,7 @@
 package com.android.server.power.batterysaver;
 
 import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.doAnswer;
@@ -178,8 +179,12 @@
                 .getSystemService(NotificationManager.class);
         doAnswer((inv) -> mDevice.batterySaverEnabled = inv.getArgument(0))
                 .when(mMockBatterySaverController).enableBatterySaver(anyBoolean(), anyInt());
+        doReturn(true).when(mMockBatterySaverController)
+                .setAdaptivePolicyLocked(any(BatterySaverPolicy.Policy.class), anyInt());
         when(mMockBatterySaverController.isEnabled())
                 .thenAnswer((inv) -> mDevice.batterySaverEnabled);
+        when(mMockBatterySaverController.isFullEnabled())
+                .thenAnswer((inv) -> mDevice.batterySaverEnabled);
         when(mMockResources.getBoolean(
                 com.android.internal.R.bool.config_batterySaverStickyBehaviourDisabled))
                 .thenReturn(false);
diff --git a/services/tests/servicestests/src/com/android/server/DynamicAndroidServiceTest.java b/services/tests/servicestests/src/com/android/server/DynamicAndroidServiceTest.java
new file mode 100644
index 0000000..1494284
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/DynamicAndroidServiceTest.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server;
+
+import android.os.IDynamicAndroidService;
+import android.os.ServiceManager;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.LargeTest;
+
+public class DynamicAndroidServiceTest extends AndroidTestCase {
+    private static final String TAG = "DynamicAndroidServiceTests";
+    private IDynamicAndroidService mService;
+
+    @Override
+    protected void setUp() throws Exception {
+        mService =
+                IDynamicAndroidService.Stub.asInterface(
+                        ServiceManager.getService("dynamic_android"));
+    }
+
+    @LargeTest
+    public void test1() {
+        assertTrue("dynamic_android service available", mService != null);
+        try {
+            mService.startInstallation(1 << 20, 8 << 30);
+            fail("DynamicAndroidService did not throw SecurityException as expected");
+        } catch (SecurityException e) {
+            // expected
+        } catch (Exception e) {
+            fail(e.toString());
+        }
+    }
+}
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java
index 00a60b9..5dafe07 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java
@@ -122,7 +122,7 @@
 
     private UidRecord addActiveUidRecord(int uid, long curProcStateSeq,
             long lastNetworkUpdatedProcStateSeq) {
-        final UidRecord record = new UidRecord(uid, null /* atmInternal */);
+        final UidRecord record = new UidRecord(uid);
         record.lastNetworkUpdatedProcStateSeq = lastNetworkUpdatedProcStateSeq;
         record.curProcStateSeq = curProcStateSeq;
         record.waitingForNetwork = true;
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
index 419c736..4e21fd0c 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
@@ -250,7 +250,7 @@
     }
 
     private UidRecord addUidRecord(int uid) {
-        final UidRecord uidRec = new UidRecord(uid, null /* atmInternal */);
+        final UidRecord uidRec = new UidRecord(uid);
         uidRec.waitingForNetwork = true;
         uidRec.hasInternetPermission = true;
         mAms.mProcessList.mActiveUids.put(uid, uidRec);
@@ -405,7 +405,7 @@
 
     @Test
     public void testBlockStateForUid() {
-        final UidRecord uidRec = new UidRecord(TEST_UID, null /* atmInternal */);
+        final UidRecord uidRec = new UidRecord(TEST_UID);
         int expectedBlockState;
 
         final String errorTemplate = "Block state should be %s, prevState: %s, curState: %s";
@@ -732,7 +732,7 @@
 
     @Test
     public void testEnqueueUidChangeLocked_procStateSeqUpdated() {
-        final UidRecord uidRecord = new UidRecord(TEST_UID, null /* atmInternal */);
+        final UidRecord uidRecord = new UidRecord(TEST_UID);
         uidRecord.curProcStateSeq = TEST_PROC_STATE_SEQ1;
 
         // Verify with no pending changes for TEST_UID.
@@ -778,7 +778,7 @@
     @MediumTest
     @Test
     public void testEnqueueUidChangeLocked_dispatchUidsChanged() {
-        final UidRecord uidRecord = new UidRecord(TEST_UID, null /* atmInternal */);
+        final UidRecord uidRecord = new UidRecord(TEST_UID);
         final int expectedProcState = PROCESS_STATE_SERVICE;
         uidRecord.setProcState = expectedProcState;
         uidRecord.curProcStateSeq = TEST_PROC_STATE_SEQ1;
@@ -850,7 +850,7 @@
     private void verifyWaitingForNetworkStateUpdate(long curProcStateSeq,
             long lastDispatchedProcStateSeq, long lastNetworkUpdatedProcStateSeq,
             final long procStateSeqToWait, boolean expectWait) throws Exception {
-        final UidRecord record = new UidRecord(Process.myUid(), null /* atmInternal */);
+        final UidRecord record = new UidRecord(Process.myUid());
         record.curProcStateSeq = curProcStateSeq;
         record.lastDispatchedProcStateSeq = lastDispatchedProcStateSeq;
         record.lastNetworkUpdatedProcStateSeq = lastNetworkUpdatedProcStateSeq;
diff --git a/services/tests/servicestests/src/com/android/server/am/AppCompactorTest.java b/services/tests/servicestests/src/com/android/server/am/AppCompactorTest.java
index 1a231cf..2f8e545 100644
--- a/services/tests/servicestests/src/com/android/server/am/AppCompactorTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/AppCompactorTest.java
@@ -18,6 +18,7 @@
 
 import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_ACTION_1;
 import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_ACTION_2;
+import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_STATSD_SAMPLE_RATE;
 import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_1;
 import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_2;
 import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_3;
@@ -61,6 +62,9 @@
 @RunWith(AndroidJUnit4.class)
 public final class AppCompactorTest {
 
+    private static final String CLEAR_DEVICE_CONFIG_KEY_CMD =
+            "device_config delete activity_manager";
+
     @Mock private AppOpsService mAppOpsService;
     private AppCompactor mCompactorUnderTest;
     private HandlerThread mHandlerThread;
@@ -70,19 +74,21 @@
     private static void clearDeviceConfig() throws IOException  {
         UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
         uiDevice.executeShellCommand(
-                "device_config delete activity_manager " + KEY_USE_COMPACTION);
+                CLEAR_DEVICE_CONFIG_KEY_CMD + " " + KEY_USE_COMPACTION);
         uiDevice.executeShellCommand(
-                "device_config delete activity_manager " + KEY_COMPACT_ACTION_1);
+                CLEAR_DEVICE_CONFIG_KEY_CMD + " " + KEY_COMPACT_ACTION_1);
         uiDevice.executeShellCommand(
-                "device_config delete activity_manager " + KEY_COMPACT_ACTION_2);
+                CLEAR_DEVICE_CONFIG_KEY_CMD + " " + KEY_COMPACT_ACTION_2);
         uiDevice.executeShellCommand(
-                "device_config delete activity_manager " + KEY_COMPACT_THROTTLE_1);
+                CLEAR_DEVICE_CONFIG_KEY_CMD + " " + KEY_COMPACT_THROTTLE_1);
         uiDevice.executeShellCommand(
-                "device_config delete activity_manager " + KEY_COMPACT_THROTTLE_2);
+                CLEAR_DEVICE_CONFIG_KEY_CMD + " " + KEY_COMPACT_THROTTLE_2);
         uiDevice.executeShellCommand(
-                "device_config delete activity_manager " + KEY_COMPACT_THROTTLE_3);
+                CLEAR_DEVICE_CONFIG_KEY_CMD + " " + KEY_COMPACT_THROTTLE_3);
         uiDevice.executeShellCommand(
-                "device_config delete activity_manager " + KEY_COMPACT_THROTTLE_4);
+                CLEAR_DEVICE_CONFIG_KEY_CMD + " " + KEY_COMPACT_THROTTLE_4);
+        uiDevice.executeShellCommand(
+                CLEAR_DEVICE_CONFIG_KEY_CMD + " " + KEY_COMPACT_STATSD_SAMPLE_RATE);
     }
 
     @Before
@@ -128,6 +134,8 @@
                 is(AppCompactor.DEFAULT_COMPACT_THROTTLE_3));
         assertThat(mCompactorUnderTest.mCompactThrottleFullFull,
                 is(AppCompactor.DEFAULT_COMPACT_THROTTLE_4));
+        assertThat(mCompactorUnderTest.mStatsdSampleRate,
+                is(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE));
     }
 
     @Test
@@ -155,6 +163,9 @@
         DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
                 KEY_COMPACT_THROTTLE_4,
                 Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_4 + 1), false);
+        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
+                KEY_COMPACT_STATSD_SAMPLE_RATE,
+                Float.toString(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE + 0.1f), false);
 
         // Then calling init will read and set that flag.
         mCompactorUnderTest.init();
@@ -173,6 +184,8 @@
                 is(AppCompactor.DEFAULT_COMPACT_THROTTLE_3 + 1));
         assertThat(mCompactorUnderTest.mCompactThrottleFullFull,
                 is(AppCompactor.DEFAULT_COMPACT_THROTTLE_4 + 1));
+        assertThat(mCompactorUnderTest.mStatsdSampleRate,
+                is(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE + 0.1f));
     }
 
     @Test
@@ -365,6 +378,63 @@
                 is(AppCompactor.DEFAULT_COMPACT_THROTTLE_4));
     }
 
+    @Test
+    public void statsdSampleRate_listensToDeviceConfigChanges() throws InterruptedException {
+        mCompactorUnderTest.init();
+
+        // When we override mStatsdSampleRate with a reasonable values ...
+        mCountDown = new CountDownLatch(1);
+        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
+                KEY_COMPACT_STATSD_SAMPLE_RATE,
+                Float.toString(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE + 0.1f), false);
+        assertThat(mCountDown.await(5, TimeUnit.SECONDS), is(true));
+
+        // Then that override is reflected in the compactor.
+        assertThat(mCompactorUnderTest.mStatsdSampleRate,
+                is(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE + 0.1f));
+    }
+
+    @Test
+    public void statsdSanokeRate_listensToDeviceConfigChangesBadValues()
+            throws InterruptedException {
+        mCompactorUnderTest.init();
+
+        // When we override mStatsdSampleRate with a reasonable values ...
+        mCountDown = new CountDownLatch(1);
+        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
+                KEY_COMPACT_STATSD_SAMPLE_RATE, "foo", false);
+        assertThat(mCountDown.await(5, TimeUnit.SECONDS), is(true));
+
+        // Then that override is reflected in the compactor.
+        assertThat(mCompactorUnderTest.mStatsdSampleRate,
+                is(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE));
+    }
+
+    @Test
+    public void statsdSanokeRate_listensToDeviceConfigChangesOutOfRangeValues()
+            throws InterruptedException {
+        mCompactorUnderTest.init();
+
+        // When we override mStatsdSampleRate with an value outside of [0..1]...
+        mCountDown = new CountDownLatch(1);
+        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
+                KEY_COMPACT_STATSD_SAMPLE_RATE,
+                Float.toString(-1.0f), false);
+        assertThat(mCountDown.await(5, TimeUnit.SECONDS), is(true));
+
+        // Then the values is capped in the range.
+        assertThat(mCompactorUnderTest.mStatsdSampleRate, is(0.0f));
+
+        mCountDown = new CountDownLatch(1);
+        DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
+                KEY_COMPACT_STATSD_SAMPLE_RATE,
+                Float.toString(1.01f), false);
+        assertThat(mCountDown.await(5, TimeUnit.SECONDS), is(true));
+
+        // Then the values is capped in the range.
+        assertThat(mCompactorUnderTest.mStatsdSampleRate, is(1.0f));
+    }
+
     private class TestInjector extends Injector {
         @Override
         public AppOpsService getAppOpsService(File file, Handler handler) {
diff --git a/services/tests/servicestests/src/com/android/server/am/BroadcastRecordTest.java b/services/tests/servicestests/src/com/android/server/am/BroadcastRecordTest.java
index d4bb636..089a79b 100644
--- a/services/tests/servicestests/src/com/android/server/am/BroadcastRecordTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/BroadcastRecordTest.java
@@ -194,6 +194,7 @@
                 false /* sticky */,
                 false /* initialSticky */,
                 userId,
-                false /* allowBackgroundActivityStarts */);
+                false, /* allowBackgroundActivityStarts */
+                false /* timeoutExempt */ );
     }
 }
diff --git a/services/tests/servicestests/src/com/android/server/backup/testutils/IPackageManagerStub.java b/services/tests/servicestests/src/com/android/server/backup/testutils/IPackageManagerStub.java
index 095a1de..0355e84 100644
--- a/services/tests/servicestests/src/com/android/server/backup/testutils/IPackageManagerStub.java
+++ b/services/tests/servicestests/src/com/android/server/backup/testutils/IPackageManagerStub.java
@@ -51,6 +51,7 @@
 import android.os.IBinder;
 import android.os.PersistableBundle;
 import android.os.RemoteException;
+
 import java.util.List;
 
 /**
@@ -1146,6 +1147,20 @@
     }
 
     @Override
+    public String getContentCaptureServicePackageName() throws RemoteException {
+        return null;
+    }
+
+    public String getIncidentReportApproverPackageName() throws RemoteException {
+        return null;
+    }
+
+    @Override
+    public String getAppPredictionServicePackageName() {
+        return null;
+    }
+
+    @Override
     public boolean isPackageStateProtected(String packageName, int userId) throws RemoteException {
         return false;
     }
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
index 535198b..9ac91dd 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -5278,6 +5278,35 @@
         assertTrue(actual.containsAll(expected));
     }
 
+    public void testIsPackageAllowedToAccessCalendar_adminNotAllowed() {
+        setAsProfileOwner(admin1);
+        dpm.setCrossProfileCalendarPackages(admin1, Collections.emptySet());
+        when(getServices().settings.settingsSecureGetIntForUser(
+                Settings.Secure.CROSS_PROFILE_CALENDAR_ENABLED,
+                0, DpmMockContext.CALLER_USER_HANDLE)).thenReturn(1);
+        assertFalse(dpm.isPackageAllowedToAccessCalendar("TEST_PACKAGE"));
+    }
+
+    public void testIsPackageAllowedToAccessCalendar_settingOff() {
+        final String testPackage = "TEST_PACKAGE";
+        setAsProfileOwner(admin1);
+        dpm.setCrossProfileCalendarPackages(admin1, Collections.singleton(testPackage));
+        when(getServices().settings.settingsSecureGetIntForUser(
+                Settings.Secure.CROSS_PROFILE_CALENDAR_ENABLED,
+                0, DpmMockContext.CALLER_USER_HANDLE)).thenReturn(0);
+        assertFalse(dpm.isPackageAllowedToAccessCalendar(testPackage));
+    }
+
+    public void testIsPackageAllowedToAccessCalendar_bothAllowed() {
+        final String testPackage = "TEST_PACKAGE";
+        setAsProfileOwner(admin1);
+        dpm.setCrossProfileCalendarPackages(admin1, null);
+        when(getServices().settings.settingsSecureGetIntForUser(
+                Settings.Secure.CROSS_PROFILE_CALENDAR_ENABLED,
+                0, DpmMockContext.CALLER_USER_HANDLE)).thenReturn(1);
+        assertTrue(dpm.isPackageAllowedToAccessCalendar(testPackage));
+    }
+
     private void configureProfileOwnerForDeviceIdAccess(ComponentName who, int userId) {
         final long ident = mServiceContext.binder.clearCallingIdentity();
         mServiceContext.binder.callingUid =
diff --git a/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java b/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java
index 79a654b..e3b1245 100644
--- a/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java
@@ -37,6 +37,9 @@
 import android.hardware.SensorEventListener;
 import android.hardware.display.AmbientBrightnessDayStats;
 import android.hardware.display.BrightnessChangeEvent;
+import android.hardware.display.DisplayManager;
+import android.hardware.display.DisplayedContentSample;
+import android.hardware.display.DisplayedContentSamplingAttributes;
 import android.os.BatteryManager;
 import android.os.Handler;
 import android.os.HandlerThread;
@@ -47,6 +50,7 @@
 import android.os.UserManager;
 import android.provider.Settings;
 import android.util.AtomicFile;
+import android.view.Display;
 
 import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.SmallTest;
@@ -116,28 +120,81 @@
         assertTrue(mInjector.mIdleScheduled);
         mInjector.sendScreenChange(/*screen on */ true);
         assertNotNull(mInjector.mSensorListener);
+        assertTrue(mInjector.mColorSamplingEnabled);
 
         mInjector.sendScreenChange(/*screen on */ false);
         assertNull(mInjector.mSensorListener);
+        assertFalse(mInjector.mColorSamplingEnabled);
 
         // Turn screen on while brightness mode is manual
         mInjector.setBrightnessMode(/* isBrightnessModeAutomatic */ false);
         mInjector.sendScreenChange(/*screen on */ true);
         assertNull(mInjector.mSensorListener);
+        assertFalse(mInjector.mColorSamplingEnabled);
 
         // Set brightness mode to automatic while screen is off.
         mInjector.sendScreenChange(/*screen on */ false);
         mInjector.setBrightnessMode(/* isBrightnessModeAutomatic */ true);
         assertNull(mInjector.mSensorListener);
+        assertFalse(mInjector.mColorSamplingEnabled);
 
         // Turn on screen while brightness mode is automatic.
         mInjector.sendScreenChange(/*screen on */ true);
         assertNotNull(mInjector.mSensorListener);
+        assertTrue(mInjector.mColorSamplingEnabled);
 
         mTracker.stop();
         assertNull(mInjector.mSensorListener);
         assertNull(mInjector.mBroadcastReceiver);
         assertFalse(mInjector.mIdleScheduled);
+        assertFalse(mInjector.mColorSamplingEnabled);
+    }
+
+    @Test
+    public void testNoColorSampling_WrongPixelFormat() {
+        mInjector.mDefaultSamplingAttributes =
+                new DisplayedContentSamplingAttributes(
+                        0x23,
+                        mInjector.mDefaultSamplingAttributes.getDataspace(),
+                        mInjector.mDefaultSamplingAttributes.getComponentMask());
+        startTracker(mTracker);
+        assertFalse(mInjector.mColorSamplingEnabled);
+        assertNull(mInjector.mDisplayListener);
+    }
+
+    @Test
+    public void testNoColorSampling_MissingComponent() {
+        mInjector.mDefaultSamplingAttributes =
+                new DisplayedContentSamplingAttributes(
+                        mInjector.mDefaultSamplingAttributes.getPixelFormat(),
+                        mInjector.mDefaultSamplingAttributes.getDataspace(),
+                        0x2);
+        startTracker(mTracker);
+        assertFalse(mInjector.mColorSamplingEnabled);
+        assertNull(mInjector.mDisplayListener);
+    }
+
+    @Test
+    public void testNoColorSampling_NoSupport() {
+        mInjector.mDefaultSamplingAttributes = null;
+        startTracker(mTracker);
+        assertFalse(mInjector.mColorSamplingEnabled);
+        assertNull(mInjector.mDisplayListener);
+    }
+
+    @Test
+    public void testColorSampling_FrameRateChange() {
+        startTracker(mTracker);
+        assertTrue(mInjector.mColorSamplingEnabled);
+        assertNotNull(mInjector.mDisplayListener);
+        int noFramesSampled = mInjector.mNoColorSamplingFrames;
+        mInjector.mFrameRate = 120.0f;
+        // Wrong display
+        mInjector.mDisplayListener.onDisplayChanged(Display.DEFAULT_DISPLAY + 10);
+        assertEquals(noFramesSampled, mInjector.mNoColorSamplingFrames);
+        // Correct display
+        mInjector.mDisplayListener.onDisplayChanged(Display.DEFAULT_DISPLAY);
+        assertEquals(noFramesSampled * 2, mInjector.mNoColorSamplingFrames);
     }
 
     @Test
@@ -149,26 +206,41 @@
         assertNotNull(mInjector.mBroadcastReceiver);
         assertNotNull(mInjector.mContentObserver);
         assertTrue(mInjector.mIdleScheduled);
+        assertFalse(mInjector.mColorSamplingEnabled);
+        assertNull(mInjector.mDisplayListener);
 
         mInjector.setBrightnessMode(/*isBrightnessModeAutomatic*/ true);
         assertNotNull(mInjector.mSensorListener);
+        assertTrue(mInjector.mColorSamplingEnabled);
+        assertNotNull(mInjector.mDisplayListener);
 
         SensorEventListener listener = mInjector.mSensorListener;
+        DisplayManager.DisplayListener displayListener = mInjector.mDisplayListener;
         mInjector.mSensorListener = null;
+        mInjector.mColorSamplingEnabled = false;
+        mInjector.mDisplayListener = null;
         // Duplicate notification
         mInjector.setBrightnessMode(/*isBrightnessModeAutomatic*/ true);
         // Sensor shouldn't have been registered as it was already registered.
         assertNull(mInjector.mSensorListener);
+        assertFalse(mInjector.mColorSamplingEnabled);
+        assertNull(mInjector.mDisplayListener);
         mInjector.mSensorListener = listener;
+        mInjector.mDisplayListener = displayListener;
+        mInjector.mColorSamplingEnabled = true;
 
         mInjector.setBrightnessMode(/*isBrightnessModeAutomatic*/ false);
         assertNull(mInjector.mSensorListener);
+        assertFalse(mInjector.mColorSamplingEnabled);
+        assertNull(mInjector.mDisplayListener);
 
         mTracker.stop();
         assertNull(mInjector.mSensorListener);
         assertNull(mInjector.mBroadcastReceiver);
         assertNull(mInjector.mContentObserver);
         assertFalse(mInjector.mIdleScheduled);
+        assertFalse(mInjector.mColorSamplingEnabled);
+        assertNull(mInjector.mDisplayListener);
     }
 
     @Test
@@ -229,6 +301,8 @@
         assertEquals(3333, event.colorTemperature);
         assertEquals("a.package", event.packageName);
         assertEquals(0, event.userId);
+        assertArrayEquals(new long[] {1, 10, 100, 1000, 300, 30, 10, 1}, event.colorValueBuckets);
+        assertEquals(10000, event.colorSampleDuration);
 
         assertEquals(1, eventsNoPackage.size());
         assertNull(eventsNoPackage.get(0).packageName);
@@ -342,7 +416,8 @@
                 + "lastNits=\"32\" "
                 + "batteryLevel=\"0.5\" nightMode=\"true\" colorTemperature=\"3235\"\n"
                 + "lux=\"132.2,131.1\" luxTimestamps=\""
-                + Long.toString(someTimeAgo) + "," + Long.toString(someTimeAgo) + "\"/>"
+                + Long.toString(someTimeAgo) + "," + Long.toString(someTimeAgo) + "\""
+                + "colorSampleDuration=\"3456\" colorValueBuckets=\"123,598,23,19\"/>"
                 // Event that is too old so shouldn't show up.
                 + "<event nits=\"142\" timestamp=\""
                 + Long.toString(twoMonthsAgo) + "\" packageName=\""
@@ -368,6 +443,7 @@
         assertTrue(event.isDefaultBrightnessConfig);
         assertEquals(0.5f, event.powerBrightnessFactor, FLOAT_DELTA);
         assertTrue(event.isUserSetBrightness);
+        assertNull(event.colorValueBuckets);
 
         events = tracker.getEvents(1, true).getList();
         assertEquals(1, events.size());
@@ -386,6 +462,8 @@
         assertFalse(event.isDefaultBrightnessConfig);
         assertEquals(1.0, event.powerBrightnessFactor, FLOAT_DELTA);
         assertFalse(event.isUserSetBrightness);
+        assertEquals(3456L, event.colorSampleDuration);
+        assertArrayEquals(new long[] {123L, 598L, 23L, 19L}, event.colorValueBuckets);
 
         // Pretend user 1 is a profile of user 0.
         mInjector.mProfiles = new int[]{0, 1};
@@ -481,6 +559,8 @@
         assertEquals(0.5f, event.powerBrightnessFactor, FLOAT_DELTA);
         assertTrue(event.isUserSetBrightness);
         assertFalse(event.isDefaultBrightnessConfig);
+        assertArrayEquals(new long[] {1, 10, 100, 1000, 300, 30, 10, 1}, event.colorValueBuckets);
+        assertEquals(10000, event.colorSampleDuration);
     }
 
     @Test
@@ -546,6 +626,7 @@
         builder.setNightMode(false);
         builder.setColorTemperature(345);
         builder.setLastBrightness(50f);
+        builder.setColorValues(new long[] {23, 34, 45}, 1000L);
         BrightnessChangeEvent event = builder.build();
 
         event.writeToParcel(parcel, 0);
@@ -568,6 +649,8 @@
         assertEquals(event.nightMode, event2.nightMode);
         assertEquals(event.colorTemperature, event2.colorTemperature);
         assertEquals(event.lastBrightness, event2.lastBrightness, FLOAT_DELTA);
+        assertArrayEquals(event.colorValueBuckets, event2.colorValueBuckets);
+        assertEquals(event.colorSampleDuration, event2.colorSampleDuration);
 
         parcel = Parcel.obtain();
         builder.setBatteryLevel(Float.NaN);
@@ -714,6 +797,7 @@
     private class TestInjector extends BrightnessTracker.Injector {
         SensorEventListener mSensorListener;
         BroadcastReceiver mBroadcastReceiver;
+        DisplayManager.DisplayListener mDisplayListener;
         Map<String, Integer> mSecureIntSettings = new HashMap<>();
         long mCurrentTimeMillis = System.currentTimeMillis();
         long mElapsedRealtimeNanos = SystemClock.elapsedRealtimeNanos();
@@ -723,6 +807,12 @@
         int[] mProfiles;
         ContentObserver mContentObserver;
         boolean mIsBrightnessModeAutomatic = true;
+        boolean mColorSamplingEnabled = false;
+        DisplayedContentSamplingAttributes mDefaultSamplingAttributes =
+                new DisplayedContentSamplingAttributes(0x37, 0, 0x4);
+        float mFrameRate = 60.0f;
+        int mNoColorSamplingFrames;
+
 
         public TestInjector(Handler handler) {
             mHandler = handler;
@@ -882,5 +972,43 @@
             return mSecureIntSettings.getOrDefault(Settings.Secure.NIGHT_DISPLAY_ACTIVATED,
                     0) == 1;
         }
+
+        @Override
+        public DisplayedContentSample sampleColor(int noFramesToSample) {
+            return new DisplayedContentSample(600L,
+                    null,
+                    null,
+                     new long[] {1, 10, 100, 1000, 300, 30, 10, 1},
+                    null);
+        }
+
+        @Override
+        public float getFrameRate(Context context) {
+            return mFrameRate;
+        }
+
+        @Override
+        public DisplayedContentSamplingAttributes getSamplingAttributes() {
+            return mDefaultSamplingAttributes;
+        }
+
+        @Override
+        public boolean enableColorSampling(boolean enable, int noFrames) {
+            mColorSamplingEnabled = enable;
+            mNoColorSamplingFrames = noFrames;
+            return true;
+        }
+
+        @Override
+        public void registerDisplayListener(Context context,
+                DisplayManager.DisplayListener listener, Handler handler) {
+            mDisplayListener = listener;
+        }
+
+        @Override
+        public void unRegisterDisplayListener(Context context,
+                DisplayManager.DisplayListener listener) {
+            mDisplayListener = null;
+        }
     }
 }
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
index 3172afb..76beb8f 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
@@ -75,6 +75,7 @@
 import android.content.ActivityNotFoundException;
 import android.content.ComponentName;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.LauncherApps;
 import android.content.pm.LauncherApps.PinItemRequest;
@@ -6274,6 +6275,17 @@
         mManager.onApplicationActive(CALLING_PACKAGE_1, USER_0);
     }
 
+    public void testGetShareTargets_permission() {
+        IntentFilter filter = new IntentFilter();
+
+        assertExpectException(SecurityException.class, "Missing permission", () ->
+                mManager.getShareTargets(filter));
+
+        // Has permission, now it should pass.
+        mCallerPermissions.add(permission.MANAGE_APP_PREDICTIONS);
+        mManager.getShareTargets(filter);
+    }
+
     public void testDumpsys_crossProfile() {
         prepareCrossProfileDataSet();
         dumpsysOnLogcat("test1", /* force= */ true);
diff --git a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java
index 0dff03f..bfa0b74 100644
--- a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java
@@ -21,7 +21,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -86,7 +85,7 @@
                 .setBrightnessFactor(BRIGHTNESS_FACTOR)
                 .build();
         when(mBatterySaverPolicyMock.getBatterySaverPolicy(
-                eq(PowerManager.ServiceType.SCREEN_BRIGHTNESS), anyBoolean()))
+                eq(PowerManager.ServiceType.SCREEN_BRIGHTNESS)))
                 .thenReturn(mPowerSaveState);
 
         mDisplayPowerRequest = new DisplayPowerRequest();
diff --git a/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverPolicyTest.java b/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverPolicyTest.java
index 73eefcf..e32a789 100644
--- a/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverPolicyTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverPolicyTest.java
@@ -15,9 +15,11 @@
  */
 package com.android.server.power.batterysaver;
 
-import static com.google.common.truth.Truth.assertThat;
+import static com.android.server.power.batterysaver.BatterySaverPolicy.POLICY_LEVEL_ADAPTIVE;
+import static com.android.server.power.batterysaver.BatterySaverPolicy.POLICY_LEVEL_FULL;
+import static com.android.server.power.batterysaver.BatterySaverPolicy.POLICY_LEVEL_OFF;
 
-import static org.mockito.Mockito.mock;
+import static com.google.common.truth.Truth.assertThat;
 
 import android.content.Context;
 import android.os.PowerManager;
@@ -30,24 +32,23 @@
 
 import com.android.frameworks.servicestests.R;
 import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.logging.MetricsLogger;
+import com.android.server.power.batterysaver.BatterySaverPolicy.Policy;
 
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
 /**
  * Tests for {@link com.android.server.power.batterysaver.BatterySaverPolicy}
  */
 public class BatterySaverPolicyTest extends AndroidTestCase {
-    private static final boolean BATTERY_SAVER_ON = true;
-    private static final boolean BATTERY_SAVER_OFF = false;
+    private static final int MAX_SERVICE_TYPE = 15;
     private static final float BRIGHTNESS_FACTOR = 0.7f;
     private static final float DEFAULT_BRIGHTNESS_FACTOR = 0.5f;
     private static final float PRECISION = 0.001f;
-    private static final int GPS_MODE = 0;
+    private static final int GPS_MODE = 0; // LOCATION_MODE_NO_CHANGE
     private static final int DEFAULT_GPS_MODE =
             PowerManager.LOCATION_MODE_ALL_DISABLED_WHEN_SCREEN_OFF;
     private static final String BATTERY_SAVER_CONSTANTS = "vibration_disabled=true,"
+            + "advertise_is_enabled=true,"
             + "animation_disabled=false,"
             + "soundtrigger_disabled=true,"
             + "firewall_disabled=false,"
@@ -56,7 +57,7 @@
             + "adjust_brightness_factor=0.7,"
             + "fullbackup_deferred=true,"
             + "keyvaluebackup_deferred=false,"
-            + "gps_mode=0,"
+            + "gps_mode=0," // LOCATION_MODE_NO_CHANGE
             + "quick_doze_enabled=true";
     private static final String BATTERY_SAVER_INCORRECT_CONSTANTS = "vi*,!=,,true";
 
@@ -82,9 +83,6 @@
         }
     }
 
-    @Mock
-    MetricsLogger mMetricsLogger = mock(MetricsLogger.class);
-
     private BatterySaverPolicyForTest mBatterySaverPolicy;
 
     private final ArrayMap<String, String> mMockGlobalSettings = new ArrayMap<>();
@@ -95,8 +93,10 @@
         MockitoAnnotations.initMocks(this);
         final Object lock = new Object();
         mBatterySaverPolicy = new BatterySaverPolicyForTest(lock, getContext(),
-                new BatterySavingStats(lock, mMetricsLogger));
+                new BatterySavingStats(lock));
         mBatterySaverPolicy.systemReady();
+
+        mBatterySaverPolicy.setPolicyLevel(POLICY_LEVEL_FULL);
     }
 
     @SmallTest
@@ -148,12 +148,14 @@
     @SmallTest
     public void testGetBatterySaverPolicy_PolicyDataSaver_DefaultValueCorrect() {
         mBatterySaverPolicy.updateConstantsLocked("", "");
+        mBatterySaverPolicy.setPolicyLevel(POLICY_LEVEL_FULL);
         final PowerSaveState batterySaverStateOn =
-                mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.DATA_SAVER, BATTERY_SAVER_ON);
+                mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.DATA_SAVER);
         assertThat(batterySaverStateOn.batterySaverEnabled).isFalse();
 
+        mBatterySaverPolicy.setPolicyLevel(POLICY_LEVEL_OFF);
         final PowerSaveState batterySaverStateOff = mBatterySaverPolicy.getBatterySaverPolicy(
-                ServiceType.DATA_SAVER, BATTERY_SAVER_OFF);
+                ServiceType.DATA_SAVER);
         assertThat(batterySaverStateOff.batterySaverEnabled).isFalse();
     }
 
@@ -166,8 +168,9 @@
     public void testGetBatterySaverPolicy_PolicyGps_DefaultValueCorrect() {
         testServiceDefaultValue_On(ServiceType.GPS);
 
+        mBatterySaverPolicy.setPolicyLevel(POLICY_LEVEL_FULL);
         PowerSaveState stateOn =
-                mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.GPS, true);
+                mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.GPS);
         assertThat(stateOn.gpsMode).isEqualTo(DEFAULT_GPS_MODE);
     }
 
@@ -180,47 +183,51 @@
     public void testUpdateConstants_getCorrectData() {
         mBatterySaverPolicy.updateConstantsLocked(BATTERY_SAVER_CONSTANTS, "");
 
+        mBatterySaverPolicy.setPolicyLevel(POLICY_LEVEL_FULL);
+        verifyBatterySaverConstantsUpdated();
+    }
+
+    private void verifyBatterySaverConstantsUpdated() {
         final PowerSaveState vibrationState =
-                mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.VIBRATION, BATTERY_SAVER_ON);
+                mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.VIBRATION);
         assertThat(vibrationState.batterySaverEnabled).isTrue();
 
         final PowerSaveState animationState =
-                mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.ANIMATION, BATTERY_SAVER_ON);
+                mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.ANIMATION);
         assertThat(animationState.batterySaverEnabled).isFalse();
 
         final PowerSaveState soundState =
-                mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.SOUND, BATTERY_SAVER_ON);
+                mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.SOUND);
         assertThat(soundState.batterySaverEnabled).isTrue();
 
         final PowerSaveState networkState = mBatterySaverPolicy.getBatterySaverPolicy(
-                ServiceType.NETWORK_FIREWALL, BATTERY_SAVER_ON);
+                ServiceType.NETWORK_FIREWALL);
         assertThat(networkState.batterySaverEnabled).isTrue();
 
         final PowerSaveState screenState =
-                mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.SCREEN_BRIGHTNESS,
-                        BATTERY_SAVER_ON);
+                mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.SCREEN_BRIGHTNESS);
         assertThat(screenState.batterySaverEnabled).isFalse();
         assertThat(screenState.brightnessFactor).isWithin(PRECISION).of(BRIGHTNESS_FACTOR);
 
         final PowerSaveState fullBackupState = mBatterySaverPolicy.getBatterySaverPolicy(
-                ServiceType.FULL_BACKUP, BATTERY_SAVER_ON);
+                ServiceType.FULL_BACKUP);
         assertThat(fullBackupState.batterySaverEnabled).isTrue();
 
         final PowerSaveState keyValueBackupState = mBatterySaverPolicy.getBatterySaverPolicy(
-                ServiceType.KEYVALUE_BACKUP, BATTERY_SAVER_ON);
+                ServiceType.KEYVALUE_BACKUP);
         assertThat(keyValueBackupState.batterySaverEnabled).isFalse();
 
         final PowerSaveState dataSaverState = mBatterySaverPolicy.getBatterySaverPolicy(
-                ServiceType.DATA_SAVER, BATTERY_SAVER_ON);
+                ServiceType.DATA_SAVER);
         assertThat(dataSaverState.batterySaverEnabled).isTrue();
 
         final PowerSaveState gpsState =
-                mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.GPS, BATTERY_SAVER_ON);
+                mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.GPS);
         assertThat(gpsState.batterySaverEnabled).isTrue();
         assertThat(gpsState.gpsMode).isEqualTo(GPS_MODE);
 
         final PowerSaveState quickDozeState = mBatterySaverPolicy.getBatterySaverPolicy(
-                ServiceType.QUICK_DOZE, BATTERY_SAVER_ON);
+                ServiceType.QUICK_DOZE);
         assertThat(quickDozeState.batterySaverEnabled).isTrue();
     }
 
@@ -233,23 +240,27 @@
 
     private void testServiceDefaultValue_On(@ServiceType int type) {
         mBatterySaverPolicy.updateConstantsLocked("", "");
+        mBatterySaverPolicy.setPolicyLevel(POLICY_LEVEL_FULL);
         final PowerSaveState batterySaverStateOn =
-                mBatterySaverPolicy.getBatterySaverPolicy(type, BATTERY_SAVER_ON);
+                mBatterySaverPolicy.getBatterySaverPolicy(type);
         assertThat(batterySaverStateOn.batterySaverEnabled).isTrue();
 
+        mBatterySaverPolicy.setPolicyLevel(POLICY_LEVEL_OFF);
         final PowerSaveState batterySaverStateOff =
-                mBatterySaverPolicy.getBatterySaverPolicy(type, BATTERY_SAVER_OFF);
+                mBatterySaverPolicy.getBatterySaverPolicy(type);
         assertThat(batterySaverStateOff.batterySaverEnabled).isFalse();
     }
 
     private void testServiceDefaultValue_Off(@ServiceType int type) {
         mBatterySaverPolicy.updateConstantsLocked("", "");
+        mBatterySaverPolicy.setPolicyLevel(POLICY_LEVEL_FULL);
         final PowerSaveState batterySaverStateOn =
-                mBatterySaverPolicy.getBatterySaverPolicy(type, BATTERY_SAVER_ON);
+                mBatterySaverPolicy.getBatterySaverPolicy(type);
         assertThat(batterySaverStateOn.batterySaverEnabled).isFalse();
 
+        mBatterySaverPolicy.setPolicyLevel(POLICY_LEVEL_OFF);
         final PowerSaveState batterySaverStateOff =
-                mBatterySaverPolicy.getBatterySaverPolicy(type, BATTERY_SAVER_OFF);
+                mBatterySaverPolicy.getBatterySaverPolicy(type);
         assertThat(batterySaverStateOff.batterySaverEnabled).isFalse();
     }
 
@@ -291,4 +302,26 @@
                         + "/sys/devices/system/cpu/cpu5/cpufreq/scaling_max_freq=15}");
         assertThat(mBatterySaverPolicy.getFileValues(false).toString()).isEqualTo("{}");
     }
+
+    public void testSetPolicyLevel_Off() {
+        mBatterySaverPolicy.setPolicyLevel(POLICY_LEVEL_OFF);
+
+        // +1 to make sure the default value is off as well.
+        for (int i = 0; i < MAX_SERVICE_TYPE + 1; ++i) {
+            assertThat(mBatterySaverPolicy.getBatterySaverPolicy(i).batterySaverEnabled).isFalse();
+        }
+    }
+
+    public void testSetPolicyLevel_Adaptive() {
+        mBatterySaverPolicy.setPolicyLevel(POLICY_LEVEL_ADAPTIVE);
+
+        mBatterySaverPolicy.setAdaptivePolicyLocked(BatterySaverPolicy.OFF_POLICY);
+        for (int i = 0; i < MAX_SERVICE_TYPE + 1; ++i) {
+            assertThat(mBatterySaverPolicy.getBatterySaverPolicy(i).batterySaverEnabled).isFalse();
+        }
+
+        mBatterySaverPolicy.setAdaptivePolicyLocked(
+                Policy.fromSettings(BATTERY_SAVER_CONSTANTS, ""));
+        verifyBatterySaverConstantsUpdated();
+    }
 }
diff --git a/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySavingStatsTest.java b/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySavingStatsTest.java
index ba61fd2..76239fc 100644
--- a/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySavingStatsTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySavingStatsTest.java
@@ -30,14 +30,12 @@
 import androidx.test.runner.AndroidJUnit4;
 
 import com.android.internal.logging.MetricsLogger;
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.server.power.batterysaver.BatterySavingStats.BatterySaverState;
 import com.android.server.power.batterysaver.BatterySavingStats.DozeState;
 import com.android.server.power.batterysaver.BatterySavingStats.InteractiveState;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
 
 import java.io.ByteArrayOutputStream;
 import java.io.PrintWriter;
@@ -54,7 +52,7 @@
         private int mBatteryLevel = 1_000_000_000;
 
         private BatterySavingStatsTestable() {
-            super(new Object(), mMetricsLogger);
+            super(new Object());
         }
 
         @Override
@@ -104,23 +102,13 @@
 
     public MetricsLogger mMetricsLogger = mock(MetricsLogger.class);
 
-    private boolean sendTronEvents;
-
     @Test
-    public void testAll_withTron() {
-        sendTronEvents = true;
-        checkAll();
-    }
-
-    @Test
-    public void testAll_noTron() {
-        sendTronEvents = false;
+    public void testAll() {
         checkAll();
     }
 
     private void checkAll() {
         final BatterySavingStatsTestable target = new BatterySavingStatsTestable();
-        target.setSendTronLog(sendTronEvents);
 
         target.assertDumpable();
 
@@ -240,46 +228,13 @@
                 target.toDebugString());
     }
 
-    private void assertLog(boolean batterySaver, boolean interactive, long deltaTimeMs,
-            int deltaBatteryLevelUa, int deltaBatteryLevelPercent) {
-        if (sendTronEvents) {
-            ArgumentCaptor<LogMaker> ac = ArgumentCaptor.forClass(LogMaker.class);
-            verify(mMetricsLogger, times(1)).write(ac.capture());
-
-            LogMaker lm = ac.getValue();
-            assertEquals(MetricsEvent.BATTERY_SAVER, lm.getCategory());
-            assertEquals(batterySaver ? 1 : 0,
-                    lm.getTaggedData(MetricsEvent.RESERVED_FOR_LOGBUILDER_SUBTYPE));
-            assertEquals(interactive ? 1 : 0, lm.getTaggedData(MetricsEvent.FIELD_INTERACTIVE));
-            assertEquals(deltaTimeMs, lm.getTaggedData(MetricsEvent.FIELD_DURATION_MILLIS));
-
-            assertEquals(deltaBatteryLevelUa,
-                    (int) lm.getTaggedData(MetricsEvent.FIELD_START_BATTERY_UA)
-                            - (int) lm.getTaggedData(MetricsEvent.FIELD_END_BATTERY_UA));
-            assertEquals(deltaBatteryLevelPercent,
-                    (int) lm.getTaggedData(MetricsEvent.FIELD_START_BATTERY_PERCENT)
-                            - (int) lm.getTaggedData(MetricsEvent.FIELD_END_BATTERY_PERCENT));
-        } else {
-            verify(mMetricsLogger, times(0)).write(any(LogMaker.class));
-        }
-    }
-
-
-    @Test
-    public void testMetricsLogger_withTron() {
-        sendTronEvents = true;
-        checkMetricsLogger();
+    private void assertLog() {
+        verify(mMetricsLogger, times(0)).write(any(LogMaker.class));
     }
 
     @Test
-    public void testMetricsLogger_noTron() {
-        sendTronEvents = false;
-        checkMetricsLogger();
-    }
-
-    private void checkMetricsLogger() {
+    public void testMetricsLogger() {
         final BatterySavingStatsTestable target = new BatterySavingStatsTestable();
-        target.setSendTronLog(sendTronEvents);
 
         target.advanceClock(1);
         target.drainBattery(1000);
@@ -300,7 +255,7 @@
                 InteractiveState.NON_INTERACTIVE,
                 DozeState.NOT_DOZING);
 
-        assertLog(false, true, 60_000, 2000, 200);
+        assertLog();
 
         target.advanceClock(1);
         target.drainBattery(2000);
@@ -331,7 +286,7 @@
                 InteractiveState.INTERACTIVE,
                 DozeState.NOT_DOZING);
 
-        assertLog(false, false, 60_000 * 3, 2000 * 3, 200 * 3);
+        assertLog();
 
         target.advanceClock(10);
         target.drainBattery(10000);
@@ -339,7 +294,7 @@
         reset(mMetricsLogger);
         target.startCharging();
 
-        assertLog(true, true, 60_000 * 10, 10000, 1000);
+        assertLog();
 
         target.advanceClock(1);
         target.drainBattery(2000);
@@ -357,6 +312,6 @@
 
         target.startCharging();
 
-        assertLog(true, false, 60_000, 2000, 200);
+        assertLog();
     }
 }
diff --git a/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java b/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java
new file mode 100644
index 0000000..33cbf7a
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.rollback;
+
+import static org.junit.Assert.*;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verifyZeroInteractions;
+
+import android.content.pm.VersionedPackage;
+import android.content.rollback.PackageRollbackInfo;
+import android.content.rollback.PackageRollbackInfo.RestoreInfo;
+import android.util.IntArray;
+
+import com.android.server.pm.Installer;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.mockito.InOrder;
+import org.mockito.Mockito;
+
+import java.io.File;
+import java.util.ArrayList;
+
+@RunWith(JUnit4.class)
+public class AppDataRollbackHelperTest {
+
+    @Test
+    public void testSnapshotAppData() throws Exception {
+        Installer installer = mock(Installer.class);
+        AppDataRollbackHelper helper = spy(new AppDataRollbackHelper(installer));
+
+        // All users are unlocked so we should snapshot data for them.
+        doReturn(true).when(helper).isUserCredentialLocked(eq(10));
+        doReturn(true).when(helper).isUserCredentialLocked(eq(11));
+        IntArray pending = helper.snapshotAppData("com.foo.bar", new int[]{10, 11});
+        assertEquals(2, pending.size());
+        assertEquals(10, pending.get(0));
+        assertEquals(11, pending.get(1));
+
+        InOrder inOrder = Mockito.inOrder(installer);
+        inOrder.verify(installer).snapshotAppData(
+                eq("com.foo.bar"), eq(10), eq(Installer.FLAG_STORAGE_DE));
+        inOrder.verify(installer).snapshotAppData(
+                eq("com.foo.bar"), eq(11), eq(Installer.FLAG_STORAGE_DE));
+        inOrder.verifyNoMoreInteractions();
+
+        // One of the users is unlocked but the other isn't
+        doReturn(false).when(helper).isUserCredentialLocked(eq(10));
+        doReturn(true).when(helper).isUserCredentialLocked(eq(11));
+
+        pending = helper.snapshotAppData("com.foo.bar", new int[]{10, 11});
+        assertEquals(1, pending.size());
+        assertEquals(11, pending.get(0));
+
+        inOrder = Mockito.inOrder(installer);
+        inOrder.verify(installer).snapshotAppData(
+                eq("com.foo.bar"), eq(10),
+                eq(Installer.FLAG_STORAGE_CE | Installer.FLAG_STORAGE_DE));
+        inOrder.verify(installer).snapshotAppData(
+                eq("com.foo.bar"), eq(11), eq(Installer.FLAG_STORAGE_DE));
+        inOrder.verifyNoMoreInteractions();
+    }
+
+    private static RollbackData createInProgressRollbackData(String packageName) {
+        RollbackData data = new RollbackData(1, new File("/does/not/exist"));
+        data.packages.add(new PackageRollbackInfo(
+                new VersionedPackage(packageName, 1), new VersionedPackage(packageName, 1),
+                new IntArray(), new ArrayList<>()));
+        data.inProgress = true;
+
+        return data;
+    }
+
+    @Test
+    public void testRestoreAppDataSnapshot_noRollbackData() throws Exception {
+        Installer installer = mock(Installer.class);
+        AppDataRollbackHelper helper = spy(new AppDataRollbackHelper(installer));
+
+        assertFalse(helper.restoreAppData("com.foo", null, 0, 0, 0, "seinfo"));
+        verifyZeroInteractions(installer);
+    }
+
+    @Test
+    public void testRestoreAppDataSnapshot_noRollbackInProgress() throws Exception {
+        Installer installer = mock(Installer.class);
+        AppDataRollbackHelper helper = spy(new AppDataRollbackHelper(installer));
+
+        RollbackData rd = createInProgressRollbackData("com.foo");
+        // Override the in progress flag.
+        rd.inProgress = false;
+        assertFalse(helper.restoreAppData("com.foo", rd, 0, 0, 0, "seinfo"));
+        verifyZeroInteractions(installer);
+    }
+
+    @Test
+    public void testRestoreAppDataSnapshot_pendingBackupForUser() throws Exception {
+        Installer installer = mock(Installer.class);
+        AppDataRollbackHelper helper = spy(new AppDataRollbackHelper(installer));
+
+        RollbackData rd = createInProgressRollbackData("com.foo");
+        IntArray pendingBackups = rd.packages.get(0).getPendingBackups();
+        pendingBackups.add(10);
+        pendingBackups.add(11);
+
+        assertTrue(helper.restoreAppData("com.foo", rd, 10 /* userId */, 1, 2, "seinfo"));
+
+        // Should only require FLAG_STORAGE_DE here because we have a pending backup that we
+        // didn't manage to execute.
+        InOrder inOrder = Mockito.inOrder(installer);
+        inOrder.verify(installer).restoreAppDataSnapshot(
+                eq("com.foo"), eq(1), eq(2L), eq("seinfo"), eq(10), eq(Installer.FLAG_STORAGE_DE));
+        inOrder.verifyNoMoreInteractions();
+
+        assertEquals(1, pendingBackups.size());
+        assertEquals(11, pendingBackups.get(0));
+    }
+
+    @Test
+    public void testRestoreAppDataSnapshot_availableBackupForLockedUser() throws Exception {
+        Installer installer = mock(Installer.class);
+        AppDataRollbackHelper helper = spy(new AppDataRollbackHelper(installer));
+        doReturn(true).when(helper).isUserCredentialLocked(eq(10));
+
+        RollbackData rd = createInProgressRollbackData("com.foo");
+
+        assertTrue(helper.restoreAppData("com.foo", rd, 10 /* userId */, 1, 2, "seinfo"));
+
+        InOrder inOrder = Mockito.inOrder(installer);
+        inOrder.verify(installer).restoreAppDataSnapshot(
+                eq("com.foo"), eq(1), eq(2L), eq("seinfo"), eq(10), eq(Installer.FLAG_STORAGE_DE));
+        inOrder.verifyNoMoreInteractions();
+
+        ArrayList<RestoreInfo> pendingRestores = rd.packages.get(0).getPendingRestores();
+        assertEquals(1, pendingRestores.size());
+        assertEquals(10, pendingRestores.get(0).userId);
+        assertEquals(1, pendingRestores.get(0).appId);
+        assertEquals("seinfo", pendingRestores.get(0).seInfo);
+    }
+
+    @Test
+    public void testRestoreAppDataSnapshot_availableBackupForUnockedUser() throws Exception {
+        Installer installer = mock(Installer.class);
+        AppDataRollbackHelper helper = spy(new AppDataRollbackHelper(installer));
+        doReturn(false).when(helper).isUserCredentialLocked(eq(10));
+
+        RollbackData rd = createInProgressRollbackData("com.foo");
+        assertFalse(helper.restoreAppData("com.foo", rd, 10 /* userId */, 1, 2, "seinfo"));
+
+        InOrder inOrder = Mockito.inOrder(installer);
+        inOrder.verify(installer).restoreAppDataSnapshot(
+                eq("com.foo"), eq(1), eq(2L), eq("seinfo"), eq(10),
+                eq(Installer.FLAG_STORAGE_DE | Installer.FLAG_STORAGE_CE));
+        inOrder.verifyNoMoreInteractions();
+
+        ArrayList<RestoreInfo> pendingRestores = rd.packages.get(0).getPendingRestores();
+        assertEquals(0, pendingRestores.size());
+    }
+}
diff --git a/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorServiceTest.java b/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorServiceTest.java
deleted file mode 100644
index 0936fff..0000000
--- a/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorServiceTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.timezonedetector;
-
-import android.content.Context;
-
-import androidx.test.InstrumentationRegistry;
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * Unit tests for the {@link TimeZoneDetectorService}.
- */
-@RunWith(AndroidJUnit4.class)
-public class TimeZoneDetectorServiceTest {
-
-    private TimeZoneDetectorService mTimeZoneDetectorService;
-
-    @Before
-    public void setUp() {
-        final Context context = InstrumentationRegistry.getContext();
-        mTimeZoneDetectorService = new TimeZoneDetectorService(context);
-    }
-
-    @Test
-    public void testStubbedCall() {
-        mTimeZoneDetectorService.stubbedCall();
-    }
-}
diff --git a/services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java b/services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java
index 5d69bbd..4e43d00 100644
--- a/services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java
@@ -964,26 +964,6 @@
         assertFalse(hasAppUsageObserver(UID, OBS_ID1));
     }
 
-    /** Verify app usage limit observer added correctly reports it being a group limit */
-    @Test
-    public void testAppUsageLimitObserver_IsGroupLimit() {
-        addAppUsageLimitObserver(OBS_ID1, GROUP1, TIME_30_MIN);
-        AppTimeLimitController.AppUsageLimitGroup group = getAppUsageLimitObserver(UID, OBS_ID1);
-        assertNotNull("Observer wasn't added", group);
-        assertTrue("Observer didn't correctly report being a group limit",
-                group.isGroupLimit());
-    }
-
-    /** Verify app usage limit observer added correctly reports it being not a group limit */
-    @Test
-    public void testAppUsageLimitObserver_IsNotGroupLimit() {
-        addAppUsageLimitObserver(OBS_ID1, new String[]{PKG_PROD}, TIME_30_MIN);
-        AppTimeLimitController.AppUsageLimitGroup group = getAppUsageLimitObserver(UID, OBS_ID1);
-        assertNotNull("Observer wasn't added", group);
-        assertFalse("Observer didn't correctly report not being a group limit",
-                group.isGroupLimit());
-    }
-
     /** Verify app usage limit observer added correctly reports its total usage limit */
     @Test
     public void testAppUsageLimitObserver_GetTotalUsageLimit() {
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java
index 1de1e4e..0b488c0 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java
@@ -25,6 +25,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import android.app.INotificationManager;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.pm.IPackageManager;
@@ -36,22 +37,17 @@
 import android.util.IntArray;
 import android.util.Xml;
 
-import com.android.internal.util.FastXmlSerializer;
 import com.android.server.UiServiceTestCase;
 import com.android.server.notification.NotificationManagerService.NotificationAssistants;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mock;
-import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlSerializer;
 
 import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
 import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -65,6 +61,8 @@
     private UserManager mUm;
     @Mock
     NotificationManagerService mNm;
+    @Mock
+    private INotificationManager mINm;
 
     NotificationAssistants mAssistants;
 
@@ -83,6 +81,7 @@
         getContext().setMockPackageManager(mPm);
         getContext().addMockSystemService(Context.USER_SERVICE, mUm);
         mAssistants = spy(mNm.new NotificationAssistants(getContext(), mLock, mUserProfiles, miPm));
+        when(mNm.getBinderService()).thenReturn(mINm);
 
         List<ResolveInfo> approved = new ArrayList<>();
         ResolveInfo resolve = new ResolveInfo();
@@ -136,4 +135,30 @@
         verify(mAssistants, times(1)).addApprovedList(
                 new ComponentName("b", "b").flattenToString(),10, true);
     }
+
+    @Test
+    public void testSetPackageOrComponentEnabled_onlyOnePackage() throws Exception {
+        ComponentName component1 = ComponentName.unflattenFromString("package/Component1");
+        ComponentName component2 = ComponentName.unflattenFromString("package/Component2");
+        mAssistants.setPackageOrComponentEnabled(component1.flattenToString(), mZero.id, true,
+                true);
+        verify(mINm, never()).setNotificationAssistantAccessGrantedForUser(any(ComponentName.class),
+                eq(mZero.id), anyBoolean());
+
+        mAssistants.setPackageOrComponentEnabled(component2.flattenToString(), mZero.id, true,
+                true);
+        verify(mINm, times(1)).setNotificationAssistantAccessGrantedForUser(component1, mZero.id,
+                false);
+    }
+
+    @Test
+    public void testSetPackageOrComponentEnabled_samePackage() throws Exception {
+        ComponentName component1 = ComponentName.unflattenFromString("package/Component1");
+        mAssistants.setPackageOrComponentEnabled(component1.flattenToString(), mZero.id, true,
+                true);
+        mAssistants.setPackageOrComponentEnabled(component1.flattenToString(), mZero.id, true,
+                true);
+        verify(mINm, never()).setNotificationAssistantAccessGrantedForUser(any(ComponentName.class),
+                eq(mZero.id), anyBoolean());
+    }
 }
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index 9c6ab0a..4cae3b3 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -2029,6 +2029,31 @@
     }
 
     @Test
+    public void testGetAssistantAllowedForUser() throws Exception {
+        UserHandle user = UserHandle.of(10);
+        try {
+            mBinderService.getAllowedNotificationAssistantForUser(user.getIdentifier());
+        } catch (IllegalStateException e) {
+            if (!e.getMessage().contains("At most one NotificationAssistant")) {
+                throw e;
+            }
+        }
+        verify(mAssistants, times(1)).getAllowedComponents(user.getIdentifier());
+    }
+
+    @Test
+    public void testGetAssistantAllowed() throws Exception {
+        try {
+            mBinderService.getAllowedNotificationAssistant();
+        } catch (IllegalStateException e) {
+            if (!e.getMessage().contains("At most one NotificationAssistant")) {
+                throw e;
+            }
+        }
+        verify(mAssistants, times(1)).getAllowedComponents(0);
+    }
+
+    @Test
     public void testSetDndAccessForUser() throws Exception {
         UserHandle user = UserHandle.of(10);
         ComponentName c = ComponentName.unflattenFromString("package/Component");
@@ -2089,6 +2114,54 @@
     }
 
     @Test
+    public void testSetAssistantAccess_nullWithAllowedAssistant() throws Exception {
+        ArrayList<ComponentName> componentList = new ArrayList<>();
+        ComponentName c = ComponentName.unflattenFromString("package/Component");
+        componentList.add(c);
+        when(mAssistants.getAllowedComponents(anyInt())).thenReturn(componentList);
+
+        try {
+            mBinderService.setNotificationAssistantAccessGranted(null, true);
+        } catch (SecurityException e) {
+            if (!e.getMessage().contains("Permission Denial: not allowed to send broadcast")) {
+                throw e;
+            }
+        }
+
+        verify(mAssistants, times(1)).setPackageOrComponentEnabled(
+                c.flattenToString(), 0, true, false);
+        verify(mConditionProviders, times(1)).setPackageOrComponentEnabled(
+                c.flattenToString(), 0, false,  false);
+        verify(mListeners, never()).setPackageOrComponentEnabled(
+                any(), anyInt(), anyBoolean(), anyBoolean());
+    }
+
+    @Test
+    public void testSetAssistantAccessForUser_nullWithAllowedAssistant() throws Exception {
+        UserHandle user = UserHandle.of(10);
+        ArrayList<ComponentName> componentList = new ArrayList<>();
+        ComponentName c = ComponentName.unflattenFromString("package/Component");
+        componentList.add(c);
+        when(mAssistants.getAllowedComponents(anyInt())).thenReturn(componentList);
+
+        try {
+            mBinderService.setNotificationAssistantAccessGrantedForUser(
+                    null, user.getIdentifier(), true);
+        } catch (SecurityException e) {
+            if (!e.getMessage().contains("Permission Denial: not allowed to send broadcast")) {
+                throw e;
+            }
+        }
+
+        verify(mAssistants, times(1)).setPackageOrComponentEnabled(
+                c.flattenToString(), user.getIdentifier(), true, false);
+        verify(mConditionProviders, times(1)).setPackageOrComponentEnabled(
+                c.flattenToString(), user.getIdentifier(), false,  false);
+        verify(mListeners, never()).setPackageOrComponentEnabled(
+                any(), anyInt(), anyBoolean(), anyBoolean());
+    }
+
+    @Test
     public void testSetDndAccess() throws Exception {
         ComponentName c = ComponentName.unflattenFromString("package/Component");
         try {
@@ -3595,6 +3668,22 @@
     }
 
     @Test
+    public void testUserApprovedBubblesForPackage() throws Exception {
+        assertFalse(mBinderService.hasUserApprovedBubblesForPackage(PKG, mUid));
+        mBinderService.setBubblesAllowed(PKG, mUid, true);
+        assertTrue(mBinderService.hasUserApprovedBubblesForPackage(PKG, mUid));
+        assertTrue(mBinderService.areBubblesAllowedForPackage(PKG, mUid));
+    }
+
+    @Test
+    public void testUserRejectsBubblesForPackage() throws Exception {
+        assertFalse(mBinderService.hasUserApprovedBubblesForPackage(PKG, mUid));
+        mBinderService.setBubblesAllowed(PKG, mUid, false);
+        assertTrue(mBinderService.hasUserApprovedBubblesForPackage(PKG, mUid));
+        assertFalse(mBinderService.areBubblesAllowedForPackage(PKG, mUid));
+    }
+
+    @Test
     public void testIsCallerInstantApp_primaryUser() throws Exception {
         ApplicationInfo info = new ApplicationInfo();
         info.privateFlags = ApplicationInfo.PRIVATE_FLAG_INSTANT;
@@ -3842,7 +3931,7 @@
         mService.addNotification(r);
 
         mService.mNotificationDelegate.onNotificationSmartReplySent(
-                r.getKey(), replyIndex, reply, generatedByAssistant);
+                r.getKey(), replyIndex, reply, generatedByAssistant, NOTIFICATION_LOCATION_UNKNOWN);
         verify(mAssistants).notifyAssistantSuggestedReplySent(
                 eq(r.sbn), eq(reply), eq(generatedByAssistant));
     }
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
index 24a1f8c..47ec390 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
@@ -2006,6 +2006,28 @@
     }
 
     @Test
+    public void testXml_statusBarIcons_default() throws Exception {
+        ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false);
+        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper);
+        loadStreamXml(baos, false);
+
+        assertEquals(PreferencesHelper.DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS,
+                mHelper.shouldHideSilentStatusIcons());
+    }
+
+    @Test
+    public void testXml_statusBarIcons() throws Exception {
+        mHelper.setHideSilentStatusIcons(!PreferencesHelper.DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS);
+
+        ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false);
+        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper);
+        loadStreamXml(baos, false);
+
+        assertEquals(!PreferencesHelper.DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS,
+                mHelper.shouldHideSilentStatusIcons());
+    }
+
+    @Test
     public void testSetNotificationDelegate() {
         mHelper.setNotificationDelegate(PKG_O, UID_O, "other", 53);
         assertEquals("other", mHelper.getNotificationDelegate(PKG_O, UID_O));
@@ -2162,20 +2184,20 @@
 
     @Test
     public void testAllowBubbles_defaults() throws Exception {
-        assertTrue(mHelper.areBubblessAllowed(PKG_O, UID_O));
+        assertTrue(mHelper.areBubblesAllowed(PKG_O, UID_O));
 
         ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false);
         mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper);
         loadStreamXml(baos, false);
 
-        assertTrue(mHelper.areBubblessAllowed(PKG_O, UID_O));
+        assertTrue(mHelper.areBubblesAllowed(PKG_O, UID_O));
         assertEquals(0, mHelper.getAppLockedFields(PKG_O, UID_O));
     }
 
     @Test
     public void testAllowBubbles_xml() throws Exception {
         mHelper.setBubblesAllowed(PKG_O, UID_O, false);
-        assertFalse(mHelper.areBubblessAllowed(PKG_O, UID_O));
+        assertFalse(mHelper.areBubblesAllowed(PKG_O, UID_O));
         assertEquals(PreferencesHelper.LockableAppFields.USER_LOCKED_BUBBLE,
                 mHelper.getAppLockedFields(PKG_O, UID_O));
 
@@ -2183,7 +2205,7 @@
         mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper);
         loadStreamXml(baos, false);
 
-        assertFalse(mHelper.areBubblessAllowed(PKG_O, UID_O));
+        assertFalse(mHelper.areBubblesAllowed(PKG_O, UID_O));
         assertEquals(PreferencesHelper.LockableAppFields.USER_LOCKED_BUBBLE,
                 mHelper.getAppLockedFields(PKG_O, UID_O));
     }
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 319ffed..f1506a0 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
@@ -368,4 +368,15 @@
         verify(mService.getLifecycleManager()).scheduleTransaction(eq(mActivity.app.getThread()),
                 eq(mActivity.appToken), eq(expected));
     }
+
+    @Test
+    public void testShouldMakeActive_deferredResume() {
+        mActivity.setState(ActivityStack.ActivityState.STOPPED, "Testing");
+
+        mSupervisor.beginDeferResume();
+        assertEquals(false, mActivity.shouldMakeActive(null /* activeActivity */));
+
+        mSupervisor.endDeferResume();
+        assertEquals(true, mActivity.shouldMakeActive(null /* activeActivity */));
+    }
 }
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
index 35c1ede..986943a 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
@@ -34,6 +34,7 @@
 import static com.android.server.wm.ActivityStack.ActivityState.PAUSED;
 import static com.android.server.wm.ActivityStack.ActivityState.PAUSING;
 import static com.android.server.wm.ActivityStack.ActivityState.RESUMED;
+import static com.android.server.wm.ActivityStack.ActivityState.STOPPED;
 import static com.android.server.wm.ActivityStack.ActivityState.STOPPING;
 import static com.android.server.wm.ActivityStack.REMOVE_TASK_MODE_DESTROYING;
 import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_FREE_RESIZE;
@@ -51,6 +52,7 @@
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.eq;
 
+import android.content.ComponentName;
 import android.content.pm.ActivityInfo;
 import android.os.UserHandle;
 import android.platform.test.annotations.Presubmit;
@@ -647,20 +649,50 @@
     }
 
     @Test
-    public void testFinishDisabledPackageActivities() {
+    public void testFinishDisabledPackageActivities_FinishAliveActivities() {
         final ActivityRecord firstActivity = new ActivityBuilder(mService).setTask(mTask).build();
         final ActivityRecord secondActivity = new ActivityBuilder(mService).setTask(mTask).build();
+        firstActivity.setState(STOPPED, "testFinishDisabledPackageActivities");
+        secondActivity.setState(RESUMED, "testFinishDisabledPackageActivities");
+        mStack.mResumedActivity = secondActivity;
 
-        // Making the second activity a task overlay without an app means it will be removed from
-        // the task's activities as well once first activity is removed.
-        secondActivity.mTaskOverlay = true;
-        secondActivity.app = null;
+        // Note the activities have non-null ActivityRecord.app, so it won't remove directly.
+        mStack.finishDisabledPackageActivitiesLocked(firstActivity.packageName,
+                null /* filterByClasses */, true /* doit */, true /* evenPersistent */,
+                UserHandle.USER_ALL);
+
+        // If the activity is disabled with {@link android.content.pm.PackageManager#DONT_KILL_APP}
+        // the activity should still follow the normal flow to finish and destroy.
+        assertThat(firstActivity.getState()).isEqualTo(DESTROYING);
+        assertThat(secondActivity.getState()).isEqualTo(PAUSING);
+        assertTrue(secondActivity.finishing);
+    }
+
+    @Test
+    public void testFinishDisabledPackageActivities_RemoveNonAliveActivities() {
+        final ActivityRecord activity = new ActivityBuilder(mService).setTask(mTask).build();
+
+        // The overlay activity is not in the disabled package but it is in the same task.
+        final ActivityRecord overlayActivity = new ActivityBuilder(mService).setTask(mTask)
+                .setComponent(new ComponentName("package.overlay", ".OverlayActivity")).build();
+        // If the task only remains overlay activity, the task should also be removed.
+        // See {@link ActivityStack#removeActivityFromHistoryLocked}.
+        overlayActivity.mTaskOverlay = true;
+
+        // The activity without an app means it will be removed immediately.
+        // See {@link ActivityStack#destroyActivityLocked}.
+        activity.app = null;
+        overlayActivity.app = null;
 
         assertEquals(2, mTask.mActivities.size());
 
-        mStack.finishDisabledPackageActivitiesLocked(firstActivity.packageName, null,
-                true /* doit */, true /* evenPersistent */, UserHandle.USER_ALL);
+        mStack.finishDisabledPackageActivitiesLocked(activity.packageName,
+                null  /* filterByClasses */, true /* doit */, true /* evenPersistent */,
+                UserHandle.USER_ALL);
 
+        // Although the overlay activity is in another package, the non-overlay activities are
+        // removed from the task. Since the overlay activity should be removed as well, the task
+        // should be empty.
         assertThat(mTask.mActivities).isEmpty();
         assertThat(mStack.getAllTasks()).isEmpty();
     }
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
index ace965b..60f1ae26 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
@@ -61,6 +61,7 @@
 
 import android.app.ActivityOptions;
 import android.app.IApplicationThread;
+import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
@@ -561,7 +562,7 @@
         runAndVerifyBackgroundActivityStartsSubtest("allowed_noStartsAborted", false,
                 UNIMPORTANT_UID, false, PROCESS_STATE_TOP + 1,
                 UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1,
-                false, false, false);
+                false, false, false, false, false);
     }
 
     /**
@@ -576,7 +577,7 @@
                 "disallowed_unsupportedUsecase_aborted", true,
                 UNIMPORTANT_UID, false, PROCESS_STATE_TOP + 1,
                 UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1,
-                false, false, false);
+                false, false, false, false, false);
     }
 
     /**
@@ -591,57 +592,70 @@
         runAndVerifyBackgroundActivityStartsSubtest("disallowed_rootUid_notAborted", false,
                 Process.ROOT_UID, false, PROCESS_STATE_TOP + 1,
                 UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1,
-                false, false, false);
+                false, false, false, false, false);
         runAndVerifyBackgroundActivityStartsSubtest("disallowed_systemUid_notAborted", false,
                 Process.SYSTEM_UID, false, PROCESS_STATE_TOP + 1,
                 UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1,
-                false, false, false);
+                false, false, false, false, false);
         runAndVerifyBackgroundActivityStartsSubtest("disallowed_nfcUid_notAborted", false,
                 Process.NFC_UID, false, PROCESS_STATE_TOP + 1,
                 UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1,
-                false, false, false);
+                false, false, false, false, false);
         runAndVerifyBackgroundActivityStartsSubtest(
                 "disallowed_callingUidHasVisibleWindow_notAborted", false,
                 UNIMPORTANT_UID, true, PROCESS_STATE_TOP + 1,
                 UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1,
-                false, false, false);
+                false, false, false, false, false);
         runAndVerifyBackgroundActivityStartsSubtest(
                 "disallowed_callingUidProcessStateTop_notAborted", false,
                 UNIMPORTANT_UID, false, PROCESS_STATE_TOP,
                 UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1,
-                false, false, false);
+                false, false, false, false, false);
         runAndVerifyBackgroundActivityStartsSubtest(
                 "disallowed_realCallingUidHasVisibleWindow_notAborted", false,
                 UNIMPORTANT_UID, false, PROCESS_STATE_TOP + 1,
                 UNIMPORTANT_UID2, true, PROCESS_STATE_TOP + 1,
-                false, false, false);
+                false, false, false, false, false);
         runAndVerifyBackgroundActivityStartsSubtest(
                 "disallowed_realCallingUidProcessStateTop_notAborted", false,
                 UNIMPORTANT_UID, false, PROCESS_STATE_TOP + 1,
                 UNIMPORTANT_UID2, false, PROCESS_STATE_TOP,
-                false, false, false);
+                false, false, false, false, false);
         runAndVerifyBackgroundActivityStartsSubtest(
                 "disallowed_hasForegroundActivities_notAborted", false,
                 UNIMPORTANT_UID, false, PROCESS_STATE_TOP + 1,
                 UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1,
-                true, false, false);
+                true, false, false, false, false);
         runAndVerifyBackgroundActivityStartsSubtest(
                 "disallowed_callerIsRecents_notAborted", false,
                 UNIMPORTANT_UID, false, PROCESS_STATE_TOP + 1,
                 UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1,
-                false, true, false);
+                false, true, false, false, false);
         runAndVerifyBackgroundActivityStartsSubtest(
                 "disallowed_callerIsWhitelisted_notAborted", false,
                 UNIMPORTANT_UID, false, PROCESS_STATE_TOP + 1,
                 UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1,
-                false, false, true);
+                false, false, true, false, false);
+        runAndVerifyBackgroundActivityStartsSubtest(
+                "disallowed_callerIsInstrumentingWithBackgroundActivityStartPrivileges_notAborted",
+                false,
+                UNIMPORTANT_UID, false, PROCESS_STATE_TOP + 1,
+                UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1,
+                false, false, false, true, false);
+        runAndVerifyBackgroundActivityStartsSubtest(
+                "disallowed_callingPackageIsDeviceOwner_notAborted", false,
+                UNIMPORTANT_UID, false, PROCESS_STATE_TOP + 1,
+                UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1,
+                false, false, false, false, true);
     }
 
     private void runAndVerifyBackgroundActivityStartsSubtest(String name, boolean shouldHaveAborted,
             int callingUid, boolean callingUidHasVisibleWindow, int callingUidProcState,
             int realCallingUid, boolean realCallingUidHasVisibleWindow, int realCallingUidProcState,
             boolean hasForegroundActivities, boolean callerIsRecents,
-            boolean callerIsTempWhitelisted) {
+            boolean callerIsTempWhitelisted,
+            boolean callerIsInstrumentingWithBackgroundActivityStartPrivileges,
+            boolean isCallingPackageDeviceOwner) {
         // window visibility
         doReturn(callingUidHasVisibleWindow).when(mService.mWindowManager.mRoot)
                 .isAnyNonToastWindowVisibleForUid(callingUid);
@@ -664,6 +678,12 @@
         doReturn(callerIsRecents).when(recentTasks).isCallerRecents(callingUid);
         // caller is temp whitelisted
         callerApp.setAllowBackgroundActivityStarts(callerIsTempWhitelisted);
+        // caller is instrumenting with background activity starts privileges
+        callerApp.setInstrumenting(callerIsInstrumentingWithBackgroundActivityStartPrivileges,
+                callerIsInstrumentingWithBackgroundActivityStartPrivileges);
+        // caller is device owner
+        DevicePolicyManager dpmMock = mService.getDevicePolicyManager();
+        doReturn(isCallingPackageDeviceOwner).when(dpmMock).isDeviceOwnerApp(any());
 
         final ActivityOptions options = spy(ActivityOptions.makeBasic());
         ActivityStarter starter = prepareStarter(FLAG_ACTIVITY_NEW_TASK)
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java
index ea8f33f..e27dd94 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java
@@ -42,6 +42,7 @@
 import android.app.ActivityManagerInternal;
 import android.app.ActivityOptions;
 import android.app.IApplicationThread;
+import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -424,6 +425,7 @@
             spyOn(getLifecycleManager());
             spyOn(getLockTaskController());
             doReturn(mock(IPackageManager.class)).when(this).getPackageManager();
+            doReturn(mock(DevicePolicyManager.class)).when(this).getDevicePolicyManager();
             // allow background activity starts by default
             doReturn(true).when(this).isBackgroundActivityStartsEnabled();
             doNothing().when(this).updateCpuStats();
@@ -474,6 +476,10 @@
         }
 
         @Override
+        void updateCpuStats() {
+        }
+
+        @Override
         void updateBatteryStats(ActivityRecord component, boolean resumed) {
         }
 
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppChangeTransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/AppChangeTransitionTests.java
index 19ace3c..3bf884f 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AppChangeTransitionTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AppChangeTransitionTests.java
@@ -55,7 +55,7 @@
         mStack = createTaskStackOnDisplay(mDisplayContent);
         mTask = createTaskInStack(mStack, 0 /* userId */);
         mToken = WindowTestUtils.createTestAppWindowToken(mDisplayContent);
-        mToken.mSkipOnParentSet = false;
+        mToken.mSkipOnParentChanged = false;
 
         mTask.addChild(mToken, 0);
     }
diff --git a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java
index e3bacf9..67ee4ad 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java
@@ -395,8 +395,8 @@
     /**
      * Tests that home activities can be started on the displays that supports system decorations.
      */
-    // TODO (b/118206886): Will add it back once launcher's patch is merged into master.
-    private void testStartHomeOnAllDisplays() {
+    @Test
+    public void testStartHomeOnAllDisplays() {
         // Create secondary displays.
         final TestActivityDisplay secondDisplay = spy(createNewActivityDisplay());
         mRootActivityContainer.addChild(secondDisplay, POSITION_TOP);
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
index e156143..8628575 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
@@ -103,13 +103,13 @@
         assertEquals(secondLayer1, root.getChildAt(5));
         assertEquals(layer2, root.getChildAt(6));
 
-        assertTrue(layer1.mOnParentSetCalled);
-        assertTrue(secondLayer1.mOnParentSetCalled);
-        assertTrue(layer2.mOnParentSetCalled);
-        assertTrue(layerNeg1.mOnParentSetCalled);
-        assertTrue(layerNeg2.mOnParentSetCalled);
-        assertTrue(secondLayerNeg1.mOnParentSetCalled);
-        assertTrue(layer0.mOnParentSetCalled);
+        assertTrue(layer1.mOnParentChangedCalled);
+        assertTrue(secondLayer1.mOnParentChangedCalled);
+        assertTrue(layer2.mOnParentChangedCalled);
+        assertTrue(layerNeg1.mOnParentChangedCalled);
+        assertTrue(layerNeg2.mOnParentChangedCalled);
+        assertTrue(secondLayerNeg1.mOnParentChangedCalled);
+        assertTrue(layer0.mOnParentChangedCalled);
     }
 
     @Test
@@ -747,7 +747,7 @@
         private boolean mFillsParent;
         private Integer mOrientation;
 
-        private boolean mOnParentSetCalled;
+        private boolean mOnParentChangedCalled;
         private boolean mOnDescendantOverrideCalled;
 
         /**
@@ -801,8 +801,8 @@
         }
 
         @Override
-        void onParentSet() {
-            mOnParentSetCalled = true;
+        void onParentChanged() {
+            mOnParentChangedCalled = true;
         }
 
         @Override
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestUtils.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestUtils.java
index 2263cf3..a494889 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowTestUtils.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestUtils.java
@@ -152,7 +152,7 @@
     public static class TestAppWindowToken extends AppWindowToken {
         boolean mOnTop = false;
         private Transaction mPendingTransactionOverride;
-        boolean mSkipOnParentSet = true;
+        boolean mSkipOnParentChanged = true;
 
         private TestAppWindowToken(DisplayContent dc) {
             super(dc.mWmService, new IApplicationToken.Stub() {
@@ -200,9 +200,11 @@
         }
 
         @Override
-        void onParentSet() {
-            if (!mSkipOnParentSet) {
-                super.onParentSet();
+        void onParentChanged() {
+            if (!mSkipOnParentChanged) {
+                super.onParentChanged();
+            } else {
+                updateConfigurationFromParent(this);
             }
         }
 
@@ -223,6 +225,21 @@
         }
     }
 
+    /**
+     * Used when we don't want to perform surface related operation in
+     * {@link WindowContainer#onParentChanged} or the overridden method, but the configuration
+     * still needs to propagate from parent.
+     *
+     * @see ConfigurationContainer#onParentChanged
+     */
+    static void updateConfigurationFromParent(WindowContainer container) {
+        final WindowContainer parent = container.getParent();
+        if (parent != null) {
+            container.onConfigurationChanged(parent.getConfiguration());
+            container.onMergedOverrideConfigurationChanged();
+        }
+    }
+
     static TestWindowToken createTestWindowToken(int type, DisplayContent dc) {
         return createTestWindowToken(type, dc, false /* persistOnEmpty */);
     }
@@ -341,8 +358,8 @@
         }
 
         @Override
-        void onParentSet() {
-            // Do nothing;
+        void onParentChanged() {
+            updateConfigurationFromParent(this);
         }
     }
 }
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
index e38118e..3cb2814 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
@@ -91,6 +91,12 @@
     WindowState mChildAppWindowBelow;
     HashSet<WindowState> mCommonWindows;
 
+    /**
+     * To restore the original SurfaceControl.Transaction factory if any tests changed
+     * {@link WindowManagerService#mTransactionFactory}.
+     */
+    private TransactionFactory mOriginalTransactionFactory;
+
     @Rule
     public final DexmakerShareClassLoaderRule mDexmakerShareClassLoaderRule =
             new DexmakerShareClassLoaderRule();
@@ -121,6 +127,7 @@
             final Context context = getInstrumentation().getTargetContext();
 
             mWm = TestSystemServices.getWindowManagerService();
+            mOriginalTransactionFactory = mWm.mTransactionFactory;
             beforeCreateDisplay();
 
             context.getDisplay().getDisplayInfo(mDisplayInfo);
@@ -170,6 +177,7 @@
             // stable state to clean up for consistency.
             waitUntilHandlersIdle();
 
+            mWm.mTransactionFactory = mOriginalTransactionFactory;
             final LinkedList<WindowState> nonCommonWindows = new LinkedList<>();
 
             synchronized (mWm.mGlobalLock) {
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTraceBufferTest.java b/services/tests/wmtests/src/com/android/server/wm/WindowTraceBufferTest.java
index 8d83497..df3ef55 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowTraceBufferTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTraceBufferTest.java
@@ -19,8 +19,6 @@
 import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
 
 import static com.android.server.wm.WindowManagerTraceFileProto.MAGIC_NUMBER;
-import static com.android.server.wm.WindowManagerTraceFileProto.MAGIC_NUMBER_H;
-import static com.android.server.wm.WindowManagerTraceFileProto.MAGIC_NUMBER_L;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
@@ -31,13 +29,14 @@
 
 import androidx.test.filters.SmallTest;
 
+import com.android.internal.util.Preconditions;
+
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
 import java.io.File;
 import java.io.IOException;
-import java.util.Arrays;
 
 
 /**
@@ -49,8 +48,6 @@
 @SmallTest
 @Presubmit
 public class WindowTraceBufferTest {
-    private static final long MAGIC_NUMBER_VALUE = ((long) MAGIC_NUMBER_H << 32) | MAGIC_NUMBER_L;
-
     private File mFile;
 
     @Before
@@ -81,18 +78,22 @@
 
         buffer.add(toWrite1);
         assertTrue("First element should be in the list",
-                buffer.mBuffer.stream().anyMatch(p -> Arrays.equals(p, toWrite1Bytes)));
+                buffer.contains(toWrite1Bytes));
 
         buffer.add(toWrite2);
         assertTrue("First element should be in the list",
-                buffer.mBuffer.stream().anyMatch(p -> Arrays.equals(p, toWrite1Bytes)));
+                buffer.contains(toWrite1Bytes));
         assertTrue("Second element should be in the list",
-                buffer.mBuffer.stream().anyMatch(p -> Arrays.equals(p, toWrite2Bytes)));
+                buffer.contains(toWrite2Bytes));
 
         buffer.add(toWrite3);
 
+        assertTrue("First element should be in the list",
+                buffer.contains(toWrite1Bytes));
+        assertTrue("Second element should be in the list",
+                buffer.contains(toWrite2Bytes));
         assertTrue("Third element should not be in the list",
-                buffer.mBuffer.stream().noneMatch(p -> Arrays.equals(p, toWrite3Bytes)));
+                !buffer.contains(toWrite3Bytes));
 
         assertEquals("Buffer should have 2 elements", buffer.mBuffer.size(), 2);
         assertEquals(String.format("Buffer is full, used space should be %d", bufferCapacity),
@@ -101,6 +102,111 @@
                 buffer.getAvailableSpace(), 0);
     }
 
+    @Test
+    public void testTraceRingBuffer_addItem() throws Exception {
+        ProtoOutputStream toWrite = getDummy(1);
+        final int objectSize = toWrite.getBytes().length;
+
+        final WindowTraceBuffer buffer = buildRingBuffer(objectSize);
+
+        Preconditions.checkArgument(buffer.mBuffer.isEmpty());
+
+        buffer.add(toWrite);
+
+        assertEquals("Item was not added to the buffer", buffer.mBuffer.size(), 1);
+        assertEquals("Total buffer getSize differs from inserted object",
+                buffer.mBufferSize, objectSize);
+        assertEquals("Available buffer space does not match used one",
+                buffer.getAvailableSpace(), 0);
+    }
+
+    @Test
+    public void testTraceRingBuffer_addItemMustOverwriteOne() throws Exception {
+        ProtoOutputStream toWrite1 = getDummy(1);
+        ProtoOutputStream toWrite2 = getDummy(2);
+        ProtoOutputStream toWrite3 = getDummy(3);
+        byte[] toWrite1Bytes = toWrite1.getBytes();
+        byte[] toWrite2Bytes = toWrite2.getBytes();
+        byte[] toWrite3Bytes = toWrite3.getBytes();
+        final int objectSize = toWrite1.getBytes().length;
+
+        final int bufferCapacity = objectSize * 2 + 1;
+        final WindowTraceBuffer buffer = buildRingBuffer(bufferCapacity);
+
+        buffer.add(toWrite1);
+        assertTrue("First element should be in the list",
+                buffer.contains(toWrite1Bytes));
+
+        buffer.add(toWrite2);
+        assertTrue("First element should be in the list",
+                buffer.contains(toWrite1Bytes));
+        assertTrue("Second element should be in the list",
+                buffer.contains(toWrite2Bytes));
+
+        buffer.add(toWrite3);
+        assertTrue("First element should not be in the list",
+                !buffer.contains(toWrite1Bytes));
+        assertTrue("Second element should be in the list",
+                buffer.contains(toWrite2Bytes));
+        assertTrue("Third element should be in the list",
+                buffer.contains(toWrite3Bytes));
+        assertEquals("Buffer should have 2 elements", buffer.mBuffer.size(), 2);
+        assertEquals(String.format("Buffer is full, used space should be %d", bufferCapacity),
+                buffer.mBufferSize, bufferCapacity - 1);
+        assertEquals(" Buffer is full, available space should be 0",
+                buffer.getAvailableSpace(), 1);
+    }
+
+    @Test
+    public void testTraceRingBuffer_addItemMustOverwriteMultiple() throws Exception {
+        ProtoOutputStream toWriteSmall1 = getDummy(1);
+        ProtoOutputStream toWriteSmall2 = getDummy(2);
+        byte[] toWriteSmall1Bytes = toWriteSmall1.getBytes();
+        byte[] toWriteSmall2Bytes = toWriteSmall2.getBytes();
+        final int objectSize = toWriteSmall1.getBytes().length;
+
+        final int bufferCapacity = objectSize * 2;
+        final WindowTraceBuffer buffer = buildRingBuffer(bufferCapacity);
+
+        ProtoOutputStream toWriteBig = new ProtoOutputStream();
+        toWriteBig.write(MAGIC_NUMBER, 1);
+        toWriteBig.write(MAGIC_NUMBER, 2);
+        byte[] toWriteBigBytes = toWriteBig.getBytes();
+        toWriteBig.flush();
+
+        buffer.add(toWriteSmall1);
+        assertTrue("First element should be in the list",
+                buffer.contains(toWriteSmall1Bytes));
+
+        buffer.add(toWriteSmall2);
+        assertTrue("First element should be in the list",
+                buffer.contains(toWriteSmall1Bytes));
+        assertTrue("Second element should be in the list",
+                buffer.contains(toWriteSmall2Bytes));
+
+        buffer.add(toWriteBig);
+        assertTrue("Third element should overwrite all others",
+                !buffer.contains(toWriteSmall1Bytes));
+        assertTrue("Third element should overwrite all others",
+                !buffer.contains(toWriteSmall2Bytes));
+        assertTrue("Third element should overwrite all others",
+                buffer.contains(toWriteBigBytes));
+
+        assertEquals(" Buffer should have only 1 big element", buffer.mBuffer.size(), 1);
+        assertEquals(String.format(" Buffer is full, used space should be %d", bufferCapacity),
+                buffer.mBufferSize, bufferCapacity);
+        assertEquals(" Buffer is full, available space should be 0",
+                buffer.getAvailableSpace(), 0);
+    }
+
+    private WindowTraceBuffer buildRingBuffer(int capacity) throws IOException {
+        return new WindowTraceBuffer.Builder()
+                .setContinuousMode(true)
+                .setBufferCapacity(capacity)
+                .setTraceFile(mFile)
+                .build();
+    }
+
     private ProtoOutputStream getDummy(int value) {
         ProtoOutputStream toWrite = new ProtoOutputStream();
         toWrite.write(MAGIC_NUMBER, value);
diff --git a/services/usage/java/com/android/server/usage/AppTimeLimitController.java b/services/usage/java/com/android/server/usage/AppTimeLimitController.java
index fa472e2..873ada0 100644
--- a/services/usage/java/com/android/server/usage/AppTimeLimitController.java
+++ b/services/usage/java/com/android/server/usage/AppTimeLimitController.java
@@ -510,12 +510,9 @@
     }
 
     class AppUsageLimitGroup extends UsageGroup {
-        private boolean mGroupLimit;
-
         public AppUsageLimitGroup(UserData user, ObserverAppData observerApp, int observerId,
                 String[] observed, long timeLimitMs, PendingIntent limitReachedCallback) {
             super(user, observerApp, observerId, observed, timeLimitMs, limitReachedCallback);
-            mGroupLimit = observed.length > 1;
         }
 
         @Override
@@ -529,11 +526,6 @@
         }
 
         @GuardedBy("mLock")
-        boolean isGroupLimit() {
-            return mGroupLimit;
-        }
-
-        @GuardedBy("mLock")
         long getTotaUsageLimit() {
             return mTimeLimitMs;
         }
@@ -547,14 +539,6 @@
                 return mTimeLimitMs - mUsageTimeMs;
             }
         }
-
-        @Override
-        @GuardedBy("mLock")
-        void dump(PrintWriter pw) {
-            super.dump(pw);
-            pw.print(" groupLimit=");
-            pw.print(mGroupLimit);
-        }
     }
 
 
@@ -692,7 +676,7 @@
                     smallestGroup = otherGroup;
                 }
             }
-            return new UsageStatsManagerInternal.AppUsageLimitData(smallestGroup.isGroupLimit(),
+            return new UsageStatsManagerInternal.AppUsageLimitData(
                     smallestGroup.getTotaUsageLimit(), smallestGroup.getUsageRemaining());
         }
     }
diff --git a/services/usb/java/com/android/server/usb/UsbPortManager.java b/services/usb/java/com/android/server/usb/UsbPortManager.java
index 50e4faa..ae05750 100644
--- a/services/usb/java/com/android/server/usb/UsbPortManager.java
+++ b/services/usb/java/com/android/server/usb/UsbPortManager.java
@@ -41,11 +41,11 @@
 import android.hardware.usb.UsbManager;
 import android.hardware.usb.UsbPort;
 import android.hardware.usb.UsbPortStatus;
+import android.hardware.usb.V1_0.IUsb;
 import android.hardware.usb.V1_0.PortRole;
 import android.hardware.usb.V1_0.PortRoleType;
 import android.hardware.usb.V1_0.Status;
 import android.hardware.usb.V1_1.PortStatus_1_1;
-import android.hardware.usb.V1_2.IUsb;
 import android.hardware.usb.V1_2.IUsbCallback;
 import android.hardware.usb.V1_2.PortStatus;
 import android.hidl.manager.V1_0.IServiceManager;
@@ -320,9 +320,12 @@
 
         try {
             // Oneway call into the hal
-            mProxy.enableContaminantPresenceDetection(portId, enable);
+            android.hardware.usb.V1_2.IUsb proxy = (android.hardware.usb.V1_2.IUsb) mProxy;
+            proxy.enableContaminantPresenceDetection(portId, enable);
         } catch (RemoteException e) {
-            logAndPrintException(null, "Failed to set contaminant detection", e);
+            logAndPrintException(pw, "Failed to set contaminant detection", e);
+        } catch (ClassCastException e) {
+            logAndPrintException(pw, "Method only applicable to V1.2 or above implementation", e);
         }
     }
 
diff --git a/startop/iorap/TEST_MAPPING b/startop/iorap/DISABLED_TEST_MAPPING
similarity index 100%
rename from startop/iorap/TEST_MAPPING
rename to startop/iorap/DISABLED_TEST_MAPPING
diff --git a/startop/iorap/src/com/google/android/startop/iorap/IorapForwardingService.java b/startop/iorap/src/com/google/android/startop/iorap/IorapForwardingService.java
index 9a30b35..22fc159 100644
--- a/startop/iorap/src/com/google/android/startop/iorap/IorapForwardingService.java
+++ b/startop/iorap/src/com/google/android/startop/iorap/IorapForwardingService.java
@@ -50,8 +50,8 @@
     public static final String TAG = "IorapForwardingService";
     /** $> adb shell 'setprop log.tag.IorapdForwardingService VERBOSE' */
     public static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-    /** $> adb shell 'setprop iorapd.enable true' */
-    private static boolean IS_ENABLED = SystemProperties.getBoolean("iorapd.enable", true);
+    /** $> adb shell 'setprop ro.iorapd.enable true' */
+    private static boolean IS_ENABLED = SystemProperties.getBoolean("ro.iorapd.enable", true);
     /** $> adb shell 'setprop iorapd.forwarding_service.wtf_crash true' */
     private static boolean WTF_CRASH = SystemProperties.getBoolean(
             "iorapd.forwarding_service.wtf_crash", false);
diff --git a/startop/iorap/tests/Android.mk b/startop/iorap/tests/Android.mk
index 1b2aa46..fa8c8b5 100644
--- a/startop/iorap/tests/Android.mk
+++ b/startop/iorap/tests/Android.mk
@@ -43,4 +43,7 @@
 LOCAL_CERTIFICATE := platform
 LOCAL_PRIVATE_PLATFORM_APIS := true
 
+# Disable presubmit test until it works with disabled iorap by default.
+LOCAL_PRESUBMIT_DISABLED := true
+
 include $(BUILD_PACKAGE)
diff --git a/startop/view_compiler/Android.bp b/startop/view_compiler/Android.bp
index 7dc83c3..f5b4308 100644
--- a/startop/view_compiler/Android.bp
+++ b/startop/view_compiler/Android.bp
@@ -16,12 +16,12 @@
 
 cc_defaults {
     name: "viewcompiler_defaults",
+    defaults: ["libdexfile_static_defaults"],
     header_libs: [
         "libbase_headers",
     ],
     shared_libs: [
         "libbase",
-        "libdexfile",
         "libz",
         "slicer",
     ],
diff --git a/startop/view_compiler/TEST_MAPPING b/startop/view_compiler/TEST_MAPPING
index 7006075..5f7d3f9 100644
--- a/startop/view_compiler/TEST_MAPPING
+++ b/startop/view_compiler/TEST_MAPPING
@@ -4,6 +4,14 @@
       "name": "dex-builder-test"
     },
     {
+      "name": "CtsViewTestCases",
+      "options": [
+        {
+          "include-filter": "android.view.cts.PrecompiledLayoutTest"
+        }
+      ]
+    },
+    {
       "name": "view-compiler-tests",
       "host": true
     }
diff --git a/telecomm/java/android/telecom/DefaultDialerManager.java b/telecomm/java/android/telecom/DefaultDialerManager.java
index 2680af7..ef78ea5 100644
--- a/telecomm/java/android/telecom/DefaultDialerManager.java
+++ b/telecomm/java/android/telecom/DefaultDialerManager.java
@@ -15,17 +15,23 @@
 package android.telecom;
 
 import android.app.ActivityManager;
+import android.app.role.RoleManager;
+import android.app.role.RoleManagerCallback;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
 import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Binder;
 import android.os.Process;
 import android.os.UserHandle;
-import android.provider.Settings;
 import android.text.TextUtils;
 
+import com.android.internal.util.CollectionUtils;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -64,25 +70,24 @@
      * */
     public static boolean setDefaultDialerApplication(Context context, String packageName,
             int user) {
-        // Get old package name
-        String oldPackageName = Settings.Secure.getStringForUser(context.getContentResolver(),
-                Settings.Secure.DIALER_DEFAULT_APPLICATION, user);
+        long identity = Binder.clearCallingIdentity();
+        try {
+            context.getSystemService(RoleManager.class).addRoleHolderAsUser(
+                    RoleManager.ROLE_DIALER, packageName, UserHandle.of(user),
+                    AsyncTask.THREAD_POOL_EXECUTOR, new RoleManagerCallback() {
+                        @Override
+                        public void onSuccess() {}
 
-        if (packageName != null && oldPackageName != null && packageName.equals(oldPackageName)) {
-            // No change
-            return false;
-        }
-
-        // Only make the change if the new package belongs to a valid phone application
-        List<String> packageNames = getInstalledDialerApplications(context, user);
-
-        if (packageNames.contains(packageName)) {
-            // Update the secure setting.
-            Settings.Secure.putStringForUser(context.getContentResolver(),
-                    Settings.Secure.DIALER_DEFAULT_APPLICATION, packageName, user);
+                        @Override
+                        public void onFailure() {
+                            Log.w(TAG, "Failed to set default dialer to %s for user %s",
+                                    packageName, user);
+                        }
+                    });
             return true;
+        } finally {
+            Binder.restoreCallingIdentity(identity);
         }
-        return false;
     }
 
     /**
@@ -116,28 +121,12 @@
      * @hide
      * */
     public static String getDefaultDialerApplication(Context context, int user) {
-        String defaultPackageName = Settings.Secure.getStringForUser(context.getContentResolver(),
-                Settings.Secure.DIALER_DEFAULT_APPLICATION, user);
-
-        final List<String> packageNames = getInstalledDialerApplications(context, user);
-
-        // Verify that the default dialer has not been disabled or uninstalled.
-        if (packageNames.contains(defaultPackageName)) {
-            return defaultPackageName;
-        }
-
-        // No user-set dialer found, fallback to system dialer
-        String systemDialerPackageName = getTelecomManager(context).getSystemDialerPackage();
-
-        if (TextUtils.isEmpty(systemDialerPackageName)) {
-            // No system dialer configured at build time
-            return null;
-        }
-
-        if (packageNames.contains(systemDialerPackageName)) {
-            return systemDialerPackageName;
-        } else {
-            return null;
+        long identity = Binder.clearCallingIdentity();
+        try {
+            return CollectionUtils.firstOrNull(context.getSystemService(RoleManager.class)
+                    .getRoleHoldersAsUser(RoleManager.ROLE_DIALER, UserHandle.of(user)));
+        } finally {
+            Binder.restoreCallingIdentity(identity);
         }
     }
 
@@ -174,7 +163,9 @@
 
         final Intent dialIntentWithTelScheme = new Intent(Intent.ACTION_DIAL);
         dialIntentWithTelScheme.setData(Uri.fromParts(PhoneAccount.SCHEME_TEL, "", null));
-        return filterByIntent(context, packageNames, dialIntentWithTelScheme, userId);
+        packageNames = filterByIntent(context, packageNames, dialIntentWithTelScheme, userId);
+        packageNames = requireInCallService(packageNames, userId, context);
+        return packageNames;
     }
 
     public static List<String> getInstalledDialerApplications(Context context) {
@@ -232,6 +223,35 @@
         return result;
     }
 
+    private static List<String> requireInCallService(List<String> packageNames, int userId,
+            Context context) {
+        if (packageNames == null || packageNames.isEmpty()) {
+            return new ArrayList<>();
+        }
+
+        final Intent intent = new Intent(InCallService.SERVICE_INTERFACE);
+        final List<ResolveInfo> resolveInfoList = context.getPackageManager()
+                .queryIntentServicesAsUser(intent, PackageManager.GET_META_DATA, userId);
+        final List<String> result = new ArrayList<>();
+        final int length = resolveInfoList.size();
+        for (int i = 0; i < length; i++) {
+            final ServiceInfo info = resolveInfoList.get(i).serviceInfo;
+            if (info == null || info.metaData == null) {
+                continue;
+            }
+            if (!info.metaData.getBoolean(TelecomManager.METADATA_IN_CALL_SERVICE_UI)) {
+                continue;
+            }
+            if (info.metaData.getBoolean(TelecomManager.METADATA_IN_CALL_SERVICE_CAR_MODE_UI)) {
+                continue;
+            }
+            if (packageNames.contains(info.packageName) && !result.contains(info.packageName)) {
+                result.add(info.packageName);
+            }
+        }
+
+        return result;
+    }
 
     private static TelecomManager getTelecomManager(Context context) {
         return (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
diff --git a/telecomm/java/android/telecom/VideoProfile.java b/telecomm/java/android/telecom/VideoProfile.java
index 7b23061..157f12c 100644
--- a/telecomm/java/android/telecom/VideoProfile.java
+++ b/telecomm/java/android/telecom/VideoProfile.java
@@ -16,7 +16,9 @@
 
 package android.telecom;
 
+import android.annotation.FloatRange;
 import android.annotation.IntDef;
+import android.annotation.IntRange;
 import android.annotation.UnsupportedAppUsage;
 import android.os.Parcel;
 import android.os.Parcelable;
@@ -364,7 +366,7 @@
          * @param width The width of the camera video (in pixels).
          * @param height The height of the camera video (in pixels).
          */
-        public CameraCapabilities(int width, int height) {
+        public CameraCapabilities(@IntRange(from = 0) int width, @IntRange(from = 0) int height) {
             this(width, height, false, 1.0f);
         }
 
@@ -376,7 +378,8 @@
          * @param zoomSupported True when camera supports zoom.
          * @param maxZoom Maximum zoom supported by camera.
          */
-        public CameraCapabilities(int width, int height, boolean zoomSupported, float maxZoom) {
+        public CameraCapabilities(@IntRange(from = 0) int width,  @IntRange(from = 0) int height,
+                                   boolean zoomSupported,  @FloatRange(from = 1.0f) float maxZoom) {
             mWidth = width;
             mHeight = height;
             mZoomSupported = zoomSupported;
diff --git a/telephony/java/android/telephony/CallAttributes.java b/telephony/java/android/telephony/CallAttributes.java
index 2d29875..a4cce9c 100644
--- a/telephony/java/android/telephony/CallAttributes.java
+++ b/telephony/java/android/telephony/CallAttributes.java
@@ -50,10 +50,9 @@
     }
 
     private CallAttributes(Parcel in) {
-        mPreciseCallState = (PreciseCallState)
-                in.readValue(PreciseCallState.class.getClassLoader());
-        mNetworkType = in.readInt();
-        mCallQuality = (CallQuality) in.readValue(CallQuality.class.getClassLoader());
+        this.mPreciseCallState = in.readParcelable(PreciseCallState.class.getClassLoader());
+        this.mNetworkType = in.readInt();
+        this.mCallQuality = in.readParcelable(CallQuality.class.getClassLoader());
     }
 
     // getters
@@ -134,9 +133,9 @@
      * {@link Parcelable#writeToParcel}
      */
     public void writeToParcel(Parcel dest, @Parcelable.WriteFlags int flags) {
-        mPreciseCallState.writeToParcel(dest, flags);
+        dest.writeParcelable(mPreciseCallState, flags);
         dest.writeInt(mNetworkType);
-        mCallQuality.writeToParcel(dest, flags);
+        dest.writeParcelable(mCallQuality, flags);
     }
 
     public static final Parcelable.Creator<CallAttributes> CREATOR = new Parcelable.Creator() {
diff --git a/telephony/java/android/telephony/CallQuality.java b/telephony/java/android/telephony/CallQuality.java
index b27f6b4..cbe62284 100644
--- a/telephony/java/android/telephony/CallQuality.java
+++ b/telephony/java/android/telephony/CallQuality.java
@@ -92,6 +92,10 @@
         mCodecType = in.readInt();
     }
 
+    /** @hide **/
+    public CallQuality() {
+    }
+
     /**
      * Constructor.
      *
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 349880d..068b68e 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -2424,34 +2424,55 @@
             "5g_icon_configuration_string";
 
     /**
-     * Controls RSRP threshold at which AlternativeNetworkService will decide whether
+     * Controls RSRP threshold at which OpportunisticNetworkService will decide whether
      * the opportunistic network is good enough for internet data.
      */
     public static final String KEY_OPPORTUNISTIC_NETWORK_ENTRY_THRESHOLD_RSRP_INT =
             "opportunistic_network_entry_threshold_rsrp_int";
 
     /**
-     * Controls RSSNR threshold at which AlternativeNetworkService will decide whether
+     * Controls RSSNR threshold at which OpportunisticNetworkService will decide whether
      * the opportunistic network is good enough for internet data.
      */
     public static final String KEY_OPPORTUNISTIC_NETWORK_ENTRY_THRESHOLD_RSSNR_INT =
             "opportunistic_network_entry_threshold_rssnr_int";
 
     /**
-     * Controls RSRP threshold below which AlternativeNetworkService will decide whether
+     * Controls RSRP threshold below which OpportunisticNetworkService will decide whether
      * the opportunistic network available is not good enough for internet data.
      */
     public static final String KEY_OPPORTUNISTIC_NETWORK_EXIT_THRESHOLD_RSRP_INT =
             "opportunistic_network_exit_threshold_rsrp_int";
 
     /**
-     * Controls RSSNR threshold below which AlternativeNetworkService will decide whether
+     * Controls RSSNR threshold below which OpportunisticNetworkService will decide whether
      * the opportunistic network available is not good enough for internet data.
      */
     public static final String KEY_OPPORTUNISTIC_NETWORK_EXIT_THRESHOLD_RSSNR_INT =
             "opportunistic_network_exit_threshold_rssnr_int";
 
     /**
+     * Controls bandwidth threshold in Kbps at which OpportunisticNetworkService will decide whether
+     * the opportunistic network is good enough for internet data.
+     */
+    public static final String KEY_OPPORTUNISTIC_NETWORK_ENTRY_THRESHOLD_BANDWIDTH_INT =
+            "opportunistic_network_entry_threshold_bandwidth_int";
+
+    /**
+     * Controls hysteresis time in milli seconds for which OpportunisticNetworkService
+     * will wait before attaching to a network.
+     */
+    public static final String KEY_OPPORTUNISTIC_NETWORK_ENTRY_OR_EXIT_HYSTERESIS_TIME_LONG =
+            "opportunistic_network_entry_or_exit_hysteresis_time_long";
+
+    /**
+     * Controls hysteresis time in milli seconds for which OpportunisticNetworkService
+     * will wait before switching data to a network.
+     */
+    public static final String KEY_OPPORTUNISTIC_NETWORK_DATA_SWITCH_HYSTERESIS_TIME_LONG =
+            "opportunistic_network_data_switch_hysteresis_time_long";
+
+    /**
      * GPS configs. See android.hardware.gnss@1.0 IGnssConfiguration.
      * @hide
      */
@@ -2938,6 +2959,12 @@
         sDefaults.putInt(KEY_OPPORTUNISTIC_NETWORK_ENTRY_THRESHOLD_RSSNR_INT, 45);
         /* Default value is minimum RSSNR level needed for SIGNAL_STRENGTH_MODERATE */
         sDefaults.putInt(KEY_OPPORTUNISTIC_NETWORK_EXIT_THRESHOLD_RSSNR_INT, 10);
+        /* Default value is 1024 kbps */
+        sDefaults.putInt(KEY_OPPORTUNISTIC_NETWORK_ENTRY_THRESHOLD_BANDWIDTH_INT, 1024);
+        /* Default value is 10 seconds */
+        sDefaults.putInt(KEY_OPPORTUNISTIC_NETWORK_ENTRY_OR_EXIT_HYSTERESIS_TIME_LONG, 10000);
+        /* Default value is 10 seconds. */
+        sDefaults.putInt(KEY_OPPORTUNISTIC_NETWORK_DATA_SWITCH_HYSTERESIS_TIME_LONG, 10000);
         sDefaults.putAll(Gps.getDefaults());
     }
 
diff --git a/telephony/java/android/telephony/NetworkService.java b/telephony/java/android/telephony/NetworkService.java
index 4bca404..6c45cc4 100644
--- a/telephony/java/android/telephony/NetworkService.java
+++ b/telephony/java/android/telephony/NetworkService.java
@@ -16,6 +16,7 @@
 
 package android.telephony;
 
+import android.annotation.NonNull;
 import android.annotation.SystemApi;
 import android.app.Service;
 import android.content.Intent;
@@ -112,13 +113,13 @@
                     mSlotId, 0, null).sendToTarget();
         }
 
-        private void registerForStateChanged(INetworkServiceCallback callback) {
+        private void registerForStateChanged(@NonNull INetworkServiceCallback callback) {
             synchronized (mNetworkRegistrationStateChangedCallbacks) {
                 mNetworkRegistrationStateChangedCallbacks.add(callback);
             }
         }
 
-        private void unregisterForStateChanged(INetworkServiceCallback callback) {
+        private void unregisterForStateChanged(@NonNull INetworkServiceCallback callback) {
             synchronized (mNetworkRegistrationStateChangedCallbacks) {
                 mNetworkRegistrationStateChangedCallbacks.remove(callback);
             }
diff --git a/telephony/java/android/telephony/PhoneCapability.java b/telephony/java/android/telephony/PhoneCapability.java
index 2ebfa53..21dad77 100644
--- a/telephony/java/android/telephony/PhoneCapability.java
+++ b/telephony/java/android/telephony/PhoneCapability.java
@@ -33,15 +33,17 @@
     public final int maxActiveVoiceCalls;
     public final int maxActiveData;
     public final int max5G;
+    public final boolean validationBeforeSwitchSupported;
     public final List<ModemInfo> logicalModemList;
 
     public PhoneCapability(int maxActiveVoiceCalls, int maxActiveData, int max5G,
-            List<ModemInfo> logicalModemList) {
+            List<ModemInfo> logicalModemList, boolean validationBeforeSwitchSupported) {
         this.maxActiveVoiceCalls = maxActiveVoiceCalls;
         this.maxActiveData = maxActiveData;
         this.max5G = max5G;
         // Make sure it's not null.
         this.logicalModemList = logicalModemList == null ? new ArrayList<>() : logicalModemList;
+        this.validationBeforeSwitchSupported = validationBeforeSwitchSupported;
     }
 
     @Override
@@ -55,13 +57,15 @@
         maxActiveVoiceCalls = in.readInt();
         maxActiveData = in.readInt();
         max5G = in.readInt();
+        validationBeforeSwitchSupported = in.readBoolean();
         logicalModemList = new ArrayList<>();
         in.readList(logicalModemList, ModemInfo.class.getClassLoader());
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(maxActiveVoiceCalls, maxActiveData, max5G, logicalModemList);
+        return Objects.hash(maxActiveVoiceCalls, maxActiveData, max5G, logicalModemList,
+                validationBeforeSwitchSupported);
     }
 
     @Override
@@ -79,6 +83,7 @@
         return (maxActiveVoiceCalls == s.maxActiveVoiceCalls
                 && maxActiveData == s.maxActiveData
                 && max5G == s.max5G
+                && validationBeforeSwitchSupported == s.validationBeforeSwitchSupported
                 && logicalModemList.equals(s.logicalModemList));
     }
 
@@ -96,6 +101,7 @@
         dest.writeInt(maxActiveVoiceCalls);
         dest.writeInt(maxActiveData);
         dest.writeInt(max5G);
+        dest.writeBoolean(validationBeforeSwitchSupported);
         dest.writeList(logicalModemList);
     }
 
diff --git a/telephony/java/android/telephony/PhoneStateListener.java b/telephony/java/android/telephony/PhoneStateListener.java
index 9fee593..fea1b7b 100644
--- a/telephony/java/android/telephony/PhoneStateListener.java
+++ b/telephony/java/android/telephony/PhoneStateListener.java
@@ -28,6 +28,7 @@
 import android.os.HandlerExecutor;
 import android.os.Looper;
 import android.telephony.emergency.EmergencyNumber;
+import android.telephony.ims.ImsReasonInfo;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.telephony.IPhoneStateListener;
@@ -347,6 +348,20 @@
     @SystemApi
     public static final int LISTEN_CALL_ATTRIBUTES_CHANGED                 = 0x04000000;
 
+    /**
+     * Listen for IMS call disconnect causes which contains
+     * {@link android.telephony.ims.ImsReasonInfo}
+     *
+     * {@more}
+     * Requires Permission: {@link android.Manifest.permission#READ_PRECISE_PHONE_STATE
+     * READ_PRECISE_PHONE_STATE}
+     *
+     * @see #onImsCallDisconnectCauseChanged(ImsReasonInfo)
+     * @hide
+     */
+    @SystemApi
+    public static final int LISTEN_IMS_CALL_DISCONNECT_CAUSES              = 0x08000000;
+
     /*
      * Subscription used to listen to the phone state changes
      * @hide
@@ -578,6 +593,17 @@
     }
 
     /**
+     * Callback invoked when Ims call disconnect cause changes.
+     * @param imsReasonInfo {@link ImsReasonInfo} contains details on why IMS call failed.
+     *
+     * @hide
+     */
+    @SystemApi
+    public void onImsCallDisconnectCauseChanged(@NonNull ImsReasonInfo imsReasonInfo) {
+        // default implementation empty
+    }
+
+    /**
      * Callback invoked when data connection state changes with precise information.
      * @param dataConnectionState {@link PreciseDataConnectionState}
      *
@@ -701,7 +727,7 @@
      * @hide
      */
     @SystemApi
-    public void onCallAttributesChanged(CallAttributes callAttributes) {
+    public void onCallAttributesChanged(@NonNull CallAttributes callAttributes) {
         // default implementation empty
     }
 
@@ -981,6 +1007,16 @@
             Binder.withCleanCallingIdentity(
                     () -> mExecutor.execute(() -> psl.onPreferredDataSubIdChanged(subId)));
         }
+
+        public void onImsCallDisconnectCauseChanged(ImsReasonInfo disconnectCause) {
+            PhoneStateListener psl = mPhoneStateListenerWeakRef.get();
+            if (psl == null) return;
+
+            Binder.withCleanCallingIdentity(
+                    () -> mExecutor.execute(
+                            () -> psl.onImsCallDisconnectCauseChanged(disconnectCause)));
+
+        }
     }
 
 
diff --git a/telephony/java/android/telephony/RadioAccessFamily.java b/telephony/java/android/telephony/RadioAccessFamily.java
index 0d94c4d..c1786be 100644
--- a/telephony/java/android/telephony/RadioAccessFamily.java
+++ b/telephony/java/android/telephony/RadioAccessFamily.java
@@ -17,12 +17,15 @@
 package android.telephony;
 
 import android.annotation.UnsupportedAppUsage;
+import android.hardware.radio.V1_0.RadioTechnology;
+import android.hardware.radio.V1_4.CellInfo.Info;
 import android.os.Build;
 import android.os.Parcel;
 import android.os.Parcelable;
 
 import com.android.internal.telephony.RILConstants;
 
+
 /**
  * Object to indicate the phone radio type and access technology.
  *
@@ -33,32 +36,34 @@
     /**
      * TODO: get rid of RAF definition in RadioAccessFamily and
      * use {@link TelephonyManager.NetworkTypeBitMask}
+     * TODO: public definition {@link TelephonyManager.NetworkTypeBitMask} is long.
+     * TODO: Convert from int to long everywhere including HAL definitions.
      */
     // 2G
-    public static final int RAF_UNKNOWN = TelephonyManager.NETWORK_TYPE_BITMASK_UNKNOWN;
-    public static final int RAF_GSM = TelephonyManager.NETWORK_TYPE_BITMASK_GSM;
-    public static final int RAF_GPRS = TelephonyManager.NETWORK_TYPE_BITMASK_GPRS;
-    public static final int RAF_EDGE = TelephonyManager.NETWORK_TYPE_BITMASK_EDGE;
-    public static final int RAF_IS95A = TelephonyManager.NETWORK_TYPE_BITMASK_CDMA;
-    public static final int RAF_IS95B = TelephonyManager.NETWORK_TYPE_BITMASK_CDMA;
-    public static final int RAF_1xRTT = TelephonyManager.NETWORK_TYPE_BITMASK_1xRTT;
+    public static final int RAF_UNKNOWN = (int) TelephonyManager.NETWORK_TYPE_BITMASK_UNKNOWN;
+    public static final int RAF_GSM = (int) TelephonyManager.NETWORK_TYPE_BITMASK_GSM;
+    public static final int RAF_GPRS = (int) TelephonyManager.NETWORK_TYPE_BITMASK_GPRS;
+    public static final int RAF_EDGE = (int) TelephonyManager.NETWORK_TYPE_BITMASK_EDGE;
+    public static final int RAF_IS95A = (int) TelephonyManager.NETWORK_TYPE_BITMASK_CDMA;
+    public static final int RAF_IS95B = (int) TelephonyManager.NETWORK_TYPE_BITMASK_CDMA;
+    public static final int RAF_1xRTT = (int) TelephonyManager.NETWORK_TYPE_BITMASK_1xRTT;
     // 3G
-    public static final int RAF_EVDO_0 = TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_0;
-    public static final int RAF_EVDO_A = TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_A;
-    public static final int RAF_EVDO_B = TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_B;
-    public static final int RAF_EHRPD = TelephonyManager.NETWORK_TYPE_BITMASK_EHRPD;
-    public static final int RAF_HSUPA = TelephonyManager.NETWORK_TYPE_BITMASK_HSUPA;
-    public static final int RAF_HSDPA = TelephonyManager.NETWORK_TYPE_BITMASK_HSDPA;
-    public static final int RAF_HSPA = TelephonyManager.NETWORK_TYPE_BITMASK_HSPA;
-    public static final int RAF_HSPAP = TelephonyManager.NETWORK_TYPE_BITMASK_HSPAP;
-    public static final int RAF_UMTS = TelephonyManager.NETWORK_TYPE_BITMASK_UMTS;
-    public static final int RAF_TD_SCDMA = TelephonyManager.NETWORK_TYPE_BITMASK_TD_SCDMA;
+    public static final int RAF_EVDO_0 = (int) TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_0;
+    public static final int RAF_EVDO_A = (int) TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_A;
+    public static final int RAF_EVDO_B = (int) TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_B;
+    public static final int RAF_EHRPD = (int) TelephonyManager.NETWORK_TYPE_BITMASK_EHRPD;
+    public static final int RAF_HSUPA = (int) TelephonyManager.NETWORK_TYPE_BITMASK_HSUPA;
+    public static final int RAF_HSDPA = (int) TelephonyManager.NETWORK_TYPE_BITMASK_HSDPA;
+    public static final int RAF_HSPA = (int) TelephonyManager.NETWORK_TYPE_BITMASK_HSPA;
+    public static final int RAF_HSPAP = (int) TelephonyManager.NETWORK_TYPE_BITMASK_HSPAP;
+    public static final int RAF_UMTS = (int) TelephonyManager.NETWORK_TYPE_BITMASK_UMTS;
+    public static final int RAF_TD_SCDMA = (int) TelephonyManager.NETWORK_TYPE_BITMASK_TD_SCDMA;
     // 4G
-    public static final int RAF_LTE = TelephonyManager.NETWORK_TYPE_BITMASK_LTE;
-    public static final int RAF_LTE_CA = TelephonyManager.NETWORK_TYPE_BITMASK_LTE_CA;
+    public static final int RAF_LTE = (int) TelephonyManager.NETWORK_TYPE_BITMASK_LTE;
+    public static final int RAF_LTE_CA = (int) TelephonyManager.NETWORK_TYPE_BITMASK_LTE_CA;
 
     // 5G
-    public static final int RAF_NR = TelephonyManager.NETWORK_TYPE_BITMASK_NR;
+    public static final int RAF_NR = (int) TelephonyManager.NETWORK_TYPE_BITMASK_NR;
 
     // Grouping of RAFs
     // 2G
@@ -147,20 +152,20 @@
     /**
      * Implement the Parcelable interface.
      */
-    public static final Creator<RadioAccessFamily> CREATOR =
-            new Creator<RadioAccessFamily>() {
+    public static final Creator<android.telephony.RadioAccessFamily> CREATOR =
+            new Creator<android.telephony.RadioAccessFamily>() {
 
         @Override
-        public RadioAccessFamily createFromParcel(Parcel in) {
+        public android.telephony.RadioAccessFamily createFromParcel(Parcel in) {
             int phoneId = in.readInt();
             int radioAccessFamily = in.readInt();
 
-            return new RadioAccessFamily(phoneId, radioAccessFamily);
+            return new android.telephony.RadioAccessFamily(phoneId, radioAccessFamily);
         }
 
         @Override
-        public RadioAccessFamily[] newArray(int size) {
-            return new RadioAccessFamily[size];
+        public android.telephony.RadioAccessFamily[] newArray(int size) {
+            return new android.telephony.RadioAccessFamily[size];
         }
     };
 
@@ -391,76 +396,78 @@
     }
 
     /**
-     * convert RAF from {@link ServiceState.RilRadioTechnology} bitmask to
+     * convert RAF from {@link android.hardware.radio.V1_0.RadioAccessFamily} to
      * {@link TelephonyManager.NetworkTypeBitMask}, the bitmask represented by
-     * {@link TelephonyManager.NetworkType}. Reasons are {@link TelephonyManager.NetworkType} are
-     * public while {@link ServiceState.RilRadioTechnology} are hidden. We
-     * don't want to expose two sets of definition to public.
+     * {@link TelephonyManager.NetworkType}.
      *
-     * @param raf bitmask represented by {@link ServiceState.RilRadioTechnology}
+     * @param raf {@link android.hardware.radio.V1_0.RadioAccessFamily}
      * @return {@link TelephonyManager.NetworkTypeBitMask}
      */
     public static int convertToNetworkTypeBitMask(int raf) {
         int networkTypeRaf = 0;
 
-        if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_GSM)) != 0) {
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.GSM) != 0) {
             networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_GSM;
         }
-        if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_GPRS)) != 0) {
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.GPRS) != 0) {
             networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_GPRS;
         }
-        if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EDGE)) != 0) {
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EDGE) != 0) {
             networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EDGE;
         }
         // convert both IS95A/IS95B to CDMA as network mode doesn't support CDMA
-        if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_IS95A)) != 0) {
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.IS95A) != 0) {
             networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_CDMA;
         }
-        if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_IS95B)) != 0) {
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.IS95B) != 0) {
             networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_CDMA;
         }
-        if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT)) != 0) {
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.ONE_X_RTT) != 0) {
             networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_1xRTT;
         }
-        if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0)) != 0) {
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EVDO_0) != 0) {
             networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_0;
         }
-        if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A)) != 0) {
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EVDO_A) != 0) {
             networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_A;
         }
-        if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B)) != 0) {
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EVDO_B) != 0) {
             networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_B;
         }
-        if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD)) != 0) {
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EHRPD) != 0) {
             networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EHRPD;
         }
-        if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA)) != 0) {
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.HSUPA) != 0) {
             networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSUPA;
         }
-        if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA)) != 0) {
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.HSDPA) != 0) {
             networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSDPA;
         }
-        if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSPA)) != 0) {
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.HSPA) != 0) {
             networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSPA;
         }
-        if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP)) != 0) {
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.HSPAP) != 0) {
             networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSPAP;
         }
-        if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_UMTS)) != 0) {
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.UMTS) != 0) {
             networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_UMTS;
         }
-        if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_TD_SCDMA)) != 0) {
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.TD_SCDMA) != 0) {
             networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_TD_SCDMA;
         }
-        if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_LTE)) != 0) {
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.LTE) != 0) {
             networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_LTE;
         }
-        if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_LTE_CA)) != 0) {
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.LTE_CA) != 0) {
             networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_LTE_CA;
         }
-        if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_NR)) != 0) {
+        if ((raf & android.hardware.radio.V1_4.RadioAccessFamily.NR) != 0) {
             networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_NR;
         }
+        // TODO: need hal definition
+        if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN)) != 0) {
+            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_IWLAN;
+        }
 
         return (networkTypeRaf == 0) ? TelephonyManager.NETWORK_TYPE_UNKNOWN : networkTypeRaf;
     }
diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java
index 4475630..3317876 100644
--- a/telephony/java/android/telephony/ServiceState.java
+++ b/telephony/java/android/telephony/ServiceState.java
@@ -540,7 +540,7 @@
      *
      * @hide
      */
-    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
+    @UnsupportedAppUsage
     public int getDataRegState() {
         return mDataRegState;
     }
diff --git a/telephony/java/android/telephony/SubscriptionInfo.java b/telephony/java/android/telephony/SubscriptionInfo.java
index a3b3374..17acf2b 100644
--- a/telephony/java/android/telephony/SubscriptionInfo.java
+++ b/telephony/java/android/telephony/SubscriptionInfo.java
@@ -578,10 +578,10 @@
     }
 
     /**
-     * @return the cardId of the SIM card which contains the subscription.
-     * @hide
+     * Returns the card ID of the SIM card which contains the subscription (see
+     * {@link UiccCardInfo#getCardId()}.
+     * @return the cardId
      */
-    @SystemApi
     public int getCardId() {
         return this.mCardId;
     }
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index 869cf1c..dfe36ef 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -2577,8 +2577,14 @@
     @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
     public void setPreferredDataSubscriptionId(int subId) {
         if (VDBG) logd("[setPreferredDataSubscriptionId]+ subId:" + subId);
-        setSubscriptionPropertyHelper(DEFAULT_SUBSCRIPTION_ID, "setPreferredDataSubscriptionId",
-                (iSub)-> iSub.setPreferredDataSubscriptionId(subId));
+        try {
+            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
+            if (iSub != null) {
+                iSub.setPreferredDataSubscriptionId(subId);
+            }
+        } catch (RemoteException ex) {
+            // ignore it
+        }
     }
 
     /**
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 80ee0a7..7c3bde4 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -23,6 +23,7 @@
 import android.Manifest;
 import android.annotation.CallbackExecutor;
 import android.annotation.IntDef;
+import android.annotation.LongDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.RequiresPermission;
@@ -71,6 +72,7 @@
 import android.telephony.ims.stub.ImsRegistrationImplBase;
 import android.text.TextUtils;
 import android.util.Log;
+import android.util.Pair;
 
 import com.android.ims.internal.IImsServiceFeatureCallback;
 import com.android.internal.annotations.VisibleForTesting;
@@ -227,10 +229,9 @@
     public static final int SRVCC_STATE_HANDOVER_CANCELED  = 3;
 
     /**
-     * An invalid card identifier.
-     * @hide
+     * An invalid UICC card identifier. See {@link #getCardIdForDefaultEuicc()} and
+     * {@link UiccCardInfo#getCardId()}.
      */
-    @SystemApi
     public static final int INVALID_CARD_ID = -1;
 
     /** @hide */
@@ -350,32 +351,20 @@
      * Returns 0 if none of voice, sms, data is not supported
      * Returns 1 for Single standby mode (Single SIM functionality)
      * Returns 2 for Dual standby mode.(Dual SIM functionality)
+     * Returns 3 for Tri standby mode.(Tri SIM functionality)
      */
     public int getPhoneCount() {
         int phoneCount = 1;
         switch (getMultiSimConfiguration()) {
             case UNKNOWN:
-                // if voice or sms or data is supported, return 1 otherwise 0
-                if (isVoiceCapable() || isSmsCapable()) {
-                    phoneCount = 1;
+                ConnectivityManager cm = mContext == null ? null : (ConnectivityManager) mContext
+                        .getSystemService(Context.CONNECTIVITY_SERVICE);
+                // check for voice and data support, 0 if not supported
+                if (!isVoiceCapable() && !isSmsCapable() && cm != null
+                        && !cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)) {
+                    phoneCount = 0;
                 } else {
-                    // todo: try to clean this up further by getting rid of the nested conditions
-                    if (mContext == null) {
-                        phoneCount = 1;
-                    } else {
-                        // check for data support
-                        ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService(
-                                Context.CONNECTIVITY_SERVICE);
-                        if (cm == null) {
-                            phoneCount = 1;
-                        } else {
-                            if (cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)) {
-                                phoneCount = 1;
-                            } else {
-                                phoneCount = 0;
-                            }
-                        }
-                    }
+                    phoneCount = 1;
                 }
                 break;
             case DSDS:
@@ -3162,14 +3151,8 @@
      * unique to a device, and always refer to the same UICC or eUICC card unless the device goes
      * through a factory reset.
      *
-     * <p>Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
-     *
      * @return card ID of the default eUICC card.
-     * @hide
      */
-    @SystemApi
-    @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges
-    @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
     public int getCardIdForDefaultEuicc() {
         try {
             ITelephony telephony = getITelephony();
@@ -3183,25 +3166,37 @@
     }
 
     /**
-     * Gets information about currently inserted UICCs and eUICCs. See {@link UiccCardInfo} for more
-     * details on the kind of information available.
+     * Gets information about currently inserted UICCs and enabled eUICCs.
+     * <p>
+     * Requires that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}).
+     * <p>
+     * If the caller has carrier priviliges on any active subscription, then they have permission to
+     * get simple information like the card ID ({@link UiccCardInfo#getCardId()}), whether the card
+     * is an eUICC ({@link UiccCardInfo#isEuicc()}), and the slot index where the card is inserted
+     * ({@link UiccCardInfo#getSlotIndex()}).
+     * <p>
+     * To get private information such as the EID ({@link UiccCardInfo#getEid()}) or ICCID
+     * ({@link UiccCardInfo#getIccId()}), the caller must have carrier priviliges on that specific
+     * UICC or eUICC card.
+     * <p>
+     * See {@link UiccCardInfo} for more details on the kind of information available.
      *
-     * @return UiccCardInfo an array of UiccCardInfo objects, representing information on the
-     * currently inserted UICCs and eUICCs.
-     *
-     * @hide
+     * @return a list of UiccCardInfo objects, representing information on the currently inserted
+     * UICCs and eUICCs. Each UiccCardInfo in the list will have private information filtered out if
+     * the caller does not have adequate permissions for that card.
      */
-    @SystemApi
     @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
-    public UiccCardInfo[] getUiccCardsInfo() {
+    public List<UiccCardInfo> getUiccCardsInfo() {
         try {
             ITelephony telephony = getITelephony();
             if (telephony == null) {
-                return null;
+                Log.e(TAG, "Error in getUiccCardsInfo: unable to connect to Telephony service.");
+                return new ArrayList<UiccCardInfo>();
             }
-            return telephony.getUiccCardsInfo();
+            return telephony.getUiccCardsInfo(mContext.getOpPackageName());
         } catch (RemoteException e) {
-            return null;
+            Log.e(TAG, "Error in getUiccCardsInfo: " + e);
+            return new ArrayList<UiccCardInfo>();
         }
     }
 
@@ -3269,6 +3264,35 @@
         }
     }
 
+    /**
+     * Get the mapping from logical slots to physical slots. The mapping represent by a pair list.
+     * The key of the piar is the logical slot id and the value of the pair is the physical
+     * slots id mapped to this logical slot id.
+     *
+     * @return an pair list indicates the mapping from logical slots to physical slots. The size of
+     * the list should be {@link #getPhoneCount()} if success, otherwise return an empty list.
+     *
+     * @hide
+     */
+    @SystemApi
+    @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+    @NonNull
+    public List<Pair<Integer, Integer>> getLogicalToPhysicalSlotMapping() {
+        List<Pair<Integer, Integer>> slotMapping = new ArrayList<>();
+        try {
+            ITelephony telephony = getITelephony();
+            if (telephony != null) {
+                int[] slotMappingArray = telephony.getSlotsMapping();
+                for (int i = 0; i < slotMappingArray.length; i++) {
+                    slotMapping.add(new Pair(i, slotMappingArray[i]));
+                }
+            }
+        } catch (RemoteException e) {
+            Log.e(TAG, "getSlotsMapping RemoteException", e);
+        }
+        return slotMapping;
+    }
+
     //
     //
     // Subscriber Info
@@ -6534,17 +6558,17 @@
      * {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE READ_PRIVILEGED_PHONE_STATE}
      * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}).
      *
-     * @return a 32-bit bitmap.
+     * @return The bitmap of preferred network types.
      *
      * @hide
      */
     @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
     @SystemApi
-    public @NetworkTypeBitMask int getPreferredNetworkTypeBitmap() {
+    public @NetworkTypeBitMask long getPreferredNetworkTypeBitmap() {
         try {
             ITelephony telephony = getITelephony();
             if (telephony != null) {
-                return RadioAccessFamily.getRafFromNetworkType(
+                return (long) RadioAccessFamily.getRafFromNetworkType(
                         telephony.getPreferredNetworkType(getSubId()));
             }
         } catch (RemoteException ex) {
@@ -6779,18 +6803,19 @@
      * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling
      * app has carrier privileges (see {@link #hasCarrierPrivileges}).
      *
-     * @param networkTypeBitmap a 32-bit bitmap.
+     * @param networkTypeBitmap The bitmap of preferred network types.
      * @return true on success; false on any failure.
      * @hide
      */
     @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
     @SystemApi
-    public boolean setPreferredNetworkTypeBitmap(@NetworkTypeBitMask int networkTypeBitmap) {
+    public boolean setPreferredNetworkTypeBitmap(@NetworkTypeBitMask long networkTypeBitmap) {
         try {
             ITelephony telephony = getITelephony();
             if (telephony != null) {
                 return telephony.setPreferredNetworkType(
-                        getSubId(), RadioAccessFamily.getNetworkTypeFromRaf(networkTypeBitmap));
+                        getSubId(), RadioAccessFamily.getNetworkTypeFromRaf(
+                                (int) networkTypeBitmap));
             }
         } catch (RemoteException ex) {
             Rlog.e(TAG, "setPreferredNetworkType RemoteException", ex);
@@ -9095,6 +9120,9 @@
     @SystemApi
     @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
     public int setAllowedCarriers(int slotIndex, List<CarrierIdentifier> carriers) {
+        if (carriers == null || !SubscriptionManager.isValidPhoneId(slotIndex)) {
+            return -1;
+        }
         // Execute the method setCarrierRestrictionRules with an empty excluded list and
         // indicating priority for the allowed list.
         CarrierRestrictionRules carrierRestrictionRules = CarrierRestrictionRules.newBuilder()
@@ -9105,7 +9133,7 @@
 
         int result = setCarrierRestrictionRules(carrierRestrictionRules);
 
-        // Convert boolean result into int, as required by this method.
+        // Convert result into int, as required by this method.
         if (result == SET_CARRIER_RESTRICTION_SUCCESS) {
             return carriers.size();
         } else {
@@ -9198,9 +9226,11 @@
     @SystemApi
     @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
     public List<CarrierIdentifier> getAllowedCarriers(int slotIndex) {
-        CarrierRestrictionRules carrierRestrictionRule = getCarrierRestrictionRules();
-        if (carrierRestrictionRule != null) {
-            return carrierRestrictionRule.getAllowedCarriers();
+        if (SubscriptionManager.isValidPhoneId(slotIndex)) {
+            CarrierRestrictionRules carrierRestrictionRule = getCarrierRestrictionRules();
+            if (carrierRestrictionRule != null) {
+                return carrierRestrictionRule.getAllowedCarriers();
+            }
         }
         return new ArrayList<CarrierIdentifier>(0);
     }
@@ -9694,7 +9724,7 @@
 
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef(flag = true, prefix = {"NETWORK_TYPE_BITMASK_"},
+    @LongDef(flag = true, prefix = {"NETWORK_TYPE_BITMASK_"},
             value = {NETWORK_TYPE_BITMASK_UNKNOWN,
                     NETWORK_TYPE_BITMASK_GSM,
                     NETWORK_TYPE_BITMASK_GPRS,
@@ -9723,118 +9753,125 @@
      * @hide
      */
     @SystemApi
-    public static final int NETWORK_TYPE_BITMASK_UNKNOWN = (1 << NETWORK_TYPE_UNKNOWN);
+    public static final long NETWORK_TYPE_BITMASK_UNKNOWN = 0L;
     /**
      * network type bitmask indicating the support of radio tech GSM.
      * @hide
      */
     @SystemApi
-    public static final int NETWORK_TYPE_BITMASK_GSM = (1 << NETWORK_TYPE_GSM);
+    public static final long NETWORK_TYPE_BITMASK_GSM = (1 << (NETWORK_TYPE_GSM -1));
     /**
      * network type bitmask indicating the support of radio tech GPRS.
      * @hide
      */
     @SystemApi
-    public static final int NETWORK_TYPE_BITMASK_GPRS = (1 << NETWORK_TYPE_GPRS);
+    public static final long NETWORK_TYPE_BITMASK_GPRS = (1 << (NETWORK_TYPE_GPRS -1));
     /**
      * network type bitmask indicating the support of radio tech EDGE.
      * @hide
      */
     @SystemApi
-    public static final int NETWORK_TYPE_BITMASK_EDGE = (1 << NETWORK_TYPE_EDGE);
+    public static final long NETWORK_TYPE_BITMASK_EDGE = (1 << (NETWORK_TYPE_EDGE -1));
     /**
      * network type bitmask indicating the support of radio tech CDMA(IS95A/IS95B).
      * @hide
      */
     @SystemApi
-    public static final int NETWORK_TYPE_BITMASK_CDMA = (1 << NETWORK_TYPE_CDMA);
+    public static final long NETWORK_TYPE_BITMASK_CDMA = (1 << (NETWORK_TYPE_CDMA -1));
     /**
      * network type bitmask indicating the support of radio tech 1xRTT.
      * @hide
      */
     @SystemApi
-    public static final int NETWORK_TYPE_BITMASK_1xRTT = (1 << NETWORK_TYPE_1xRTT);
+    public static final long NETWORK_TYPE_BITMASK_1xRTT = (1 << (NETWORK_TYPE_1xRTT - 1));
     // 3G
     /**
      * network type bitmask indicating the support of radio tech EVDO 0.
      * @hide
      */
     @SystemApi
-    public static final int NETWORK_TYPE_BITMASK_EVDO_0 = (1 << NETWORK_TYPE_EVDO_0);
+    public static final long NETWORK_TYPE_BITMASK_EVDO_0 = (1 << (NETWORK_TYPE_EVDO_0 -1));
     /**
      * network type bitmask indicating the support of radio tech EVDO A.
      * @hide
      */
     @SystemApi
-    public static final int NETWORK_TYPE_BITMASK_EVDO_A = (1 << NETWORK_TYPE_EVDO_A);
+    public static final long NETWORK_TYPE_BITMASK_EVDO_A = (1 << (NETWORK_TYPE_EVDO_A - 1));
     /**
      * network type bitmask indicating the support of radio tech EVDO B.
      * @hide
      */
     @SystemApi
-    public static final int NETWORK_TYPE_BITMASK_EVDO_B = (1 << NETWORK_TYPE_EVDO_B);
+    public static final long NETWORK_TYPE_BITMASK_EVDO_B = (1 << (NETWORK_TYPE_EVDO_B -1));
     /**
      * network type bitmask indicating the support of radio tech EHRPD.
      * @hide
      */
     @SystemApi
-    public static final int NETWORK_TYPE_BITMASK_EHRPD = (1 << NETWORK_TYPE_EHRPD);
+    public static final long NETWORK_TYPE_BITMASK_EHRPD = (1 << (NETWORK_TYPE_EHRPD -1));
     /**
      * network type bitmask indicating the support of radio tech HSUPA.
      * @hide
      */
     @SystemApi
-    public static final int NETWORK_TYPE_BITMASK_HSUPA = (1 << NETWORK_TYPE_HSUPA);
+    public static final long NETWORK_TYPE_BITMASK_HSUPA = (1 << (NETWORK_TYPE_HSUPA -1));
     /**
      * network type bitmask indicating the support of radio tech HSDPA.
      * @hide
      */
     @SystemApi
-    public static final int NETWORK_TYPE_BITMASK_HSDPA = (1 << NETWORK_TYPE_HSDPA);
+    public static final long NETWORK_TYPE_BITMASK_HSDPA = (1 << (NETWORK_TYPE_HSDPA -1));
     /**
      * network type bitmask indicating the support of radio tech HSPA.
      * @hide
      */
     @SystemApi
-    public static final int NETWORK_TYPE_BITMASK_HSPA = (1 << NETWORK_TYPE_HSPA);
+    public static final long NETWORK_TYPE_BITMASK_HSPA = (1 << (NETWORK_TYPE_HSPA -1));
     /**
      * network type bitmask indicating the support of radio tech HSPAP.
      * @hide
      */
     @SystemApi
-    public static final int NETWORK_TYPE_BITMASK_HSPAP = (1 << NETWORK_TYPE_HSPAP);
+    public static final long NETWORK_TYPE_BITMASK_HSPAP = (1 << (NETWORK_TYPE_HSPAP -1));
     /**
      * network type bitmask indicating the support of radio tech UMTS.
      * @hide
      */
     @SystemApi
-    public static final int NETWORK_TYPE_BITMASK_UMTS = (1 << NETWORK_TYPE_UMTS);
+    public static final long NETWORK_TYPE_BITMASK_UMTS = (1 << (NETWORK_TYPE_UMTS -1));
     /**
      * network type bitmask indicating the support of radio tech TD_SCDMA.
      * @hide
      */
     @SystemApi
-    public static final int NETWORK_TYPE_BITMASK_TD_SCDMA = (1 << NETWORK_TYPE_TD_SCDMA);
+    public static final long NETWORK_TYPE_BITMASK_TD_SCDMA = (1 << (NETWORK_TYPE_TD_SCDMA -1));
     // 4G
     /**
      * network type bitmask indicating the support of radio tech LTE.
      * @hide
      */
     @SystemApi
-    public static final int NETWORK_TYPE_BITMASK_LTE = (1 << NETWORK_TYPE_LTE);
+    public static final long NETWORK_TYPE_BITMASK_LTE = (1 << (NETWORK_TYPE_LTE -1));
     /**
      * network type bitmask indicating the support of radio tech LTE CA (carrier aggregation).
      * @hide
      */
     @SystemApi
-    public static final int NETWORK_TYPE_BITMASK_LTE_CA = (1 << NETWORK_TYPE_LTE_CA);
+    public static final long NETWORK_TYPE_BITMASK_LTE_CA = (1 << (NETWORK_TYPE_LTE_CA -1));
 
     /**
      * network type bitmask indicating the support of radio tech NR(New Radio) 5G.
      * @hide
      */
     @SystemApi
-    public static final int NETWORK_TYPE_BITMASK_NR = (1 << NETWORK_TYPE_NR);
+    public static final long NETWORK_TYPE_BITMASK_NR = (1 << (NETWORK_TYPE_NR -1));
+
+    /**
+     * network type bitmask indicating the support of radio tech IWLAN.
+     * @hide
+     */
+    @SystemApi
+    public static final long NETWORK_TYPE_BITMASK_IWLAN = (1 << (NETWORK_TYPE_IWLAN -1));
 
     /**
      * @return Modem supported radio access family bitmask
@@ -9845,11 +9882,11 @@
      */
     @SystemApi
     @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
-    public @NetworkTypeBitMask int getSupportedRadioAccessFamily() {
+    public @NetworkTypeBitMask long getSupportedRadioAccessFamily() {
         try {
             ITelephony telephony = getITelephony();
             if (telephony != null) {
-                return telephony.getRadioAccessFamily(getSlotIndex(), getOpPackageName());
+                return (long) telephony.getRadioAccessFamily(getSlotIndex(), getOpPackageName());
             } else {
                 // This can happen when the ITelephony interface is not up yet.
                 return NETWORK_TYPE_BITMASK_UNKNOWN;
@@ -10156,4 +10193,99 @@
      */
     public static final String EXTRA_NETWORK_COUNTRY =
             "android.telephony.extra.NETWORK_COUNTRY";
+
+    /**
+     * Indicate if the user is allowed to use multiple SIM cards at the same time to register
+     * on the network (e.g. Dual Standby or Dual Active) when the device supports it, or if the
+     * usage is restricted. This API is used to prevent usage of multiple SIM card, based on
+     * policies of the carrier.
+     * <p>Note: the API does not prevent access to the SIM cards for operations that don't require
+     * access to the network.
+     *
+     * @param isMultisimCarrierRestricted true if usage of multiple SIMs is restricted, false
+     * otherwise.
+     *
+     * @hide
+     */
+    @SystemApi
+    @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
+    public void setMultisimCarrierRestriction(boolean isMultisimCarrierRestricted) {
+        try {
+            ITelephony service = getITelephony();
+            if (service != null) {
+                service.setMultisimCarrierRestriction(isMultisimCarrierRestricted);
+            }
+        } catch (RemoteException e) {
+            Log.e(TAG, "setMultisimCarrierRestriction RemoteException", e);
+        }
+    }
+
+    /**
+     * Returns if the usage of multiple SIM cards at the same time to register on the network
+     * (e.g. Dual Standby or Dual Active) is restricted.
+     *
+     * @return true if usage of multiple SIMs is restricted, false otherwise.
+     *
+     * @hide
+     */
+    @SystemApi
+    @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+    public boolean isMultisimCarrierRestricted() {
+        try {
+            ITelephony service = getITelephony();
+            if (service != null) {
+                return service.isMultisimCarrierRestricted();
+            }
+        } catch (RemoteException e) {
+            Log.e(TAG, "isMultisimCarrierRestricted RemoteException", e);
+        }
+        return true;
+    }
+
+    /**
+     * Switch configs to enable multi-sim or switch back to single-sim
+     * <p>Requires Permission:
+     * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the
+     * calling app has carrier privileges (see {@link #hasCarrierPrivileges}).
+     * @param numOfSims number of live SIMs we want to switch to
+     * @throws android.os.RemoteException
+     */
+    @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges
+    @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
+    public void switchMultiSimConfig(int numOfSims) {
+        //only proceed if multi-sim is not restricted
+        if (isMultisimCarrierRestricted()) {
+            Rlog.e(TAG, "switchMultiSimConfig not possible. It is restricted.");
+            return;
+        }
+
+        try {
+            ITelephony telephony = getITelephony();
+            if (telephony != null) {
+                telephony.switchMultiSimConfig(numOfSims);
+            }
+        } catch (RemoteException ex) {
+            Rlog.e(TAG, "switchMultiSimConfig RemoteException", ex);
+        }
+    }
+
+    /**
+     * Get whether reboot is required or not after making changes to modem configurations.
+     * @Return {@code True} if reboot is required after making changes to modem configurations,
+     * otherwise return {@code False}.
+     *
+     * @hide
+     */
+    @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+    public boolean isRebootRequiredForModemConfigChange() {
+        try {
+            ITelephony service = getITelephony();
+            if (service != null) {
+                return service.isRebootRequiredForModemConfigChange();
+            }
+        } catch (RemoteException e) {
+            Log.e(TAG, "isRebootRequiredForModemConfigChange RemoteException", e);
+        }
+        return false;
+    }
 }
diff --git a/telephony/java/android/telephony/UiccCardInfo.java b/telephony/java/android/telephony/UiccCardInfo.java
index 45e4704..19f357a 100644
--- a/telephony/java/android/telephony/UiccCardInfo.java
+++ b/telephony/java/android/telephony/UiccCardInfo.java
@@ -15,7 +15,6 @@
  */
 package android.telephony;
 
-import android.annotation.SystemApi;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -23,10 +22,8 @@
 
 /**
  * The UiccCardInfo represents information about a currently inserted UICC or embedded eUICC.
- * @hide
  */
-@SystemApi
-public class UiccCardInfo implements Parcelable {
+public final class UiccCardInfo implements Parcelable {
 
     private final boolean mIsEuicc;
     private final int mCardId;
@@ -95,6 +92,9 @@
     /**
      * Get the embedded ID (EID) of the eUICC. If the UiccCardInfo is not an eUICC
      * (see {@link #isEuicc()}), returns null.
+     * <p>
+     * Note that this field may be omitted if the caller does not have the correct permissions
+     * (see {@link TelephonyManager#getUiccCardsInfo()}).
      */
     public String getEid() {
         if (!mIsEuicc) {
@@ -105,6 +105,9 @@
 
     /**
      * Get the ICCID of the UICC.
+     * <p>
+     * Note that this field may be omitted if the caller does not have the correct permissions
+     * (see {@link TelephonyManager#getUiccCardsInfo()}).
      */
     public String getIccId() {
         return mIccId;
@@ -117,6 +120,16 @@
         return mSlotIndex;
     }
 
+    /**
+     * Returns a copy of the UiccCardinfo with the clears the EID and ICCID set to null. These
+     * values are generally private and require carrier privileges to view.
+     *
+     * @hide
+     */
+    public UiccCardInfo getUnprivileged() {
+        return new UiccCardInfo(mIsEuicc, mCardId, null, null, mSlotIndex);
+    }
+
     @Override
     public boolean equals(Object obj) {
         if (this == obj) {
diff --git a/telephony/java/android/telephony/data/DataService.java b/telephony/java/android/telephony/data/DataService.java
index 74d1e83..79572b9 100644
--- a/telephony/java/android/telephony/data/DataService.java
+++ b/telephony/java/android/telephony/data/DataService.java
@@ -157,7 +157,10 @@
                                   @Nullable LinkProperties linkProperties,
                                   @Nullable DataServiceCallback callback) {
             // The default implementation is to return unsupported.
-            callback.onSetupDataCallComplete(DataServiceCallback.RESULT_ERROR_UNSUPPORTED, null);
+            if (callback != null) {
+                callback.onSetupDataCallComplete(DataServiceCallback.RESULT_ERROR_UNSUPPORTED,
+                        null);
+            }
         }
 
         /**
@@ -176,7 +179,9 @@
         public void deactivateDataCall(int cid, @DeactivateDataReason int reason,
                                        @Nullable DataServiceCallback callback) {
             // The default implementation is to return unsupported.
-            callback.onDeactivateDataCallComplete(DataServiceCallback.RESULT_ERROR_UNSUPPORTED);
+            if (callback != null) {
+                callback.onDeactivateDataCallComplete(DataServiceCallback.RESULT_ERROR_UNSUPPORTED);
+            }
         }
 
         /**
@@ -190,7 +195,10 @@
         public void setInitialAttachApn(DataProfile dataProfile, boolean isRoaming,
                                         @Nullable DataServiceCallback callback) {
             // The default implementation is to return unsupported.
-            callback.onSetInitialAttachApnComplete(DataServiceCallback.RESULT_ERROR_UNSUPPORTED);
+            if (callback != null) {
+                callback.onSetInitialAttachApnComplete(
+                        DataServiceCallback.RESULT_ERROR_UNSUPPORTED);
+            }
         }
 
         /**
@@ -206,7 +214,9 @@
         public void setDataProfile(List<DataProfile> dps, boolean isRoaming,
                                    @Nullable DataServiceCallback callback) {
             // The default implementation is to return unsupported.
-            callback.onSetDataProfileComplete(DataServiceCallback.RESULT_ERROR_UNSUPPORTED);
+            if (callback != null) {
+                callback.onSetDataProfileComplete(DataServiceCallback.RESULT_ERROR_UNSUPPORTED);
+            }
         }
 
         /**
diff --git a/telephony/java/android/telephony/euicc/EuiccManager.java b/telephony/java/android/telephony/euicc/EuiccManager.java
index bca088e..1bbf9f4 100644
--- a/telephony/java/android/telephony/euicc/EuiccManager.java
+++ b/telephony/java/android/telephony/euicc/EuiccManager.java
@@ -408,7 +408,7 @@
     public static final int EUICC_OTA_STATUS_UNAVAILABLE = 5;
 
     private final Context mContext;
-    private final int mCardId;
+    private int mCardId;
 
     /** @hide */
     public EuiccManager(Context context) {
@@ -446,7 +446,7 @@
     public boolean isEnabled() {
         // In the future, this may reach out to IEuiccController (if non-null) to check any dynamic
         // restrictions.
-        return getIEuiccController() != null && mCardId != TelephonyManager.INVALID_CARD_ID;
+        return getIEuiccController() != null;
     }
 
     /**
@@ -456,15 +456,15 @@
      * current eUICC. A calling app with carrier privileges for one eUICC may not necessarily have
      * access to the EID of another eUICC.
      *
-     * @return the EID. May be null if {@link #isEnabled()} is false or the eUICC is not ready.
+     * @return the EID. May be null if the eUICC is not ready.
      */
     @Nullable
     public String getEid() {
-        if (!isEnabled()) {
+        if (!refreshCardIdIfInvalid()) {
             return null;
         }
         try {
-            return getIEuiccController().getEid(mCardId);
+            return getIEuiccController().getEid(mCardId, mContext.getOpPackageName());
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -475,15 +475,15 @@
      *
      * <p>Requires the {@link android.Manifest.permission#WRITE_EMBEDDED_SUBSCRIPTIONS} permission.
      *
-     * @return the status of eUICC OTA. If {@link #isEnabled()} is false or the eUICC is not ready,
-     *     {@link OtaStatus#EUICC_OTA_STATUS_UNAVAILABLE} will be returned.
+     * @return the status of eUICC OTA. If the eUICC is not ready,
+     *         {@link OtaStatus#EUICC_OTA_STATUS_UNAVAILABLE} will be returned.
      *
      * @hide
      */
     @SystemApi
     @RequiresPermission(Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
     public int getOtaStatus() {
-        if (!isEnabled()) {
+        if (!refreshCardIdIfInvalid()) {
             return EUICC_OTA_STATUS_UNAVAILABLE;
         }
         try {
@@ -502,6 +502,15 @@
      * Without the former, an {@link #EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR} will be
      * returned in the callback intent to prompt the user to accept the download.
      *
+     * <p>On a multi-active SIM device, requires the
+     * {@code android.Manifest.permission#WRITE_EMBEDDED_SUBSCRIPTIONS} permission, or a calling app
+     * only if the targeted eUICC does not currently have an active subscription or the calling app
+     * is authorized to manage the active subscription on the target eUICC, and the calling app is
+     * authorized to manage any active subscription on any SIM. Without it, an
+     * {@link #EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR} will be returned in the callback
+     * intent to prompt the user to accept the download. The caller should also be authorized to
+     * manage the subscription to be downloaded.
+     *
      * @param subscription the subscription to download.
      * @param switchAfterDownload if true, the profile will be activated upon successful download.
      * @param callbackIntent a PendingIntent to launch when the operation completes.
@@ -509,7 +518,7 @@
     @RequiresPermission(Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
     public void downloadSubscription(DownloadableSubscription subscription,
             boolean switchAfterDownload, PendingIntent callbackIntent) {
-        if (!isEnabled()) {
+        if (!refreshCardIdIfInvalid()) {
             sendUnavailableError(callbackIntent);
             return;
         }
@@ -571,7 +580,7 @@
     @SystemApi
     @RequiresPermission(Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
     public void continueOperation(Intent resolutionIntent, Bundle resolutionExtras) {
-        if (!isEnabled()) {
+        if (!refreshCardIdIfInvalid()) {
             PendingIntent callbackIntent =
                     resolutionIntent.getParcelableExtra(
                             EuiccManager.EXTRA_EMBEDDED_SUBSCRIPTION_RESOLUTION_CALLBACK_INTENT);
@@ -608,7 +617,7 @@
     @RequiresPermission(Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
     public void getDownloadableSubscriptionMetadata(
             DownloadableSubscription subscription, PendingIntent callbackIntent) {
-        if (!isEnabled()) {
+        if (!refreshCardIdIfInvalid()) {
             sendUnavailableError(callbackIntent);
             return;
         }
@@ -638,7 +647,7 @@
     @SystemApi
     @RequiresPermission(Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
     public void getDefaultDownloadableSubscriptionList(PendingIntent callbackIntent) {
-        if (!isEnabled()) {
+        if (!refreshCardIdIfInvalid()) {
             sendUnavailableError(callbackIntent);
             return;
         }
@@ -653,12 +662,11 @@
     /**
      * Returns information about the eUICC chip/device.
      *
-     * @return the {@link EuiccInfo}. May be null if {@link #isEnabled()} is false or the eUICC is
-     *     not ready.
+     * @return the {@link EuiccInfo}. May be null if the eUICC is not ready.
      */
     @Nullable
     public EuiccInfo getEuiccInfo() {
-        if (!isEnabled()) {
+        if (!refreshCardIdIfInvalid()) {
             return null;
         }
         try {
@@ -683,7 +691,7 @@
      */
     @RequiresPermission(Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
     public void deleteSubscription(int subscriptionId, PendingIntent callbackIntent) {
-        if (!isEnabled()) {
+        if (!refreshCardIdIfInvalid()) {
             sendUnavailableError(callbackIntent);
             return;
         }
@@ -704,14 +712,26 @@
      * an {@link #EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR} will be returned in the callback
      * intent to prompt the user to accept the download.
      *
+     * <p>On a multi-active SIM device, requires the
+     * {@code android.Manifest.permission#WRITE_EMBEDDED_SUBSCRIPTIONS} permission, or a calling app
+     *  only if the targeted eUICC does not currently have an active subscription or the calling app
+     * is authorized to manage the active subscription on the target eUICC, and the calling app is
+     * authorized to manage any active subscription on any SIM. Without it, an
+     * {@link #EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR} will be returned in the callback
+     * intent to prompt the user to accept the download. The caller should also be authorized to
+     * manage the subscription to be enabled.
+     *
      * @param subscriptionId the ID of the subscription to enable. May be
      *     {@link android.telephony.SubscriptionManager#INVALID_SUBSCRIPTION_ID} to deactivate the
-     *     current profile without activating another profile to replace it.
+     *     current profile without activating another profile to replace it. If it's a disable
+     *     operation, requires the {@code android.Manifest.permission#WRITE_EMBEDDED_SUBSCRIPTIONS}
+     *     permission, or the calling app must be authorized to manage the active subscription on
+     *     the target eUICC.
      * @param callbackIntent a PendingIntent to launch when the operation completes.
      */
     @RequiresPermission(Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
     public void switchToSubscription(int subscriptionId, PendingIntent callbackIntent) {
-        if (!isEnabled()) {
+        if (!refreshCardIdIfInvalid()) {
             sendUnavailableError(callbackIntent);
             return;
         }
@@ -737,7 +757,7 @@
     @RequiresPermission(Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
     public void updateSubscriptionNickname(
             int subscriptionId, String nickname, PendingIntent callbackIntent) {
-        if (!isEnabled()) {
+        if (!refreshCardIdIfInvalid()) {
             sendUnavailableError(callbackIntent);
             return;
         }
@@ -761,7 +781,7 @@
     @SystemApi
     @RequiresPermission(Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
     public void eraseSubscriptions(PendingIntent callbackIntent) {
-        if (!isEnabled()) {
+        if (!refreshCardIdIfInvalid()) {
             sendUnavailableError(callbackIntent);
             return;
         }
@@ -791,7 +811,7 @@
      * @hide
      */
     public void retainSubscriptionsForFactoryReset(PendingIntent callbackIntent) {
-        if (!isEnabled()) {
+        if (!refreshCardIdIfInvalid()) {
             sendUnavailableError(callbackIntent);
             return;
         }
@@ -802,6 +822,19 @@
         }
     }
 
+    private boolean refreshCardIdIfInvalid() {
+        if (!isEnabled()) {
+            return false;
+        }
+        // Refresh mCardId if it's invalid.
+        if (mCardId == TelephonyManager.INVALID_CARD_ID) {
+            TelephonyManager tm = (TelephonyManager)
+                    mContext.getSystemService(Context.TELEPHONY_SERVICE);
+            mCardId = tm.getCardIdForDefaultEuicc();
+        }
+        return true;
+    }
+
     private static void sendUnavailableError(PendingIntent callbackIntent) {
         try {
             callbackIntent.send(EMBEDDED_SUBSCRIPTION_RESULT_ERROR);
diff --git a/telephony/java/com/android/ims/internal/uce/common/StatusCode.java b/telephony/java/com/android/ims/internal/uce/common/StatusCode.java
index 3921cfb..7250eee 100644
--- a/telephony/java/com/android/ims/internal/uce/common/StatusCode.java
+++ b/telephony/java/com/android/ims/internal/uce/common/StatusCode.java
@@ -64,6 +64,10 @@
     public static final int UCE_NO_CHANGE_IN_CAP = 13;
     /**  Service is unknown. */
     public static final int UCE_SERVICE_UNKNOWN = 14;
+     /** Service cannot support Invalid Feature Tag   */
+    public static final int UCE_INVALID_FEATURE_TAG = 15;
+    /** Service is Available   */
+    public static final int UCE_SERVICE_AVAILABLE = 16;
 
 
     private int mStatusCode = UCE_SUCCESS;
diff --git a/telephony/java/com/android/ims/internal/uce/uceservice/IUceService.aidl b/telephony/java/com/android/ims/internal/uce/uceservice/IUceService.aidl
index 43f83cd..1fb8513 100644
--- a/telephony/java/com/android/ims/internal/uce/uceservice/IUceService.aidl
+++ b/telephony/java/com/android/ims/internal/uce/uceservice/IUceService.aidl
@@ -66,10 +66,30 @@
      * service the client created.
      *
      * @return  optionsServiceHandle
+     *
      * @hide
+     *
+     * @deprecated This is replaced with new API createOptionsServiceForSubscription()
      */
     int createOptionsService(IOptionsListener optionsListener,
                              inout UceLong optionsServiceListenerHdl);
+    /**
+     * Creates a options service for Capability Discovery.
+     * @param optionsListener IOptionsListener object.
+     * @param optionsServiceListenerHdl wrapper for client's listener handle to be stored.
+     * @param iccId the ICC-ID derived from SubscriptionInfo for the Service requested
+     *
+     * The service will fill UceLong.mUceLong with presenceListenerHandle allocated and
+     * used to validate callbacks received in IPresenceListener are indeed from the
+     * service the client created.
+     *
+     * @return  optionsServiceHandle
+     *
+     * @hide
+     */
+    int createOptionsServiceForSubscription(IOptionsListener optionsListener,
+                             inout UceLong optionsServiceListenerHdl,
+                             in String iccId);
 
     /**
      * Destroys a Options service.
@@ -89,14 +109,36 @@
      * service the client created.
      *
      * @return  presenceServiceHdl
+     *
      * @hide
+     *
+     * @deprecated This is replaced with new API createPresenceServiceForSubscription()
      */
     int createPresenceService(IPresenceListener presenceServiceListener,
                               inout UceLong presenceServiceListenerHdl);
+    /**
+     * Creates a presence service.
+     * @param presenceServiceListener IPresenceListener object
+     * @param presenceServiceListenerHdl wrapper for client's listener handle to be stored.
+     * @param iccId the ICC-ID derived from SubscriptionInfo for the Service requested
+     *
+     * The service will fill UceLong.mUceLong with presenceListenerHandle allocated and
+     * used to validate callbacks received in IPresenceListener are indeed from the
+     * service the client created.
+     *
+     * @return  presenceServiceHdl
+     *
+     * @hide
+     */
+    int createPresenceServiceForSubscription(IPresenceListener presenceServiceListener,
+                              inout UceLong presenceServiceListenerHdl,
+                              in String iccId);
 
     /**
      * Destroys a presence service.
+     *
      * @param presenceServiceHdl handle returned during createPresenceService()
+     *
      * @hide
      */
     void destroyPresenceService(int presenceServiceHdl);
@@ -105,23 +147,55 @@
 
     /**
      * Query the UCE Service for information to know whether the is registered.
+     *
      * @return boolean, true if Registered to for network events else false.
+     *
      * @hide
      */
     boolean getServiceStatus();
 
     /**
      * Query the UCE Service for presence Service.
+     *
      * @return IPresenceService object.
+     *
      * @hide
+     *
+     * @deprecated use API getPresenceServiceForSubscription()
      */
     IPresenceService getPresenceService();
 
     /**
+     * Query the UCE Service for presence Service.
+     *
+     * @param iccId the ICC-ID derived from SubscriptionInfo for the Service requested
+     *
+     * @return IPresenceService object.
+     *
+     * @hide
+     */
+    IPresenceService getPresenceServiceForSubscription(in String iccId);
+
+    /**
      * Query the UCE Service for options service object.
+     *
      * @return IOptionsService object.
+     *
+     * @deprecated use API getOptionsServiceForSubscription()
+     *
      * @hide
      */
     IOptionsService getOptionsService();
 
+    /**
+     * Query the UCE Service for options service object.
+     *
+     * @param iccId the ICC-ID derived from SubscriptionInfo for the Service requested
+     *
+     * @return IOptionsService object.
+     *
+     * @hide
+     */
+    IOptionsService getOptionsServiceForSubscription(in String iccId);
+
 }
diff --git a/telephony/java/com/android/ims/internal/uce/uceservice/UceServiceBase.java b/telephony/java/com/android/ims/internal/uce/uceservice/UceServiceBase.java
index 3660e03..ceb1919 100644
--- a/telephony/java/com/android/ims/internal/uce/uceservice/UceServiceBase.java
+++ b/telephony/java/com/android/ims/internal/uce/uceservice/UceServiceBase.java
@@ -56,6 +56,14 @@
             return onCreateOptionsService(optionsListener, optionsServiceListenerHdl);
         }
 
+        @Override
+        public int createOptionsServiceForSubscription(IOptionsListener optionsListener,
+                                      UceLong optionsServiceListenerHdl,
+                                      String iccId) {
+            return onCreateOptionsService(optionsListener, optionsServiceListenerHdl,
+                                          iccId);
+        }
+
 
         @Override
         public void destroyOptionsService(int optionsServiceHandle) {
@@ -70,6 +78,14 @@
         }
 
         @Override
+        public int createPresenceServiceForSubscription(IPresenceListener presServiceListener,
+                                         UceLong presServiceListenerHdl,
+                                         String iccId) {
+            return onCreatePresService(presServiceListener, presServiceListenerHdl,
+                                       iccId);
+        }
+
+        @Override
         public void destroyPresenceService(int presServiceHdl) {
             onDestroyPresService(presServiceHdl);
         }
@@ -85,9 +101,19 @@
         }
 
         @Override
+        public IPresenceService getPresenceServiceForSubscription(String iccId) {
+            return onGetPresenceService(iccId);
+        }
+
+        @Override
         public IOptionsService getOptionsService() {
             return onGetOptionsService();
         }
+
+        @Override
+        public IOptionsService getOptionsServiceForSubscription(String iccId) {
+            return onGetOptionsService(iccId);
+        }
     }
 
     private UceServiceBinder mBinder;
@@ -120,6 +146,13 @@
         return 0;
     }
 
+    protected int onCreateOptionsService(IOptionsListener optionsListener,
+                                         UceLong optionsServiceListenerHdl,
+                                         String iccId) {
+        //no-op
+        return 0;
+    }
+
     protected void onDestroyOptionsService(int cdServiceHandle) {
         //no-op
         return;
@@ -131,6 +164,13 @@
         return 0;
     }
 
+    protected int onCreatePresService(IPresenceListener presServiceListener,
+                                      UceLong presServiceListenerHdl,
+                                      String iccId) {
+        //no-op
+        return 0;
+    }
+
     protected void onDestroyPresService(int presServiceHdl) {
         //no-op
         return;
@@ -146,8 +186,18 @@
         return null;
     }
 
+    protected IPresenceService onGetPresenceService(String iccId) {
+        //no-op
+        return null;
+    }
+
     protected IOptionsService onGetOptionsService () {
         //no-op
         return null;
     }
+
+    protected IOptionsService onGetOptionsService (String iccId) {
+        //no-op
+        return null;
+    }
 }
diff --git a/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl b/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl
index 3dbebe8..322ce45 100644
--- a/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl
+++ b/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl
@@ -27,6 +27,7 @@
 import android.telephony.ServiceState;
 import android.telephony.SignalStrength;
 import android.telephony.emergency.EmergencyNumber;
+import android.telephony.ims.ImsReasonInfo;
 
 oneway interface IPhoneStateListener {
     void onServiceStateChanged(in ServiceState serviceState);
@@ -58,5 +59,6 @@
     void onCallAttributesChanged(in CallAttributes callAttributes);
     void onEmergencyNumberListChanged(in Map emergencyNumberList);
     void onCallDisconnectCauseChanged(in int disconnectCause, in int preciseDisconnectCause);
+    void onImsCallDisconnectCauseChanged(in ImsReasonInfo imsReasonInfo);
 }
 
diff --git a/telephony/java/com/android/internal/telephony/ISub.aidl b/telephony/java/com/android/internal/telephony/ISub.aidl
index a49d2d9..6ce9de4 100755
--- a/telephony/java/com/android/internal/telephony/ISub.aidl
+++ b/telephony/java/com/android/internal/telephony/ISub.aidl
@@ -220,7 +220,7 @@
      * @hide
      *
      */
-    int setPreferredDataSubscriptionId(int subId);
+    void setPreferredDataSubscriptionId(int subId);
 
     /**
      * Get which subscription is preferred for cellular data.
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index 8237d39..bc43fea 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -1492,25 +1492,34 @@
      * Get the card ID of the default eUICC card. If there is no eUICC, returns
      * {@link #INVALID_CARD_ID}.
      *
-     * <p>Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
-     *
      * @param subId subscription ID used for authentication
      * @param callingPackage package making the call
      * @return card ID of the default eUICC card.
-     * @hide
      */
-    int getCardIdForDefaultEuicc(int subId, String callingPackage); 
+    int getCardIdForDefaultEuicc(int subId, String callingPackage);
 
     /**
-     * Gets information about currently inserted UICCs and eUICCs. See {@link UiccCardInfo} for more
-     * details on the kind of information available.
+     * Gets information about currently inserted UICCs and enabled eUICCs.
+     * <p>
+     * Requires that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}).
+     * <p>
+     * If the caller has carrier priviliges on any active subscription, then they have permission to
+     * get simple information like the card ID ({@link UiccCardInfo#getCardId()}), whether the card
+     * is an eUICC ({@link UiccCardInfo#isEuicc()}), and the slot index where the card is inserted
+     * ({@link UiccCardInfo#getSlotIndex()}).
+     * <p>
+     * To get private information such as the EID ({@link UiccCardInfo#getEid()}) or ICCID
+     * ({@link UiccCardInfo#getIccId()}), the caller must have carrier priviliges on that specific
+     * UICC or eUICC card.
+     * <p>
+     * See {@link UiccCardInfo} for more details on the kind of information available.
      *
-     * @return UiccCardInfo an array of UiccCardInfo objects, representing information on the
-     * currently inserted UICCs and eUICCs.
-     *
-     * @hide
+     * @param callingPackage package making the call, used to evaluate carrier privileges 
+     * @return a list of UiccCardInfo objects, representing information on the currently inserted
+     * UICCs and eUICCs. Each UiccCardInfo in the list will have private information filtered out if
+     * the caller does not have adequate permissions for that card.
      */
-    UiccCardInfo[] getUiccCardsInfo();
+    List<UiccCardInfo> getUiccCardsInfo(String callingPackage);
 
     /**
      * Get slot info for all the UICC slots.
@@ -1816,4 +1825,32 @@
      * Enable or disable a logical modem stack associated with the slotIndex.
      */
     boolean enableModemForSlot(int slotIndex, boolean enable);
+
+    /**
+     * Indicate if the enablement of multi SIM functionality is restricted.
+     * @hide
+     */
+    void setMultisimCarrierRestriction(boolean isMultisimCarrierRestricted);
+
+    /**
+     * Returns if the usage of multiple SIM cards at the same time is restricted.
+     * @hide
+     */
+    boolean isMultisimCarrierRestricted();
+    
+    /**
+     * Switch configs to enable multi-sim or switch back to single-sim
+     * @hide
+     */
+    void switchMultiSimConfig(int numOfSims);
+
+    /**
+     * Get if reboot is required upon altering modems configurations
+     */
+    boolean isRebootRequiredForModemConfigChange();
+
+    /**
+     * Get the mapping from logical slots to physical slots.
+     */
+    int[] getSlotsMapping();
 }
diff --git a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl
index 2be1f41..e9eba32 100644
--- a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl
@@ -22,6 +22,7 @@
 import android.os.Bundle;
 import android.telephony.CallQuality;
 import android.telephony.CellInfo;
+import android.telephony.ims.ImsReasonInfo;
 import android.telephony.PhoneCapability;
 import android.telephony.PhysicalChannelConfig;
 import android.telephony.ServiceState;
@@ -84,4 +85,5 @@
     void notifyRadioPowerStateChanged(in int state);
     void notifyEmergencyNumberList();
     void notifyCallQualityChanged(in CallQuality callQuality, int phoneId);
+    void notifyImsDisconnectCause(int subId, in ImsReasonInfo imsReasonInfo);
 }
diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java
index d9b206f..77b7979 100644
--- a/telephony/java/com/android/internal/telephony/RILConstants.java
+++ b/telephony/java/com/android/internal/telephony/RILConstants.java
@@ -480,6 +480,7 @@
     int RIL_REQUEST_SET_PREFERRED_DATA_MODEM = 204;
     int RIL_REQUEST_EMERGENCY_DIAL = 205;
     int RIL_REQUEST_GET_PHONE_CAPABILITY = 206;
+    int RIL_REQUEST_SWITCH_DUAL_SIM_CONFIG = 207;
 
     /* Responses begin */
     int RIL_RESPONSE_ACKNOWLEDGEMENT = 800;
diff --git a/telephony/java/com/android/internal/telephony/SmsApplication.java b/telephony/java/com/android/internal/telephony/SmsApplication.java
index a508b06..d3420ee 100644
--- a/telephony/java/com/android/internal/telephony/SmsApplication.java
+++ b/telephony/java/com/android/internal/telephony/SmsApplication.java
@@ -51,7 +51,6 @@
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
-import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
@@ -635,20 +634,10 @@
             }
 
             // Update the setting.
-            CompletableFuture<Void> res = new CompletableFuture<>();
+            RoleManagerCallback.Future res = new RoleManagerCallback.Future();
             context.getSystemService(RoleManager.class).addRoleHolderAsUser(
                     RoleManager.ROLE_SMS, applicationData.mPackageName, UserHandle.of(userId),
-                    AsyncTask.THREAD_POOL_EXECUTOR, new RoleManagerCallback() {
-                        @Override
-                        public void onSuccess() {
-                            res.complete(null);
-                        }
-
-                        @Override
-                        public void onFailure() {
-                            res.completeExceptionally(new RuntimeException());
-                        }
-                    });
+                    AsyncTask.THREAD_POOL_EXECUTOR, res);
             try {
                 res.get(5, TimeUnit.SECONDS);
             } catch (InterruptedException | ExecutionException | TimeoutException e) {
diff --git a/telephony/java/com/android/internal/telephony/TelephonyProperties.java b/telephony/java/com/android/internal/telephony/TelephonyProperties.java
index 6567ea7..603c4c2 100644
--- a/telephony/java/com/android/internal/telephony/TelephonyProperties.java
+++ b/telephony/java/com/android/internal/telephony/TelephonyProperties.java
@@ -194,6 +194,13 @@
      */
     static final String PROPERTY_MULTI_SIM_CONFIG = "persist.radio.multisim.config";
 
+     /**
+     * Property to indicate if reboot is required when changing modems configurations
+     * Type:  String(true, false) default is false; most devices don't need reboot
+     */
+    String PROPERTY_REBOOT_REQUIRED_ON_MODEM_CHANGE =
+             "persist.radio.reboot_on_modem_change";
+
     /**
      * Property to store default subscription.
      */
diff --git a/telephony/java/com/android/internal/telephony/euicc/IEuiccController.aidl b/telephony/java/com/android/internal/telephony/euicc/IEuiccController.aidl
index 14a36c8..2016915 100644
--- a/telephony/java/com/android/internal/telephony/euicc/IEuiccController.aidl
+++ b/telephony/java/com/android/internal/telephony/euicc/IEuiccController.aidl
@@ -31,7 +31,7 @@
         String callingPackage, in PendingIntent callbackIntent);
     oneway void getDefaultDownloadableSubscriptionList(int cardId,
         String callingPackage, in PendingIntent callbackIntent);
-    String getEid(int cardId);
+    String getEid(int cardId, String callingPackage);
     int getOtaStatus(int cardId);
     oneway void downloadSubscription(int cardId, in DownloadableSubscription subscription,
         boolean switchAfterDownload, String callingPackage, in Bundle resolvedBundle,
diff --git a/tests/ActivityTests/AndroidManifest.xml b/tests/ActivityTests/AndroidManifest.xml
index b381cbf..0b3bd70 100644
--- a/tests/ActivityTests/AndroidManifest.xml
+++ b/tests/ActivityTests/AndroidManifest.xml
@@ -79,6 +79,7 @@
             android:singleUser="true" android:exported="true" />
         <receiver android:name="TrackTimeReceiver" />
         <receiver android:name="AlarmSpamReceiver" />
+        <receiver android:name="SlowReceiver" />
         <activity android:name="DisableScreenshotsActivity"
                 android:label="DisableScreenshots"
                 android:theme="@style/DisableScreenshots">
diff --git a/tests/ActivityTests/src/com/google/android/test/activity/ActivityTestMain.java b/tests/ActivityTests/src/com/google/android/test/activity/ActivityTestMain.java
index 0f49608..d5549cc 100644
--- a/tests/ActivityTests/src/com/google/android/test/activity/ActivityTestMain.java
+++ b/tests/ActivityTests/src/com/google/android/test/activity/ActivityTestMain.java
@@ -16,21 +16,21 @@
 
 package com.google.android.test.activity;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import android.app.Activity;
 import android.app.ActivityManager;
 import android.app.ActivityOptions;
 import android.app.AlarmManager;
 import android.app.AlertDialog;
 import android.app.PendingIntent;
-import android.content.ActivityNotFoundException;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.ContentProviderClient;
+import android.content.Context;
 import android.content.Intent;
 import android.content.ServiceConnection;
+import android.content.pm.UserInfo;
+import android.content.res.Configuration;
+import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.net.Uri;
 import android.os.Bundle;
@@ -42,21 +42,18 @@
 import android.os.SystemClock;
 import android.os.UserHandle;
 import android.os.UserManager;
-import android.graphics.Bitmap;
 import android.provider.Settings;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-import android.widget.ScrollView;
-import android.widget.Toast;
+import android.util.Log;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
-import android.content.Context;
-import android.content.pm.UserInfo;
-import android.content.res.Configuration;
-import android.util.Log;
+import android.widget.LinearLayout;
+import android.widget.ScrollView;
+import android.widget.TextView;
+import android.widget.Toast;
 
+import java.util.ArrayList;
+import java.util.List;
 
 public class ActivityTestMain extends Activity {
     static final String TAG = "ActivityTest";
@@ -73,8 +70,14 @@
 
     ServiceConnection mIsolatedConnection;
 
+    static final String SLOW_RECEIVER_ACTION = "com.google.android.test.activity.SLOW_ACTION";
+    static final String SLOW_RECEIVER_EXTRA = "slow_ordinal";
+
     static final int MSG_SPAM = 1;
     static final int MSG_SPAM_ALARM = 2;
+    static final int MSG_SLOW_RECEIVER = 3;
+    static final int MSG_SLOW_ALARM_RECEIVER = 4;
+    static final int MSG_REPLACE_BROADCAST = 5;
 
     final Handler mHandler = new Handler() {
         @Override
@@ -100,11 +103,72 @@
                     mAlarm.setAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME, when+(30*1000), pi);
                     scheduleSpamAlarm(30*1000);
                 } break;
+                case MSG_SLOW_RECEIVER: {
+                    // Several back to back, to illustrate dispatch policy
+                    Intent intent = new Intent(ActivityTestMain.this, SlowReceiver.class);
+                    intent.setAction(SLOW_RECEIVER_ACTION);
+                    intent.putExtra(SLOW_RECEIVER_EXTRA, 1);
+                    sendOrderedBroadcast(intent, null, mSlowReceiverCompletion, mHandler,
+                            Activity.RESULT_OK, null, null);
+                    intent.putExtra(SLOW_RECEIVER_EXTRA, 2);
+                    sendOrderedBroadcast(intent, null, mSlowReceiverCompletion, mHandler,
+                            Activity.RESULT_OK, null, null);
+                    intent.putExtra(SLOW_RECEIVER_EXTRA, 3);
+                    sendOrderedBroadcast(intent, null, mSlowReceiverCompletion, mHandler,
+                            Activity.RESULT_OK, null, null);
+                } break;
+                case MSG_SLOW_ALARM_RECEIVER: {
+                    // Several back to back, to illustrate dispatch policy
+                    Intent intent = new Intent(ActivityTestMain.this, SlowReceiver.class);
+                    intent.setAction(SLOW_RECEIVER_ACTION);
+                    intent.putExtra(SLOW_RECEIVER_EXTRA, 1);
+                    sendOrderedBroadcast(intent, null, mSlowReceiverCompletion, mHandler,
+                            Activity.RESULT_OK, null, null);
+                    intent.putExtra(SLOW_RECEIVER_EXTRA, 2);
+                    sendOrderedBroadcast(intent, null, mSlowReceiverCompletion, mHandler,
+                            Activity.RESULT_OK, null, null);
+                    intent.putExtra(SLOW_RECEIVER_EXTRA, 3);
+                    sendOrderedBroadcast(intent, null, mSlowReceiverCompletion, mHandler,
+                            Activity.RESULT_OK, null, null);
+
+                    // Also send a broadcast alarm to evaluate the alarm fast-forward policy
+                    intent.putExtra(SLOW_RECEIVER_EXTRA, 4);
+                    PendingIntent pi = PendingIntent.getBroadcast(ActivityTestMain.this, 1, intent, 0);
+                    AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
+                    long now = SystemClock.elapsedRealtime();
+                    Log.i(TAG, "Setting alarm for now + 5 seconds");
+                    am.setExact(AlarmManager.ELAPSED_REALTIME, now + 5_000, pi);
+                } break;
+                case MSG_REPLACE_BROADCAST: {
+                    Intent intent = new Intent(ActivityTestMain.this, SlowReceiver.class);
+                    intent.setAction(SLOW_RECEIVER_ACTION);
+                    intent.putExtra(SLOW_RECEIVER_EXTRA, 1);
+                    sendOrderedBroadcast(intent, null, mSlowReceiverCompletion, mHandler,
+                            Activity.RESULT_OK, null, null);
+                    intent.putExtra(SLOW_RECEIVER_EXTRA, 2);
+                    sendOrderedBroadcast(intent, null, mSlowReceiverCompletion, mHandler,
+                            Activity.RESULT_OK, null, null);
+                    intent.putExtra(SLOW_RECEIVER_EXTRA, 5038);
+                    intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
+                    sendOrderedBroadcast(intent, null, mSlowReceiverCompletion, mHandler,
+                            Activity.RESULT_OK, null, null);
+                } break;
             }
             super.handleMessage(msg);
         }
     };
 
+    final BroadcastReceiver mSlowReceiverCompletion = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            final int extra = intent.getIntExtra(SLOW_RECEIVER_EXTRA, -1);
+            final String msg = "Slow receiver " + extra + " completed";
+            Toast.makeText(ActivityTestMain.this, msg, Toast.LENGTH_LONG)
+                    .show();
+            Log.i(TAG, msg);
+        }
+    };
+
     class BroadcastResultReceiver extends BroadcastReceiver {
         @Override
         public void onReceive(Context context, Intent intent) {
@@ -369,6 +433,12 @@
                 return true;
             }
         });
+        menu.add("Replace broadcast").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
+            @Override public boolean onMenuItemClick(MenuItem item) {
+                scheduleReplaceBroadcast();
+                return true;
+            }
+        });
         menu.add("Stack Doc").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
             @Override public boolean onMenuItemClick(MenuItem item) {
                 ActivityManager.AppTask task = findDocTask();
@@ -387,6 +457,18 @@
                 return true;
             }
         });
+        menu.add("Slow receiver").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
+            @Override public boolean onMenuItemClick(MenuItem item) {
+                scheduleSlowReceiver();
+                return true;
+            }
+        });
+        menu.add("Slow alarm receiver").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
+            @Override public boolean onMenuItemClick(MenuItem item) {
+                scheduleSlowAlarmReceiver();
+                return true;
+            }
+        });
         menu.add("Spam!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
             @Override public boolean onMenuItemClick(MenuItem item) {
                 scheduleSpam(false);
@@ -469,6 +551,7 @@
     protected void onStop() {
         super.onStop();
         mHandler.removeMessages(MSG_SPAM_ALARM);
+        mHandler.removeMessages(MSG_SLOW_RECEIVER);
         for (ServiceConnection conn : mConnections) {
             unbindService(conn);
         }
@@ -544,6 +627,21 @@
         mHandler.sendMessageDelayed(msg, delay);
     }
 
+    void scheduleSlowReceiver() {
+        mHandler.removeMessages(MSG_SLOW_RECEIVER);
+        mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_SLOW_RECEIVER), 500);
+    }
+
+    void scheduleSlowAlarmReceiver() {
+        mHandler.removeMessages(MSG_SLOW_ALARM_RECEIVER);
+        mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_SLOW_ALARM_RECEIVER), 500);
+    }
+
+    void scheduleReplaceBroadcast() {
+        mHandler.removeMessages(MSG_REPLACE_BROADCAST);
+        mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_REPLACE_BROADCAST), 500);
+    }
+
     private View scrollWrap(View view) {
         ScrollView scroller = new ScrollView(this);
         scroller.addView(view, new ScrollView.LayoutParams(ScrollView.LayoutParams.MATCH_PARENT,
diff --git a/tests/ActivityTests/src/com/google/android/test/activity/SlowReceiver.java b/tests/ActivityTests/src/com/google/android/test/activity/SlowReceiver.java
new file mode 100644
index 0000000..0437a28
--- /dev/null
+++ b/tests/ActivityTests/src/com/google/android/test/activity/SlowReceiver.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.android.test.activity;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.SystemClock;
+import android.util.Log;
+
+public class SlowReceiver extends BroadcastReceiver {
+    private static final String TAG = "SlowReceiver";
+    private static final long RECEIVER_DELAY = 6_000;
+
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        final int extra = intent.getIntExtra(ActivityTestMain.SLOW_RECEIVER_EXTRA, -1);
+        if (extra == 1) {
+            Log.i(TAG, "Received broadcast 1; delaying return by " + RECEIVER_DELAY + " ms");
+            long now = SystemClock.elapsedRealtime();
+            final long end = now + RECEIVER_DELAY;
+            while (now < end) {
+                try {
+                    Thread.sleep(end - now);
+                } catch (InterruptedException e) { }
+                now = SystemClock.elapsedRealtime();
+            }
+        } else {
+            Log.i(TAG, "Extra parameter not 1, returning immediately");
+        }
+        Log.i(TAG, "Returning from onReceive()");
+    }
+}
diff --git a/tests/FlickerTests/lib/src/com/android/server/wm/flicker/AutomationUtils.java b/tests/FlickerTests/lib/src/com/android/server/wm/flicker/AutomationUtils.java
index 6bac675..6306f0e 100644
--- a/tests/FlickerTests/lib/src/com/android/server/wm/flicker/AutomationUtils.java
+++ b/tests/FlickerTests/lib/src/com/android/server/wm/flicker/AutomationUtils.java
@@ -173,7 +173,7 @@
             BySelector splitscreenButtonSelector = By.text("Split screen");
             UiObject2 splitscreenButton = device.wait(Until.findObject(splitscreenButtonSelector),
                     FIND_TIMEOUT);
-            assertNotNull("Unable to find Split screen button in Overview", overviewIcon);
+            assertNotNull("Unable to find Split screen button in Overview", splitscreenButton);
             splitscreenButton.click();
         } else {
             // Classic long press recents
diff --git a/tests/FrameworkPerf/AndroidManifest.xml b/tests/FrameworkPerf/AndroidManifest.xml
index ca25386..4fd2043 100644
--- a/tests/FrameworkPerf/AndroidManifest.xml
+++ b/tests/FrameworkPerf/AndroidManifest.xml
@@ -14,7 +14,7 @@
             </intent-filter>
         </activity>
         <service android:name="SchedulerService"
-            android:foregroundServiceType="sync">
+                 android:foregroundServiceType="dataSync|mediaPlayback|phoneCall|location|connectedDevice">
         </service>
         <service android:name="TestService" android:process=":test">
         </service>
@@ -23,7 +23,6 @@
         <receiver android:name="Receiver" android:exported="true">
         </receiver>
     </application>
-
     <instrumentation android:name="android.test.InstrumentationTestRunner"
         android:targetPackage="com.android.frameworkperf"
         android:label="Framework Perf Runner"
diff --git a/tests/HwAccelerationTest/AndroidManifest.xml b/tests/HwAccelerationTest/AndroidManifest.xml
index f330b83..1a4ec94 100644
--- a/tests/HwAccelerationTest/AndroidManifest.xml
+++ b/tests/HwAccelerationTest/AndroidManifest.xml
@@ -1027,5 +1027,15 @@
             </intent-filter>
         </activity>
 
+        <activity
+            android:name="PositionListenerActivity"
+            android:label="RenderNode/PositionListener"
+            android:screenOrientation="fullSensor">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.android.test.hwui.TEST" />
+            </intent-filter>
+        </activity>
+
     </application>
 </manifest>
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/PositionListenerActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/PositionListenerActivity.java
new file mode 100644
index 0000000..316aad3
--- /dev/null
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/PositionListenerActivity.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.test.hwui;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.RenderNode;
+import android.os.Bundle;
+import android.widget.LinearLayout;
+import android.widget.ProgressBar;
+import android.widget.ScrollView;
+import android.widget.TextView;
+
+@SuppressWarnings({"UnusedDeclaration"})
+public class PositionListenerActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        final LinearLayout layout = new LinearLayout(this);
+        layout.setOrientation(LinearLayout.VERTICAL);
+
+        ProgressBar spinner = new ProgressBar(this, null, android.R.attr.progressBarStyleLarge);
+        layout.addView(spinner);
+
+        ScrollView scrollingThing = new ScrollView(this);
+        scrollingThing.addView(new MyPositionReporter(this));
+        layout.addView(scrollingThing);
+
+        setContentView(layout);
+    }
+
+    static class MyPositionReporter extends TextView implements RenderNode.PositionUpdateListener {
+        RenderNode mNode;
+        int mCurrentCount = 0;
+        int mTranslateY = 0;
+
+        MyPositionReporter(Context c) {
+            super(c);
+            mNode = new RenderNode("positionListener");
+            mNode.requestPositionUpdates(this);
+            setTextAlignment(TEXT_ALIGNMENT_VIEW_START);
+        }
+
+        @Override
+        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+            setMeasuredDimension(getMeasuredWidth(), 10000);
+        }
+
+        @Override
+        protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+            mNode.setLeftTopRightBottom(left, top, right, bottom);
+        }
+
+        @Override
+        protected void onDraw(Canvas canvas) {
+            ScrollView parent = (ScrollView) getParent();
+            canvas.translate(0, parent.getScrollY());
+            super.onDraw(canvas);
+            canvas.translate(0, -parent.getScrollY());
+            // Inject our listener proxy
+            canvas.drawRenderNode(mNode);
+        }
+
+        @Override
+        public void positionChanged(long frameNumber, int left, int top, int right, int bottom) {
+            post(() -> {
+                mCurrentCount++;
+                setText(String.format("%d: Position [%d, %d, %d, %d]", mCurrentCount,
+                        left, top, right, bottom));
+            });
+        }
+
+        @Override
+        public void positionLost(long frameNumber) {
+            post(() -> {
+                mCurrentCount++;
+                setText(mCurrentCount + " No position");
+            });
+        }
+    }
+}
diff --git a/tests/JankBench/Android.mk b/tests/JankBench/Android.mk
index 75282ba..89c21b7 100644
--- a/tests/JankBench/Android.mk
+++ b/tests/JankBench/Android.mk
@@ -19,7 +19,7 @@
 
 
 LOCAL_STATIC_ANDROID_LIBRARIES := \
-    androidx.design_design \
+    com.google.android.material_material \
     androidx.legacy_legacy-support-v4 \
     androidx.appcompat_appcompat \
     androidx.cardview_cardview \
diff --git a/tests/JankBench/app/src/main/java/com/android/benchmark/app/HomeActivity.java b/tests/JankBench/app/src/main/java/com/android/benchmark/app/HomeActivity.java
index 47db602..4de51fb 100644
--- a/tests/JankBench/app/src/main/java/com/android/benchmark/app/HomeActivity.java
+++ b/tests/JankBench/app/src/main/java/com/android/benchmark/app/HomeActivity.java
@@ -19,22 +19,24 @@
 import android.content.Intent;
 import android.os.AsyncTask;
 import android.os.Bundle;
-import android.support.design.widget.FloatingActionButton;
-import androidx.appcompat.app.AppCompatActivity;
-import androidx.appcompat.widget.Toolbar;
 import android.view.LayoutInflater;
-import android.view.View;
 import android.view.Menu;
 import android.view.MenuItem;
+import android.view.View;
 import android.view.ViewGroup;
 import android.widget.Button;
 import android.widget.ExpandableListView;
 import android.widget.Toast;
 
-import com.android.benchmark.registry.BenchmarkRegistry;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.Toolbar;
+
 import com.android.benchmark.R;
+import com.android.benchmark.registry.BenchmarkRegistry;
 import com.android.benchmark.results.GlobalResultsStore;
 
+import com.google.android.material.floatingactionbutton.FloatingActionButton;
+
 import java.io.IOException;
 import java.util.LinkedList;
 import java.util.Queue;
diff --git a/tests/JankBench/app/src/main/res/layout/activity_home.xml b/tests/JankBench/app/src/main/res/layout/activity_home.xml
index fb30747..160d9d7 100644
--- a/tests/JankBench/app/src/main/res/layout/activity_home.xml
+++ b/tests/JankBench/app/src/main/res/layout/activity_home.xml
@@ -23,7 +23,7 @@
     android:fitsSystemWindows="true"
     tools:context=".app.HomeActivity">
 
-    <android.support.design.widget.AppBarLayout
+    <com.google.android.material.appbar.AppBarLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:theme="@style/AppTheme.AppBarOverlay">
@@ -35,7 +35,7 @@
             android:background="?attr/colorPrimary"
             app:popupTheme="@style/AppTheme.PopupOverlay" />
 
-    </android.support.design.widget.AppBarLayout>
+    </com.google.android.material.appbar.AppBarLayout>
 
     <include layout="@layout/content_main" />
 
diff --git a/tests/JankBench/app/src/main/res/layout/fragment_dashboard.xml b/tests/JankBench/app/src/main/res/layout/fragment_dashboard.xml
index 3c72dc9..2f4813f 100644
--- a/tests/JankBench/app/src/main/res/layout/fragment_dashboard.xml
+++ b/tests/JankBench/app/src/main/res/layout/fragment_dashboard.xml
@@ -22,14 +22,14 @@
     android:layout_height="fill_parent"
     android:fitsSystemWindows="true">
 
-    <android.support.design.widget.AppBarLayout
+    <com.google.android.material.appbar.AppBarLayout
         android:id="@+id/appbar"
         android:layout_width="match_parent"
         android:layout_height="@dimen/detail_backdrop_height"
         android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
         android:fitsSystemWindows="true">
 
-        <android.support.design.widget.CollapsingToolbarLayout
+        <com.google.android.material.appbar.CollapsingToolbarLayout
             android:id="@+id/collapsing_toolbar"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
@@ -55,9 +55,9 @@
                 android:fitsSystemWindows="true"
                 app:layout_collapseMode="parallax" />
 
-        </android.support.design.widget.CollapsingToolbarLayout>
+        </com.google.android.material.appbar.CollapsingToolbarLayout>
 
-    </android.support.design.widget.AppBarLayout>
+    </com.google.android.material.appbar.AppBarLayout>
 
     <androidx.core.widget.NestedScrollView
         android:layout_width="match_parent"
@@ -78,7 +78,7 @@
 
     </androidx.core.widget.NestedScrollView>
 
-    <android.support.design.widget.FloatingActionButton
+    <com.google.android.material.floatingactionbutton.FloatingActionButton
         android:id="@+id/start_button"
         android:layout_height="wrap_content"
         android:layout_width="wrap_content"
diff --git a/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java b/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java
index 86af642..77cd62e 100644
--- a/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java
+++ b/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java
@@ -22,6 +22,7 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
+import android.content.pm.VersionedPackage;
 import android.os.test.TestLooper;
 import android.support.test.InstrumentationRegistry;
 
@@ -47,6 +48,7 @@
     private static final String APP_B = "com.package.b";
     private static final String APP_C = "com.package.c";
     private static final String APP_D = "com.package.d";
+    private static final long VERSION_CODE = 1L;
     private static final String OBSERVER_NAME_1 = "observer1";
     private static final String OBSERVER_NAME_2 = "observer2";
     private static final String OBSERVER_NAME_3 = "observer3";
@@ -193,7 +195,7 @@
 
         // Then fail APP_A below the threshold
         for (int i = 0; i < TRIGGER_FAILURE_COUNT - 1; i++) {
-            watchdog.onPackageFailure(new String[]{APP_A});
+            watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE)));
         }
 
         // Run handler so package failures are dispatched to observers
@@ -209,12 +211,10 @@
      * the failed packages.
      */
     @Test
-    public void testPackageFailureNotifyNone() throws Exception {
+    public void testPackageFailureDifferentPackageNotifyNone() throws Exception {
         PackageWatchdog watchdog = createWatchdog();
-        TestObserver observer1 = new TestObserver(OBSERVER_NAME_1,
-                PackageHealthObserverImpact.USER_IMPACT_HIGH);
-        TestObserver observer2 = new TestObserver(OBSERVER_NAME_2,
-                PackageHealthObserverImpact.USER_IMPACT_HIGH);
+        TestObserver observer1 = new TestObserver(OBSERVER_NAME_1);
+        TestObserver observer2 = new TestObserver(OBSERVER_NAME_2);
 
 
         watchdog.startObservingHealth(observer2, Arrays.asList(APP_A), SHORT_DURATION);
@@ -222,7 +222,7 @@
 
         // Then fail APP_C (not observed) above the threshold
         for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) {
-            watchdog.onPackageFailure(new String[]{APP_C});
+            watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_C, VERSION_CODE)));
         }
 
         // Run handler so package failures are dispatched to observers
@@ -234,6 +234,41 @@
     }
 
     /**
+     * Test package failure and does not notify any observer because the failed package version
+     * does not match the available rollback-from-version.
+     */
+    @Test
+    public void testPackageFailureDifferentVersionNotifyNone() throws Exception {
+        PackageWatchdog watchdog = createWatchdog();
+        long differentVersionCode = 2L;
+        TestObserver observer = new TestObserver(OBSERVER_NAME_1) {
+                @Override
+                public int onHealthCheckFailed(VersionedPackage versionedPackage) {
+                    if (versionedPackage.getVersionCode() == VERSION_CODE) {
+                        // Only rollback for specific versionCode
+                        return PackageHealthObserverImpact.USER_IMPACT_MEDIUM;
+                    }
+                    return PackageHealthObserverImpact.USER_IMPACT_NONE;
+                }
+            };
+
+        watchdog.startObservingHealth(observer, Arrays.asList(APP_A), SHORT_DURATION);
+
+        // Then fail APP_A (different version) above the threshold
+        for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) {
+            watchdog.onPackageFailure(Arrays.asList(
+                            new VersionedPackage(APP_A, differentVersionCode)));
+        }
+
+        // Run handler so package failures are dispatched to observers
+        mTestLooper.dispatchAll();
+
+        // Verify that observers are not notified
+        assertEquals(0, observer.mFailedPackages.size());
+    }
+
+
+    /**
      * Test package failure and notifies only least impact observers.
      */
     @Test
@@ -260,7 +295,10 @@
 
         // Then fail all apps above the threshold
         for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) {
-            watchdog.onPackageFailure(new String[]{APP_A, APP_B, APP_C, APP_D});
+            watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE),
+                    new VersionedPackage(APP_B, VERSION_CODE),
+                    new VersionedPackage(APP_C, VERSION_CODE),
+                    new VersionedPackage(APP_D, VERSION_CODE)));
         }
 
         // Run handler so package failures are dispatched to observers
@@ -297,7 +335,7 @@
      * <ul>
      */
     @Test
-    public void testPackageFailureNotifyLeastSuccessively() throws Exception {
+    public void testPackageFailureNotifyLeastImpactSuccessively() throws Exception {
         PackageWatchdog watchdog = createWatchdog();
         TestObserver observerFirst = new TestObserver(OBSERVER_NAME_1,
                 PackageHealthObserverImpact.USER_IMPACT_LOW);
@@ -310,7 +348,7 @@
 
         // Then fail APP_A above the threshold
         for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) {
-            watchdog.onPackageFailure(new String[]{APP_A});
+            watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE)));
         }
         // Run handler so package failures are dispatched to observers
         mTestLooper.dispatchAll();
@@ -327,7 +365,7 @@
 
         // Then fail APP_A again above the threshold
         for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) {
-            watchdog.onPackageFailure(new String[]{APP_A});
+            watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE)));
         }
         // Run handler so package failures are dispatched to observers
         mTestLooper.dispatchAll();
@@ -344,7 +382,7 @@
 
         // Then fail APP_A again above the threshold
         for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) {
-            watchdog.onPackageFailure(new String[]{APP_A});
+            watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE)));
         }
         // Run handler so package failures are dispatched to observers
         mTestLooper.dispatchAll();
@@ -361,7 +399,7 @@
 
         // Then fail APP_A again above the threshold
         for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) {
-            watchdog.onPackageFailure(new String[]{APP_A});
+            watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE)));
         }
         // Run handler so package failures are dispatched to observers
         mTestLooper.dispatchAll();
@@ -388,7 +426,7 @@
 
         // Then fail APP_A above the threshold
         for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) {
-            watchdog.onPackageFailure(new String[]{APP_A});
+            watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE)));
         }
 
         // Run handler so package failures are dispatched to observers
@@ -420,12 +458,12 @@
             mImpact = impact;
         }
 
-        public int onHealthCheckFailed(String packageName) {
+        public int onHealthCheckFailed(VersionedPackage versionedPackage) {
             return mImpact;
         }
 
-        public boolean execute(String packageName) {
-            mFailedPackages.add(packageName);
+        public boolean execute(VersionedPackage versionedPackage) {
+            mFailedPackages.add(versionedPackage.getPackageName());
             return true;
         }
 
diff --git a/tests/RollbackTest/Android.bp b/tests/RollbackTest/Android.bp
new file mode 100644
index 0000000..3d57d56
--- /dev/null
+++ b/tests/RollbackTest/Android.bp
@@ -0,0 +1,64 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+android_app {
+    name: "RollbackTestAppAv1",
+    manifest: "TestApp/Av1.xml",
+    sdk_version: "current",
+    srcs: ["TestApp/src/**/*.java"],
+}
+
+android_app {
+    name: "RollbackTestAppAv2",
+    manifest: "TestApp/Av2.xml",
+    sdk_version: "current",
+    srcs: ["TestApp/src/**/*.java"],
+}
+
+android_app {
+    name: "RollbackTestAppACrashingV2",
+    manifest: "TestApp/ACrashingV2.xml",
+    sdk_version: "current",
+    srcs: ["TestApp/src/**/*.java"],
+}
+
+android_app {
+    name: "RollbackTestAppBv1",
+    manifest: "TestApp/Bv1.xml",
+    sdk_version: "current",
+    srcs: ["TestApp/src/**/*.java"],
+}
+
+android_app {
+    name: "RollbackTestAppBv2",
+    manifest: "TestApp/Bv2.xml",
+    sdk_version: "current",
+    srcs: ["TestApp/src/**/*.java"],
+}
+
+android_test {
+    name: "RollbackTest",
+    srcs: ["src/**/*.java"],
+    static_libs: ["android-support-test"],
+    test_suites: ["general-tests"],
+    java_resources: [
+        ":RollbackTestAppAv1",
+        ":RollbackTestAppAv2",
+        ":RollbackTestAppACrashingV2",
+        ":RollbackTestAppBv1",
+        ":RollbackTestAppBv2",
+    ],
+    test_config: "RollbackTest.xml",
+    sdk_version: "system_current",
+}
diff --git a/tests/RollbackTest/Android.mk b/tests/RollbackTest/Android.mk
deleted file mode 100644
index 780bb24..0000000
--- a/tests/RollbackTest/Android.mk
+++ /dev/null
@@ -1,94 +0,0 @@
-# Copyright (C) 2018 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH:= $(call my-dir)
-
-# RollbackTestAppAv1.apk
-include $(CLEAR_VARS)
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-LOCAL_SDK_VERSION := current
-LOCAL_SRC_FILES := $(call all-java-files-under, TestApp/src)
-LOCAL_MANIFEST_FILE := TestApp/Av1.xml
-LOCAL_PACKAGE_NAME := RollbackTestAppAv1
-include $(BUILD_PACKAGE)
-ROLLBACK_TEST_APP_AV1 := $(LOCAL_INSTALLED_MODULE)
-
-# RollbackTestAppAv2.apk
-include $(CLEAR_VARS)
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-LOCAL_SDK_VERSION := current
-LOCAL_SRC_FILES := $(call all-java-files-under, TestApp/src)
-LOCAL_MANIFEST_FILE := TestApp/Av2.xml
-LOCAL_PACKAGE_NAME := RollbackTestAppAv2
-include $(BUILD_PACKAGE)
-ROLLBACK_TEST_APP_AV2 := $(LOCAL_INSTALLED_MODULE)
-
-# RollbackTestAppACrashingV2.apk
-include $(CLEAR_VARS)
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-LOCAL_SDK_VERSION := current
-LOCAL_SRC_FILES := $(call all-java-files-under, TestApp/src)
-LOCAL_MANIFEST_FILE := TestApp/ACrashingV2.xml
-LOCAL_PACKAGE_NAME := RollbackTestAppACrashingV2
-include $(BUILD_PACKAGE)
-ROLLBACK_TEST_APP_A_CRASHING_V2 := $(LOCAL_INSTALLED_MODULE)
-
-# RollbackTestAppBv1.apk
-include $(CLEAR_VARS)
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-LOCAL_SDK_VERSION := current
-LOCAL_SRC_FILES := $(call all-java-files-under, TestApp/src)
-LOCAL_MANIFEST_FILE := TestApp/Bv1.xml
-LOCAL_PACKAGE_NAME := RollbackTestAppBv1
-include $(BUILD_PACKAGE)
-ROLLBACK_TEST_APP_BV1 := $(LOCAL_INSTALLED_MODULE)
-
-# RollbackTestAppBv2.apk
-include $(CLEAR_VARS)
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-LOCAL_SDK_VERSION := current
-LOCAL_SRC_FILES := $(call all-java-files-under, TestApp/src)
-LOCAL_MANIFEST_FILE := TestApp/Bv2.xml
-LOCAL_PACKAGE_NAME := RollbackTestAppBv2
-include $(BUILD_PACKAGE)
-ROLLBACK_TEST_APP_BV2 := $(LOCAL_INSTALLED_MODULE)
-
-# RollbackTest
-include $(CLEAR_VARS)
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_PACKAGE_NAME := RollbackTest
-LOCAL_MODULE_TAGS := tests
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
-LOCAL_COMPATIBILITY_SUITE := general-tests
-LOCAL_JAVA_RESOURCE_FILES := \
-  $(ROLLBACK_TEST_APP_AV1) \
-  $(ROLLBACK_TEST_APP_AV2) \
-  $(ROLLBACK_TEST_APP_A_CRASHING_V2) \
-  $(ROLLBACK_TEST_APP_BV1) \
-  $(ROLLBACK_TEST_APP_BV2)
-LOCAL_SDK_VERSION := system_current
-LOCAL_TEST_CONFIG := RollbackTest.xml
-include $(BUILD_PACKAGE)
-
-# Clean up local variables
-ROLLBACK_TEST_APP_AV1 :=
-ROLLBACK_TEST_APP_AV2 :=
-ROLLBACK_TEST_APP_A_CRASHING_V2 :=
-ROLLBACK_TEST_APP_BV1 :=
-ROLLBACK_TEST_APP_BV2 :=
diff --git a/tests/RollbackTest/TestApp/src/com/android/tests/rollback/testapp/CrashingMainActivity.java b/tests/RollbackTest/TestApp/src/com/android/tests/rollback/testapp/CrashingMainActivity.java
index 02a439b..2310c82 100644
--- a/tests/RollbackTest/TestApp/src/com/android/tests/rollback/testapp/CrashingMainActivity.java
+++ b/tests/RollbackTest/TestApp/src/com/android/tests/rollback/testapp/CrashingMainActivity.java
@@ -17,17 +17,30 @@
 package com.android.tests.rollback.testapp;
 
 import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
 import android.os.Bundle;
 
 /**
  * A crashing test app for testing apk rollback support.
  */
 public class CrashingMainActivity extends Activity {
-
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-
+        incrementCountAndBroadcast();
         throw new RuntimeException("Intended force crash");
     }
+
+    public void incrementCountAndBroadcast() {
+        SharedPreferences preferences = getSharedPreferences("prefs", Context.MODE_PRIVATE);
+        SharedPreferences.Editor editor = preferences.edit();
+        int count = preferences.getInt("crash_count", 0);
+        editor.putInt("crash_count", ++count).commit();
+
+        Intent intent = new Intent("com.android.tests.rollback.CRASH");
+        intent.putExtra("count", count);
+        sendBroadcast(intent);
+    }
 }
diff --git a/tests/RollbackTest/src/com/android/tests/rollback/RollbackTest.java b/tests/RollbackTest/src/com/android/tests/rollback/RollbackTest.java
index 0493ef8..ace0e6d 100644
--- a/tests/RollbackTest/src/com/android/tests/rollback/RollbackTest.java
+++ b/tests/RollbackTest/src/com/android/tests/rollback/RollbackTest.java
@@ -17,11 +17,13 @@
 package com.android.tests.rollback;
 
 import android.Manifest;
+import android.app.ActivityManager;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.pm.VersionedPackage;
 import android.content.rollback.PackageRollbackInfo;
 import android.content.rollback.RollbackInfo;
 import android.content.rollback.RollbackManager;
@@ -40,9 +42,11 @@
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.SynchronousQueue;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -303,14 +307,15 @@
                     rm.getAvailableRollbacks(), TEST_APP_A);
 
             // Roll back the app.
-            RollbackTestUtils.rollback(rollback.getRollbackId());
+            VersionedPackage cause = new VersionedPackage(
+                    "com.android.tests.rollback.testapp.Foo", 42);
+            RollbackTestUtils.rollback(rollback.getRollbackId(), cause);
             assertEquals(1, RollbackTestUtils.getInstalledVersion(TEST_APP_A));
 
             // Verify the recent rollback has been recorded.
             rollback = getUniqueRollbackInfoForPackage(
                     rm.getRecentlyCommittedRollbacks(), TEST_APP_A);
-            assertNotNull(rollback);
-            assertRollbackInfoEquals(TEST_APP_A, 2, 1, rollback);
+            assertRollbackInfoEquals(TEST_APP_A, 2, 1, rollback, cause);
 
             // Reload the persisted data.
             rm.reloadPersistedData();
@@ -318,8 +323,7 @@
             // Verify the recent rollback is still recorded.
             rollback = getUniqueRollbackInfoForPackage(
                     rm.getRecentlyCommittedRollbacks(), TEST_APP_A);
-            assertNotNull(rollback);
-            assertRollbackInfoEquals(TEST_APP_A, 2, 1, rollback);
+            assertRollbackInfoEquals(TEST_APP_A, 2, 1, rollback, cause);
         } finally {
             RollbackTestUtils.dropShellPermissionIdentity();
         }
@@ -411,7 +415,6 @@
 
     /**
      * Test that app user data is rolled back.
-     * TODO: Stop ignoring this test once user data rollback is supported.
      */
     @Test
     public void testUserDataRollback() throws Exception {
@@ -544,7 +547,7 @@
         try {
             // TODO: What if the implementation checks arguments for non-null
             // first? Then this test isn't valid.
-            rm.commitRollback(0, null);
+            rm.commitRollback(0, Collections.emptyList(), null);
             fail("expected SecurityException");
         } catch (SecurityException e) {
             // Expected.
@@ -566,9 +569,7 @@
     }
 
     /**
-     * Test rollback of multi-package installs.
-     * TODO: Stop ignoring this test once support for multi-package rollback
-     * is implemented.
+     * Test rollback of multi-package installs is implemented.
      */
     @Test
     public void testMultiPackage() throws Exception {
@@ -628,18 +629,23 @@
         assertEquals(versionRolledBackTo, info.getVersionRolledBackTo().getLongVersionCode());
     }
 
-    // TODO(zezeozue): Stop ignoring after fixing race between rolling back and testing version
+    // TODO: Allow installing test app along atomically with module metadata package so that
+    // a failed test app will be flagged as a failed mainline app
     /**
      * Test bad update automatic rollback.
      */
-    @Ignore("Flaky")
+    @Ignore
     @Test
     public void testBadUpdateRollback() throws Exception {
+        BroadcastReceiver crashCountReceiver = null;
+        Context context = InstrumentationRegistry.getContext();
         try {
             RollbackTestUtils.adoptShellPermissionIdentity(
                     Manifest.permission.INSTALL_PACKAGES,
                     Manifest.permission.DELETE_PACKAGES,
-                    Manifest.permission.MANAGE_ROLLBACKS);
+                    Manifest.permission.MANAGE_ROLLBACKS,
+                    Manifest.permission.KILL_BACKGROUND_PROCESSES,
+                    Manifest.permission.RESTART_PACKAGES);
             RollbackManager rm = RollbackTestUtils.getRollbackManager();
 
             // Prep installation of the test apps.
@@ -667,34 +673,70 @@
                     rm.getAvailableRollbacks(), TEST_APP_B);
             assertRollbackInfoEquals(TEST_APP_B, 2, 1, rollbackB);
 
+            BlockingQueue<Integer> crashQueue = new SynchronousQueue<>();
+
+            IntentFilter crashCountFilter = new IntentFilter();
+            crashCountFilter.addAction("com.android.tests.rollback.CRASH");
+            crashCountFilter.addCategory(Intent.CATEGORY_DEFAULT);
+
+            crashCountReceiver = new BroadcastReceiver() {
+                    @Override
+                    public void onReceive(Context context, Intent intent) {
+                        try {
+                            // Sleep long enough for packagewatchdog to be notified of crash
+                            Thread.sleep(1000);
+                            // Kill app and close AppErrorDialog
+                            ActivityManager am = context.getSystemService(ActivityManager.class);
+                            am.killBackgroundProcesses(TEST_APP_A);
+                            // Allow another package launch
+                            crashQueue.offer(intent.getIntExtra("count", 0), 5, TimeUnit.SECONDS);
+                        } catch (InterruptedException e) {
+                            fail("Failed to communicate with test app");
+                        }
+                    }
+                };
+            context.registerReceiver(crashCountReceiver, crashCountFilter);
+
             // Start apps PackageWatchdog#TRIGGER_FAILURE_COUNT times so TEST_APP_A crashes
-            for (int i = 0; i < 5; i++) {
+            Integer crashCount = null;
+            do {
                 RollbackTestUtils.launchPackage(TEST_APP_A);
-                Thread.sleep(1000);
-            }
-            Thread.sleep(1000);
+                crashCount = crashQueue.poll(5, TimeUnit.SECONDS);
+                if (crashCount == null) {
+                    fail("Timed out waiting for crash signal from test app");
+                }
+            } while(crashCount < 5);
 
             // TEST_APP_A is automatically rolled back by the RollbackPackageHealthObserver
             assertEquals(1, RollbackTestUtils.getInstalledVersion(TEST_APP_A));
             // Instrumented app is still the package installer
-            Context context = InstrumentationRegistry.getContext();
             String installer = context.getPackageManager().getInstallerPackageName(TEST_APP_A);
             assertEquals(INSTRUMENTED_APP, installer);
             // TEST_APP_B is untouched
             assertEquals(2, RollbackTestUtils.getInstalledVersion(TEST_APP_B));
         } finally {
             RollbackTestUtils.dropShellPermissionIdentity();
+            if (crashCountReceiver != null) {
+                context.unregisterReceiver(crashCountReceiver);
+            }
         }
     }
 
     // Helper function to test the value of a RollbackInfo with single package
     private void assertRollbackInfoEquals(String packageName,
             long versionRolledBackFrom, long versionRolledBackTo,
-            RollbackInfo info) {
+            RollbackInfo info, VersionedPackage... causePackages) {
         assertNotNull(info);
         assertEquals(1, info.getPackages().size());
         assertPackageRollbackInfoEquals(packageName, versionRolledBackFrom, versionRolledBackTo,
                 info.getPackages().get(0));
+        assertEquals(causePackages.length, info.getCausePackages().size());
+        for (int i = 0; i < causePackages.length; ++i) {
+            assertEquals(causePackages[i].getPackageName(),
+                    info.getCausePackages().get(i).getPackageName());
+            assertEquals(causePackages[i].getLongVersionCode(),
+                    info.getCausePackages().get(i).getLongVersionCode());
+        }
     }
 
     // Helper function to test that the given rollback info is a rollback for
diff --git a/tests/RollbackTest/src/com/android/tests/rollback/RollbackTestUtils.java b/tests/RollbackTest/src/com/android/tests/rollback/RollbackTestUtils.java
index 1478657..60c7a59 100644
--- a/tests/RollbackTest/src/com/android/tests/rollback/RollbackTestUtils.java
+++ b/tests/RollbackTest/src/com/android/tests/rollback/RollbackTestUtils.java
@@ -21,12 +21,14 @@
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageInstaller;
 import android.content.pm.PackageManager;
+import android.content.pm.VersionedPackage;
 import android.content.rollback.RollbackManager;
 import android.support.test.InstrumentationRegistry;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.util.Arrays;
 
 /**
  * Utilities to facilitate testing rollbacks.
@@ -92,10 +94,18 @@
      * Commit the given rollback.
      * @throws AssertionError if the rollback fails.
      */
-    static void rollback(int rollbackId) throws InterruptedException {
+    static void rollback(int rollbackId, VersionedPackage... causePackages)
+            throws InterruptedException {
         RollbackManager rm = getRollbackManager();
-        rm.commitRollback(rollbackId, LocalIntentSender.getIntentSender());
-        assertStatusSuccess(LocalIntentSender.getIntentSenderResult());
+        rm.commitRollback(rollbackId, Arrays.asList(causePackages),
+                LocalIntentSender.getIntentSender());
+        Intent result = LocalIntentSender.getIntentSenderResult();
+        int status = result.getIntExtra(RollbackManager.EXTRA_STATUS,
+                RollbackManager.STATUS_FAILURE);
+        if (status != RollbackManager.STATUS_SUCCESS) {
+            String message = result.getStringExtra(RollbackManager.EXTRA_STATUS_MESSAGE);
+            throw new AssertionError(message);
+        }
     }
 
     /**
diff --git a/tests/UiBench/Android.mk b/tests/UiBench/Android.mk
index 6ec0fbb..608bf2f 100644
--- a/tests/UiBench/Android.mk
+++ b/tests/UiBench/Android.mk
@@ -15,7 +15,7 @@
 LOCAL_USE_AAPT2 := true
 
 LOCAL_STATIC_ANDROID_LIBRARIES := \
-    androidx.design_design \
+    com.google.android.material_material \
     androidx.legacy_legacy-support-v4 \
     androidx.appcompat_appcompat \
     androidx.cardview_cardview \
diff --git a/tests/UiBench/res/layout/activity_navigation_drawer.xml b/tests/UiBench/res/layout/activity_navigation_drawer.xml
index 282fb78..383432a 100644
--- a/tests/UiBench/res/layout/activity_navigation_drawer.xml
+++ b/tests/UiBench/res/layout/activity_navigation_drawer.xml
@@ -27,7 +27,7 @@
         android:layout_width="match_parent"
         android:layout_height="match_parent"/>
 
-    <android.support.design.widget.NavigationView
+    <com.google.android.material.navigation.NavigationView
         android:id="@+id/nav_view"
         android:layout_width="wrap_content"
         android:layout_height="match_parent"
diff --git a/tests/UiBench/res/layout/app_bar_navigation_drawer.xml b/tests/UiBench/res/layout/app_bar_navigation_drawer.xml
index b979134..cf209ac 100644
--- a/tests/UiBench/res/layout/app_bar_navigation_drawer.xml
+++ b/tests/UiBench/res/layout/app_bar_navigation_drawer.xml
@@ -21,7 +21,7 @@
     android:layout_height="match_parent"
     android:fitsSystemWindows="true">
 
-    <android.support.design.widget.AppBarLayout
+    <com.google.android.material.appbar.AppBarLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
@@ -31,6 +31,6 @@
             android:layout_width="match_parent"
             android:layout_height="?attr/actionBarSize"
             android:background="?attr/colorPrimary"/>
-    </android.support.design.widget.AppBarLayout>
+    </com.google.android.material.appbar.AppBarLayout>
 
 </androidx.coordinatorlayout.widget.CoordinatorLayout>
diff --git a/tests/UiBench/src/com/android/test/uibench/ClippedListActivity.java b/tests/UiBench/src/com/android/test/uibench/ClippedListActivity.java
index 6e24ce1..2bf6040 100644
--- a/tests/UiBench/src/com/android/test/uibench/ClippedListActivity.java
+++ b/tests/UiBench/src/com/android/test/uibench/ClippedListActivity.java
@@ -16,18 +16,20 @@
 package com.android.test.uibench;
 
 import android.os.Bundle;
-import android.support.design.widget.NavigationView;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.ListFragment;
-import androidx.core.view.GravityCompat;
-import androidx.drawerlayout.widget.DrawerLayout;
-import androidx.appcompat.app.ActionBarDrawerToggle;
-import androidx.appcompat.app.AppCompatActivity;
-import androidx.appcompat.widget.Toolbar;
 import android.view.MenuItem;
 import android.widget.ArrayAdapter;
 import android.widget.ListAdapter;
 
+import androidx.appcompat.app.ActionBarDrawerToggle;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.Toolbar;
+import androidx.core.view.GravityCompat;
+import androidx.drawerlayout.widget.DrawerLayout;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.ListFragment;
+
+import com.google.android.material.navigation.NavigationView;
+
 public class ClippedListActivity extends AppCompatActivity
         implements NavigationView.OnNavigationItemSelectedListener {
 
diff --git a/tests/UiBench/src/com/android/test/uibench/NavigationDrawerActivity.java b/tests/UiBench/src/com/android/test/uibench/NavigationDrawerActivity.java
index 6a7761ce..7784539 100644
--- a/tests/UiBench/src/com/android/test/uibench/NavigationDrawerActivity.java
+++ b/tests/UiBench/src/com/android/test/uibench/NavigationDrawerActivity.java
@@ -16,13 +16,15 @@
 package com.android.test.uibench;
 
 import android.os.Bundle;
-import android.support.design.widget.NavigationView;
-import androidx.core.view.GravityCompat;
-import androidx.drawerlayout.widget.DrawerLayout;
+import android.view.MenuItem;
+
 import androidx.appcompat.app.ActionBarDrawerToggle;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.appcompat.widget.Toolbar;
-import android.view.MenuItem;
+import androidx.core.view.GravityCompat;
+import androidx.drawerlayout.widget.DrawerLayout;
+
+import com.google.android.material.navigation.NavigationView;
 
 public class NavigationDrawerActivity extends AppCompatActivity
         implements NavigationView.OnNavigationItemSelectedListener {
diff --git a/tests/net/java/android/net/ip/InterfaceControllerTest.java b/tests/net/java/android/net/ip/InterfaceControllerTest.java
new file mode 100644
index 0000000..d27a4f9
--- /dev/null
+++ b/tests/net/java/android/net/ip/InterfaceControllerTest.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.ip;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.net.INetd;
+import android.net.InetAddresses;
+import android.net.InterfaceConfigurationParcel;
+import android.net.LinkAddress;
+import android.net.util.SharedLog;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class InterfaceControllerTest {
+    private static final String TEST_IFACE = "testif";
+    private static final String TEST_IPV4_ADDR = "192.168.123.28";
+    private static final int TEST_PREFIXLENGTH = 31;
+
+    @Mock private INetd mNetd;
+    @Mock private SharedLog mLog;
+    @Captor private ArgumentCaptor<InterfaceConfigurationParcel> mConfigCaptor;
+
+    private InterfaceController mController;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        mController = new InterfaceController(TEST_IFACE, mNetd, mLog);
+
+        doNothing().when(mNetd).interfaceSetCfg(mConfigCaptor.capture());
+    }
+
+    @Test
+    public void testSetIPv4Address() throws Exception {
+        mController.setIPv4Address(
+                new LinkAddress(InetAddresses.parseNumericAddress(TEST_IPV4_ADDR),
+                        TEST_PREFIXLENGTH));
+        verify(mNetd, times(1)).interfaceSetCfg(any());
+        final InterfaceConfigurationParcel parcel = mConfigCaptor.getValue();
+        assertEquals(TEST_IFACE, parcel.ifName);
+        assertEquals(TEST_IPV4_ADDR, parcel.ipv4Addr);
+        assertEquals(TEST_PREFIXLENGTH, parcel.prefixLength);
+        assertEquals("", parcel.hwAddr);
+        assertArrayEquals(new String[0], parcel.flags);
+    }
+
+    @Test
+    public void testClearIPv4Address() throws Exception {
+        mController.clearIPv4Address();
+        verify(mNetd, times(1)).interfaceSetCfg(any());
+        final InterfaceConfigurationParcel parcel = mConfigCaptor.getValue();
+        assertEquals(TEST_IFACE, parcel.ifName);
+        assertEquals("0.0.0.0", parcel.ipv4Addr);
+        assertEquals(0, parcel.prefixLength);
+        assertEquals("", parcel.hwAddr);
+        assertArrayEquals(new String[0], parcel.flags);
+    }
+}
diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java
index 923c7dd..50468cb 100644
--- a/tests/net/java/com/android/server/ConnectivityServiceTest.java
+++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java
@@ -57,6 +57,7 @@
 import static android.net.NetworkPolicyManager.RULE_NONE;
 import static android.net.NetworkPolicyManager.RULE_REJECT_ALL;
 import static android.net.NetworkPolicyManager.RULE_REJECT_METERED;
+import static android.net.shared.NetworkParcelableUtil.fromStableParcelable;
 
 import static com.android.internal.util.TestUtils.waitForIdleHandler;
 import static com.android.internal.util.TestUtils.waitForIdleLooper;
@@ -119,6 +120,7 @@
 import android.net.NetworkInfo;
 import android.net.NetworkInfo.DetailedState;
 import android.net.NetworkMisc;
+import android.net.NetworkParcelable;
 import android.net.NetworkRequest;
 import android.net.NetworkSpecifier;
 import android.net.NetworkStack;
@@ -482,8 +484,8 @@
                 fail(e.getMessage());
             }
 
-            final ArgumentCaptor<Network> nmNetworkCaptor =
-                    ArgumentCaptor.forClass(Network.class);
+            final ArgumentCaptor<NetworkParcelable> nmNetworkCaptor =
+                    ArgumentCaptor.forClass(NetworkParcelable.class);
             final ArgumentCaptor<INetworkMonitorCallbacks> nmCbCaptor =
                     ArgumentCaptor.forClass(INetworkMonitorCallbacks.class);
             doNothing().when(mNetworkStack).makeNetworkMonitor(
@@ -493,7 +495,7 @@
 
             mNetworkAgent = new NetworkAgent(mHandlerThread.getLooper(), mServiceContext,
                     "Mock-" + typeName, mNetworkInfo, mNetworkCapabilities,
-                    linkProperties, mScore, new NetworkMisc()) {
+                    linkProperties, mScore, new NetworkMisc(), NetworkFactory.SerialNumber.NONE) {
                 @Override
                 public void unwanted() { mDisconnected.open(); }
 
@@ -523,7 +525,8 @@
                 }
             };
 
-            assertEquals(mNetworkAgent.netId, nmNetworkCaptor.getValue().netId);
+            assertEquals(
+                    mNetworkAgent.netId, fromStableParcelable(nmNetworkCaptor.getValue()).netId);
             mNmCallbacks = nmCbCaptor.getValue();
 
             try {
@@ -722,7 +725,7 @@
     /**
      * A NetworkFactory that allows tests to wait until any in-flight NetworkRequest add or remove
      * operations have been processed. Before ConnectivityService can add or remove any requests,
-     * the factory must be told to expect those operations by calling expectAddRequests or
+     * the factory must be told to expect those operations by calling expectAddRequestsWithScores or
      * expectRemoveRequests.
      */
     private static class MockNetworkFactory extends NetworkFactory {
@@ -731,19 +734,22 @@
         private final AtomicBoolean mNetworkStarted = new AtomicBoolean(false);
 
         // Used to expect that requests be removed or added on a separate thread, without sleeping.
-        // Callers can call either expectAddRequests() or expectRemoveRequests() exactly once, then
-        // cause some other thread to add or remove requests, then call waitForRequests(). We can
-        // either expect requests to be added or removed, but not both, because CountDownLatch can
-        // only count in one direction.
-        private CountDownLatch mExpectations;
+        // Callers can call either expectAddRequestsWithScores() or expectRemoveRequests() exactly
+        // once, then cause some other thread to add or remove requests, then call
+        // waitForRequests().
+        // It is not possible to wait for both add and remove requests. When adding, the queue
+        // contains the expected score. When removing, the value is unused, all matters is the
+        // number of objects in the queue.
+        private final LinkedBlockingQueue<Integer> mExpectations;
 
         // Whether we are currently expecting requests to be added or removed. Valid only if
-        // mExpectations is non-null.
+        // mExpectations is non-empty.
         private boolean mExpectingAdditions;
 
         public MockNetworkFactory(Looper looper, Context context, String logTag,
                 NetworkCapabilities filter) {
             super(looper, context, logTag, filter);
+            mExpectations = new LinkedBlockingQueue<>();
         }
 
         public int getMyRequestCount() {
@@ -775,69 +781,82 @@
         }
 
         @Override
-        protected void handleAddRequest(NetworkRequest request, int score) {
-            // If we're expecting anything, we must be expecting additions.
-            if (mExpectations != null && !mExpectingAdditions) {
-                fail("Can't add requests while expecting requests to be removed");
-            }
+        protected void handleAddRequest(NetworkRequest request, int score,
+                int factorySerialNumber) {
+            synchronized (mExpectations) {
+                final Integer expectedScore = mExpectations.poll(); // null if the queue is empty
 
-            // Add the request.
-            super.handleAddRequest(request, score);
+                assertNotNull("Added more requests than expected (" + request + " score : "
+                        + score + ")", expectedScore);
+                // If we're expecting anything, we must be expecting additions.
+                if (!mExpectingAdditions) {
+                    fail("Can't add requests while expecting requests to be removed");
+                }
+                if (expectedScore != score) {
+                    fail("Expected score was " + expectedScore + " but actual was " + score
+                            + " in added request");
+                }
 
-            // Reduce the number of request additions we're waiting for.
-            if (mExpectingAdditions) {
-                assertTrue("Added more requests than expected", mExpectations.getCount() > 0);
-                mExpectations.countDown();
+                // Add the request.
+                super.handleAddRequest(request, score, factorySerialNumber);
+                mExpectations.notify();
             }
         }
 
         @Override
         protected void handleRemoveRequest(NetworkRequest request) {
-            // If we're expecting anything, we must be expecting removals.
-            if (mExpectations != null && mExpectingAdditions) {
-                fail("Can't remove requests while expecting requests to be added");
-            }
+            synchronized (mExpectations) {
+                final Integer expectedScore = mExpectations.poll(); // null if the queue is empty
 
-            // Remove the request.
-            super.handleRemoveRequest(request);
+                assertTrue("Removed more requests than expected", expectedScore != null);
+                // If we're expecting anything, we must be expecting removals.
+                if (mExpectingAdditions) {
+                    fail("Can't remove requests while expecting requests to be added");
+                }
 
-            // Reduce the number of request removals we're waiting for.
-            if (!mExpectingAdditions) {
-                assertTrue("Removed more requests than expected", mExpectations.getCount() > 0);
-                mExpectations.countDown();
+                // Remove the request.
+                super.handleRemoveRequest(request);
+                mExpectations.notify();
             }
         }
 
         private void assertNoExpectations() {
-            if (mExpectations != null) {
-                fail("Can't add expectation, " + mExpectations.getCount() + " already pending");
+            if (mExpectations.size() != 0) {
+                fail("Can't add expectation, " + mExpectations.size() + " already pending");
             }
         }
 
-        // Expects that count requests will be added.
-        public void expectAddRequests(final int count) {
+        // Expects that requests with the specified scores will be added.
+        public void expectAddRequestsWithScores(final int... scores) {
             assertNoExpectations();
             mExpectingAdditions = true;
-            mExpectations = new CountDownLatch(count);
+            for (int score : scores) {
+                mExpectations.add(score);
+            }
         }
 
         // Expects that count requests will be removed.
         public void expectRemoveRequests(final int count) {
             assertNoExpectations();
             mExpectingAdditions = false;
-            mExpectations = new CountDownLatch(count);
+            for (int i = 0; i < count; ++i) {
+                mExpectations.add(0); // For removals the score is ignored so any value will do.
+            }
         }
 
         // Waits for the expected request additions or removals to happen within a timeout.
         public void waitForRequests() throws InterruptedException {
-            assertNotNull("Nothing to wait for", mExpectations);
-            mExpectations.await(TIMEOUT_MS, TimeUnit.MILLISECONDS);
-            final long count = mExpectations.getCount();
+            final long deadline = SystemClock.elapsedRealtime() + TIMEOUT_MS;
+            synchronized (mExpectations) {
+                while (mExpectations.size() > 0 && SystemClock.elapsedRealtime() < deadline) {
+                    mExpectations.wait(deadline - SystemClock.elapsedRealtime());
+                }
+            }
+            final long count = mExpectations.size();
             final String msg = count + " requests still not " +
                     (mExpectingAdditions ? "added" : "removed") +
                     " after " + TIMEOUT_MS + " ms";
             assertEquals(msg, 0, count);
-            mExpectations = null;
         }
 
         public void waitForNetworkRequests(final int count) throws InterruptedException {
@@ -903,6 +922,7 @@
             mNetworkCapabilities.set(mMockNetworkAgent.getNetworkCapabilities());
             mConnected = true;
             mConfig = new VpnConfig();
+            mConfig.isMetered = false;
         }
 
         @Override
@@ -2268,6 +2288,12 @@
         callback.expectCallback(CallbackState.LOST, mEthernetNetworkAgent);
     }
 
+    private int[] makeIntArray(final int size, final int value) {
+        final int[] array = new int[size];
+        Arrays.fill(array, value);
+        return array;
+    }
+
     private void tryNetworkFactoryRequests(int capability) throws Exception {
         // Verify NOT_RESTRICTED is set appropriately
         final NetworkCapabilities nc = new NetworkRequest.Builder().addCapability(capability)
@@ -2289,7 +2315,7 @@
                 mServiceContext, "testFactory", filter);
         testFactory.setScoreFilter(40);
         ConditionVariable cv = testFactory.getNetworkStartedCV();
-        testFactory.expectAddRequests(1);
+        testFactory.expectAddRequestsWithScores(0);
         testFactory.register();
         testFactory.waitForNetworkRequests(1);
         int expectedRequestCount = 1;
@@ -2300,7 +2326,7 @@
             assertFalse(testFactory.getMyStartRequested());
             NetworkRequest request = new NetworkRequest.Builder().addCapability(capability).build();
             networkCallback = new NetworkCallback();
-            testFactory.expectAddRequests(1);
+            testFactory.expectAddRequestsWithScores(0);  // New request
             mCm.requestNetwork(request, networkCallback);
             expectedRequestCount++;
             testFactory.waitForNetworkRequests(expectedRequestCount);
@@ -2320,7 +2346,7 @@
         // When testAgent connects, ConnectivityService will re-send us all current requests with
         // the new score. There are expectedRequestCount such requests, and we must wait for all of
         // them.
-        testFactory.expectAddRequests(expectedRequestCount);
+        testFactory.expectAddRequestsWithScores(makeIntArray(expectedRequestCount, 50));
         testAgent.connect(false);
         testAgent.addCapability(capability);
         waitFor(cv);
@@ -2328,7 +2354,7 @@
         assertFalse(testFactory.getMyStartRequested());
 
         // Bring in a bunch of requests.
-        testFactory.expectAddRequests(10);
+        testFactory.expectAddRequestsWithScores(makeIntArray(10, 50));
         assertEquals(expectedRequestCount, testFactory.getMyRequestCount());
         ConnectivityManager.NetworkCallback[] networkCallbacks =
                 new ConnectivityManager.NetworkCallback[10];
@@ -2351,8 +2377,11 @@
 
         // Drop the higher scored network.
         cv = testFactory.getNetworkStartedCV();
+        // With the default network disconnecting, the requests are sent with score 0 to factories.
+        testFactory.expectAddRequestsWithScores(makeIntArray(expectedRequestCount, 0));
         testAgent.disconnect();
         waitFor(cv);
+        testFactory.waitForNetworkRequests(expectedRequestCount);
         assertEquals(expectedRequestCount, testFactory.getMyRequestCount());
         assertTrue(testFactory.getMyStartRequested());
 
@@ -3174,22 +3203,23 @@
         testFactory.setScoreFilter(40);
 
         // Register the factory and expect it to start looking for a network.
-        testFactory.expectAddRequests(1);
+        testFactory.expectAddRequestsWithScores(0);  // Score 0 as the request is not served yet.
         testFactory.register();
         testFactory.waitForNetworkRequests(1);
         assertTrue(testFactory.getMyStartRequested());
 
         // Bring up wifi. The factory stops looking for a network.
         mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI);
-        testFactory.expectAddRequests(2);  // Because the default request changes score twice.
+        // Score 60 - 40 penalty for not validated yet, then 60 when it validates
+        testFactory.expectAddRequestsWithScores(20, 60);
         mWiFiNetworkAgent.connect(true);
-        testFactory.waitForNetworkRequests(1);
+        testFactory.waitForRequests();
         assertFalse(testFactory.getMyStartRequested());
 
         ContentResolver cr = mServiceContext.getContentResolver();
 
         // Turn on mobile data always on. The factory starts looking again.
-        testFactory.expectAddRequests(1);
+        testFactory.expectAddRequestsWithScores(0);  // Always on requests comes up with score 0
         setAlwaysOnNetworks(true);
         testFactory.waitForNetworkRequests(2);
         assertTrue(testFactory.getMyStartRequested());
@@ -3197,7 +3227,7 @@
         // Bring up cell data and check that the factory stops looking.
         assertLength(1, mCm.getAllNetworks());
         mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
-        testFactory.expectAddRequests(2);  // Because the cell request changes score twice.
+        testFactory.expectAddRequestsWithScores(10, 50);  // Unvalidated, then validated
         mCellNetworkAgent.connect(true);
         cellNetworkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
         testFactory.waitForNetworkRequests(2);
diff --git a/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java b/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java
index 9578ded..e877a8f 100644
--- a/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java
+++ b/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java
@@ -35,6 +35,7 @@
 import android.net.INetd;
 import android.net.Network;
 import android.net.NetworkCapabilities;
+import android.net.NetworkFactory;
 import android.net.NetworkInfo;
 import android.net.NetworkMisc;
 import android.net.NetworkStack;
@@ -356,7 +357,8 @@
         caps.addCapability(0);
         caps.addTransportType(transport);
         NetworkAgentInfo nai = new NetworkAgentInfo(null, null, new Network(netId), info, null,
-                caps, 50, mCtx, null, mMisc, mConnService, mNetd, mNMS);
+                caps, 50, mCtx, null, mMisc, mConnService, mNetd, mNMS,
+                NetworkFactory.SerialNumber.NONE);
         nai.everValidated = true;
         return nai;
     }
diff --git a/tests/net/java/com/android/server/connectivity/VpnTest.java b/tests/net/java/com/android/server/connectivity/VpnTest.java
index 0b74d87..46de3d0 100644
--- a/tests/net/java/com/android/server/connectivity/VpnTest.java
+++ b/tests/net/java/com/android/server/connectivity/VpnTest.java
@@ -168,6 +168,8 @@
         ApplicationInfo applicationInfo = new ApplicationInfo();
         applicationInfo.targetSdkVersion = VERSION_CODES.CUR_DEVELOPMENT;
         when(mContext.getApplicationInfo()).thenReturn(applicationInfo);
+        when(mPackageManager.getApplicationInfoAsUser(anyString(), anyInt(), anyInt()))
+                .thenReturn(applicationInfo);
 
         doNothing().when(mNetService).registerObserver(any());
     }
@@ -246,17 +248,17 @@
         assertFalse(vpn.getLockdown());
 
         // Set always-on without lockdown.
-        assertTrue(vpn.setAlwaysOnPackage(PKGS[1], false));
+        assertTrue(vpn.setAlwaysOnPackage(PKGS[1], false, Collections.emptyList()));
         assertTrue(vpn.getAlwaysOn());
         assertFalse(vpn.getLockdown());
 
         // Set always-on with lockdown.
-        assertTrue(vpn.setAlwaysOnPackage(PKGS[1], true));
+        assertTrue(vpn.setAlwaysOnPackage(PKGS[1], true, Collections.emptyList()));
         assertTrue(vpn.getAlwaysOn());
         assertTrue(vpn.getLockdown());
 
         // Remove always-on configuration.
-        assertTrue(vpn.setAlwaysOnPackage(null, false));
+        assertTrue(vpn.setAlwaysOnPackage(null, false, Collections.emptyList()));
         assertFalse(vpn.getAlwaysOn());
         assertFalse(vpn.getLockdown());
     }
@@ -270,11 +272,11 @@
         assertUnblocked(vpn, user.start + PKG_UIDS[0], user.start + PKG_UIDS[1], user.start + PKG_UIDS[2], user.start + PKG_UIDS[3]);
 
         // Set always-on without lockdown.
-        assertTrue(vpn.setAlwaysOnPackage(PKGS[1], false));
+        assertTrue(vpn.setAlwaysOnPackage(PKGS[1], false, null));
         assertUnblocked(vpn, user.start + PKG_UIDS[0], user.start + PKG_UIDS[1], user.start + PKG_UIDS[2], user.start + PKG_UIDS[3]);
 
         // Set always-on with lockdown.
-        assertTrue(vpn.setAlwaysOnPackage(PKGS[1], true));
+        assertTrue(vpn.setAlwaysOnPackage(PKGS[1], true, null));
         verify(mNetService).setAllowOnlyVpnForUids(eq(true), aryEq(new UidRange[] {
             new UidRange(user.start, user.start + PKG_UIDS[1] - 1),
             new UidRange(user.start + PKG_UIDS[1] + 1, user.stop)
@@ -283,7 +285,7 @@
         assertUnblocked(vpn, user.start + PKG_UIDS[1]);
 
         // Switch to another app.
-        assertTrue(vpn.setAlwaysOnPackage(PKGS[3], true));
+        assertTrue(vpn.setAlwaysOnPackage(PKGS[3], true, null));
         verify(mNetService).setAllowOnlyVpnForUids(eq(false), aryEq(new UidRange[] {
             new UidRange(user.start, user.start + PKG_UIDS[1] - 1),
             new UidRange(user.start + PKG_UIDS[1] + 1, user.stop)
@@ -297,6 +299,87 @@
     }
 
     @Test
+    public void testLockdownWhitelist() throws Exception {
+        final Vpn vpn = createVpn(primaryUser.id);
+        final UidRange user = UidRange.createForUser(primaryUser.id);
+
+        // Set always-on with lockdown and whitelist app PKGS[2] from lockdown.
+        assertTrue(vpn.setAlwaysOnPackage(PKGS[1], true, Collections.singletonList(PKGS[2])));
+        verify(mNetService).setAllowOnlyVpnForUids(eq(true), aryEq(new UidRange[] {
+                new UidRange(user.start, user.start + PKG_UIDS[1] - 1),
+                new UidRange(user.start + PKG_UIDS[2] + 1, user.stop)
+        }));
+        assertBlocked(vpn, user.start + PKG_UIDS[0], user.start + PKG_UIDS[3]);
+        assertUnblocked(vpn, user.start + PKG_UIDS[1], user.start + PKG_UIDS[2]);
+
+        // Change whitelisted app to PKGS[3].
+        assertTrue(vpn.setAlwaysOnPackage(PKGS[1], true, Collections.singletonList(PKGS[3])));
+        verify(mNetService).setAllowOnlyVpnForUids(eq(false), aryEq(new UidRange[] {
+                new UidRange(user.start + PKG_UIDS[2] + 1, user.stop)
+        }));
+        verify(mNetService).setAllowOnlyVpnForUids(eq(true), aryEq(new UidRange[] {
+                new UidRange(user.start + PKG_UIDS[1] + 1, user.start + PKG_UIDS[3] - 1),
+                new UidRange(user.start + PKG_UIDS[3] + 1, user.stop)
+        }));
+        assertBlocked(vpn, user.start + PKG_UIDS[0], user.start + PKG_UIDS[2]);
+        assertUnblocked(vpn, user.start + PKG_UIDS[1], user.start + PKG_UIDS[3]);
+
+        // Change the VPN app.
+        assertTrue(vpn.setAlwaysOnPackage(PKGS[0], true, Collections.singletonList(PKGS[3])));
+        verify(mNetService).setAllowOnlyVpnForUids(eq(false), aryEq(new UidRange[] {
+                new UidRange(user.start, user.start + PKG_UIDS[1] - 1),
+                new UidRange(user.start + PKG_UIDS[1] + 1, user.start + PKG_UIDS[3] - 1)
+        }));
+        verify(mNetService).setAllowOnlyVpnForUids(eq(true), aryEq(new UidRange[] {
+                new UidRange(user.start, user.start + PKG_UIDS[0] - 1),
+                new UidRange(user.start + PKG_UIDS[0] + 1, user.start + PKG_UIDS[3] - 1)
+        }));
+        assertBlocked(vpn, user.start + PKG_UIDS[1], user.start + PKG_UIDS[2]);
+        assertUnblocked(vpn, user.start + PKG_UIDS[0], user.start + PKG_UIDS[3]);
+
+        // Remove the whitelist.
+        assertTrue(vpn.setAlwaysOnPackage(PKGS[0], true, null));
+        verify(mNetService).setAllowOnlyVpnForUids(eq(false), aryEq(new UidRange[] {
+                new UidRange(user.start + PKG_UIDS[0] + 1, user.start + PKG_UIDS[3] - 1),
+                new UidRange(user.start + PKG_UIDS[3] + 1, user.stop)
+        }));
+        verify(mNetService).setAllowOnlyVpnForUids(eq(true), aryEq(new UidRange[] {
+                new UidRange(user.start + PKG_UIDS[0] + 1, user.stop),
+        }));
+        assertBlocked(vpn, user.start + PKG_UIDS[1], user.start + PKG_UIDS[2],
+                user.start + PKG_UIDS[3]);
+        assertUnblocked(vpn, user.start + PKG_UIDS[0]);
+
+        // Add the whitelist.
+        assertTrue(vpn.setAlwaysOnPackage(PKGS[0], true, Collections.singletonList(PKGS[1])));
+        verify(mNetService).setAllowOnlyVpnForUids(eq(false), aryEq(new UidRange[] {
+                new UidRange(user.start + PKG_UIDS[0] + 1, user.stop)
+        }));
+        verify(mNetService).setAllowOnlyVpnForUids(eq(true), aryEq(new UidRange[] {
+                new UidRange(user.start + PKG_UIDS[0] + 1, user.start + PKG_UIDS[1] - 1),
+                new UidRange(user.start + PKG_UIDS[1] + 1, user.stop)
+        }));
+        assertBlocked(vpn, user.start + PKG_UIDS[2], user.start + PKG_UIDS[3]);
+        assertUnblocked(vpn, user.start + PKG_UIDS[0], user.start + PKG_UIDS[1]);
+
+        // Try whitelisting a package with a comma, should be rejected.
+        assertFalse(vpn.setAlwaysOnPackage(PKGS[0], true, Collections.singletonList("a.b,c.d")));
+
+        // Pass a non-existent packages in the whitelist, they (and only they) should be ignored.
+        // Whitelisted package should change from PGKS[1] to PKGS[2].
+        assertTrue(vpn.setAlwaysOnPackage(PKGS[0], true,
+                Arrays.asList("com.foo.app", PKGS[2], "com.bar.app")));
+        verify(mNetService).setAllowOnlyVpnForUids(eq(false), aryEq(new UidRange[]{
+                new UidRange(user.start + PKG_UIDS[0] + 1, user.start + PKG_UIDS[1] - 1),
+                new UidRange(user.start + PKG_UIDS[1] + 1, user.stop)
+        }));
+        verify(mNetService).setAllowOnlyVpnForUids(eq(true), aryEq(new UidRange[]{
+                new UidRange(user.start + PKG_UIDS[0] + 1, user.start + PKG_UIDS[2] - 1),
+                new UidRange(user.start + PKG_UIDS[2] + 1, user.stop)
+        }));
+    }
+
+    @Test
     public void testLockdownAddingAProfile() throws Exception {
         final Vpn vpn = createVpn(primaryUser.id);
         setMockedUsers(primaryUser);
@@ -310,7 +393,7 @@
         final UidRange profile = UidRange.createForUser(tempProfile.id);
 
         // Set lockdown.
-        assertTrue(vpn.setAlwaysOnPackage(PKGS[3], true));
+        assertTrue(vpn.setAlwaysOnPackage(PKGS[3], true, null));
         verify(mNetService).setAllowOnlyVpnForUids(eq(true), aryEq(new UidRange[] {
             new UidRange(user.start, user.start + PKG_UIDS[3] - 1),
             new UidRange(user.start + PKG_UIDS[3] + 1, user.stop)
@@ -436,7 +519,7 @@
                 .cancelAsUser(anyString(), anyInt(), eq(userHandle));
 
         // Start showing a notification for disconnected once always-on.
-        vpn.setAlwaysOnPackage(PKGS[0], false);
+        vpn.setAlwaysOnPackage(PKGS[0], false, null);
         order.verify(mNotificationManager)
                 .notifyAsUser(anyString(), anyInt(), any(), eq(userHandle));
 
@@ -450,7 +533,7 @@
                 .notifyAsUser(anyString(), anyInt(), any(), eq(userHandle));
 
         // Notification should be cleared after unsetting always-on package.
-        vpn.setAlwaysOnPackage(null, false);
+        vpn.setAlwaysOnPackage(null, false, null);
         order.verify(mNotificationManager).cancelAsUser(anyString(), anyInt(), eq(userHandle));
     }
 
@@ -463,23 +546,28 @@
         final Network wifi = new Network(2);
 
         final Map<Network, NetworkCapabilities> networks = new HashMap<>();
-        networks.put(mobile, new NetworkCapabilities()
-                .addTransportType(TRANSPORT_CELLULAR)
-                .addCapability(NET_CAPABILITY_INTERNET)
-                .addCapability(NET_CAPABILITY_NOT_METERED)
-                .addCapability(NET_CAPABILITY_NOT_CONGESTED)
-                .setLinkDownstreamBandwidthKbps(10));
-        networks.put(wifi, new NetworkCapabilities()
-                .addTransportType(TRANSPORT_WIFI)
-                .addCapability(NET_CAPABILITY_INTERNET)
-                .addCapability(NET_CAPABILITY_NOT_ROAMING)
-                .addCapability(NET_CAPABILITY_NOT_CONGESTED)
-                .setLinkUpstreamBandwidthKbps(20));
+        networks.put(
+                mobile,
+                new NetworkCapabilities()
+                        .addTransportType(TRANSPORT_CELLULAR)
+                        .addCapability(NET_CAPABILITY_INTERNET)
+                        .addCapability(NET_CAPABILITY_NOT_CONGESTED)
+                        .setLinkDownstreamBandwidthKbps(10));
+        networks.put(
+                wifi,
+                new NetworkCapabilities()
+                        .addTransportType(TRANSPORT_WIFI)
+                        .addCapability(NET_CAPABILITY_INTERNET)
+                        .addCapability(NET_CAPABILITY_NOT_METERED)
+                        .addCapability(NET_CAPABILITY_NOT_ROAMING)
+                        .addCapability(NET_CAPABILITY_NOT_CONGESTED)
+                        .setLinkUpstreamBandwidthKbps(20));
         setMockedNetworks(networks);
 
         final NetworkCapabilities caps = new NetworkCapabilities();
 
-        Vpn.updateCapabilities(mConnectivityManager, new Network[] { }, caps);
+        Vpn.updateCapabilities(
+                mConnectivityManager, new Network[] {}, caps, false /* isAlwaysMetered */);
         assertTrue(caps.hasTransport(TRANSPORT_VPN));
         assertFalse(caps.hasTransport(TRANSPORT_CELLULAR));
         assertFalse(caps.hasTransport(TRANSPORT_WIFI));
@@ -489,17 +577,33 @@
         assertTrue(caps.hasCapability(NET_CAPABILITY_NOT_ROAMING));
         assertTrue(caps.hasCapability(NET_CAPABILITY_NOT_CONGESTED));
 
-        Vpn.updateCapabilities(mConnectivityManager, new Network[] { mobile }, caps);
+        Vpn.updateCapabilities(
+                mConnectivityManager,
+                new Network[] {mobile},
+                caps,
+                false /* isAlwaysMetered */);
         assertTrue(caps.hasTransport(TRANSPORT_VPN));
         assertTrue(caps.hasTransport(TRANSPORT_CELLULAR));
         assertFalse(caps.hasTransport(TRANSPORT_WIFI));
         assertEquals(10, caps.getLinkDownstreamBandwidthKbps());
         assertEquals(LINK_BANDWIDTH_UNSPECIFIED, caps.getLinkUpstreamBandwidthKbps());
-        assertTrue(caps.hasCapability(NET_CAPABILITY_NOT_METERED));
+        assertFalse(caps.hasCapability(NET_CAPABILITY_NOT_METERED));
         assertFalse(caps.hasCapability(NET_CAPABILITY_NOT_ROAMING));
         assertTrue(caps.hasCapability(NET_CAPABILITY_NOT_CONGESTED));
 
-        Vpn.updateCapabilities(mConnectivityManager, new Network[] { wifi }, caps);
+        Vpn.updateCapabilities(
+                mConnectivityManager, new Network[] {wifi}, caps, false /* isAlwaysMetered */);
+        assertTrue(caps.hasTransport(TRANSPORT_VPN));
+        assertFalse(caps.hasTransport(TRANSPORT_CELLULAR));
+        assertTrue(caps.hasTransport(TRANSPORT_WIFI));
+        assertEquals(LINK_BANDWIDTH_UNSPECIFIED, caps.getLinkDownstreamBandwidthKbps());
+        assertEquals(20, caps.getLinkUpstreamBandwidthKbps());
+        assertTrue(caps.hasCapability(NET_CAPABILITY_NOT_METERED));
+        assertTrue(caps.hasCapability(NET_CAPABILITY_NOT_ROAMING));
+        assertTrue(caps.hasCapability(NET_CAPABILITY_NOT_CONGESTED));
+
+        Vpn.updateCapabilities(
+                mConnectivityManager, new Network[] {wifi}, caps, true /* isAlwaysMetered */);
         assertTrue(caps.hasTransport(TRANSPORT_VPN));
         assertFalse(caps.hasTransport(TRANSPORT_CELLULAR));
         assertTrue(caps.hasTransport(TRANSPORT_WIFI));
@@ -509,7 +613,11 @@
         assertTrue(caps.hasCapability(NET_CAPABILITY_NOT_ROAMING));
         assertTrue(caps.hasCapability(NET_CAPABILITY_NOT_CONGESTED));
 
-        Vpn.updateCapabilities(mConnectivityManager, new Network[] { mobile, wifi }, caps);
+        Vpn.updateCapabilities(
+                mConnectivityManager,
+                new Network[] {mobile, wifi},
+                caps,
+                false /* isAlwaysMetered */);
         assertTrue(caps.hasTransport(TRANSPORT_VPN));
         assertTrue(caps.hasTransport(TRANSPORT_CELLULAR));
         assertTrue(caps.hasTransport(TRANSPORT_WIFI));
@@ -583,7 +691,9 @@
             doAnswer(invocation -> {
                 final String appName = (String) invocation.getArguments()[0];
                 final int userId = (int) invocation.getArguments()[1];
-                return UserHandle.getUid(userId, packages.get(appName));
+                Integer appId = packages.get(appName);
+                if (appId == null) throw new PackageManager.NameNotFoundException(appName);
+                return UserHandle.getUid(userId, appId);
             }).when(mPackageManager).getPackageUidAsUser(anyString(), anyInt());
         } catch (Exception e) {
         }
diff --git a/tests/net/java/com/android/server/connectivity/tethering/EntitlementManagerTest.java b/tests/net/java/com/android/server/connectivity/tethering/EntitlementManagerTest.java
index 0f72229..ec286759 100644
--- a/tests/net/java/com/android/server/connectivity/tethering/EntitlementManagerTest.java
+++ b/tests/net/java/com/android/server/connectivity/tethering/EntitlementManagerTest.java
@@ -16,8 +16,16 @@
 
 package com.android.server.connectivity.tethering;
 
+import static android.net.ConnectivityManager.TETHERING_USB;
+import static android.net.ConnectivityManager.TETHERING_WIFI;
+import static android.net.ConnectivityManager.TETHER_ERROR_ENTITLEMENT_UNKONWN;
+import static android.net.ConnectivityManager.TETHER_ERROR_NO_ERROR;
+import static android.net.ConnectivityManager.TETHER_ERROR_PROVISION_FAILED;
+
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 import static org.mockito.Matchers.anyBoolean;
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Matchers.eq;
@@ -27,12 +35,22 @@
 import android.content.Context;
 import android.content.res.Resources;
 import android.net.util.SharedLog;
+import android.os.Bundle;
+import android.os.Message;
 import android.os.PersistableBundle;
+import android.os.ResultReceiver;
+import android.os.test.TestLooper;
+import android.provider.Settings;
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 import android.telephony.CarrierConfigManager;
+import android.test.mock.MockContentResolver;
 
 import com.android.internal.R;
+import com.android.internal.util.State;
+import com.android.internal.util.StateMachine;
+import com.android.internal.util.test.BroadcastInterceptingContext;
+import com.android.internal.util.test.FakeSettingsProvider;
 import com.android.server.connectivity.MockableSystemProperties;
 
 import org.junit.After;
@@ -42,6 +60,10 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
+import java.util.ArrayList;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
 @RunWith(AndroidJUnit4.class)
 @SmallTest
 public final class EntitlementManagerTest {
@@ -51,7 +73,6 @@
 
     @Mock private CarrierConfigManager mCarrierConfigManager;
     @Mock private Context mContext;
-    @Mock private ContentResolver mContent;
     @Mock private MockableSystemProperties mSystemProperties;
     @Mock private Resources mResources;
     @Mock private SharedLog mLog;
@@ -59,15 +80,49 @@
     // Like so many Android system APIs, these cannot be mocked because it is marked final.
     // We have to use the real versions.
     private final PersistableBundle mCarrierConfig = new PersistableBundle();
+    private final TestLooper mLooper = new TestLooper();
+    private Context mMockContext;
+    private MockContentResolver mContentResolver;
 
-    private EntitlementManager mEnMgr;
+    private TestStateMachine mSM;
+    private WrappedEntitlementManager mEnMgr;
+
+    private class MockContext extends BroadcastInterceptingContext {
+        MockContext(Context base) {
+            super(base);
+        }
+
+        @Override
+        public Resources getResources() {
+            return mResources;
+        }
+
+        @Override
+        public ContentResolver getContentResolver() {
+            return mContentResolver;
+        }
+    }
+
+    public class WrappedEntitlementManager extends EntitlementManager {
+        public int fakeEntitlementResult = TETHER_ERROR_ENTITLEMENT_UNKONWN;
+        public boolean everRunUiEntitlement = false;
+
+        public WrappedEntitlementManager(Context ctx, StateMachine target,
+                SharedLog log, MockableSystemProperties systemProperties) {
+            super(ctx, target, log, systemProperties);
+        }
+
+        @Override
+        protected void runUiTetherProvisioning(int type, ResultReceiver receiver) {
+            everRunUiEntitlement = true;
+            receiver.send(fakeEntitlementResult, null);
+        }
+    }
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
 
-        when(mContext.getResources()).thenReturn(mResources);
-        when(mContext.getContentResolver()).thenReturn(mContent);
         when(mResources.getStringArray(R.array.config_tether_dhcp_range))
             .thenReturn(new String[0]);
         when(mResources.getStringArray(R.array.config_tether_usb_regexs))
@@ -80,12 +135,21 @@
             .thenReturn(new int[0]);
         when(mLog.forSubComponent(anyString())).thenReturn(mLog);
 
-        mEnMgr = new EntitlementManager(mContext, mLog, mSystemProperties);
-        mEnMgr.updateConfiguration(new TetheringConfiguration(mContext, mLog));
+        mContentResolver = new MockContentResolver();
+        mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
+        mMockContext = new MockContext(mContext);
+        mSM = new TestStateMachine();
+        mEnMgr = new WrappedEntitlementManager(mMockContext, mSM, mLog, mSystemProperties);
+        mEnMgr.updateConfiguration(new TetheringConfiguration(mMockContext, mLog));
     }
 
     @After
-    public void tearDown() throws Exception {}
+    public void tearDown() throws Exception {
+        if (mSM != null) {
+            mSM.quit();
+            mSM = null;
+        }
+    }
 
     private void setupForRequiredProvisioning() {
         // Produce some acceptable looking provision app setting if requested.
@@ -104,7 +168,7 @@
     @Test
     public void canRequireProvisioning() {
         setupForRequiredProvisioning();
-        mEnMgr.updateConfiguration(new TetheringConfiguration(mContext, mLog));
+        mEnMgr.updateConfiguration(new TetheringConfiguration(mMockContext, mLog));
         assertTrue(mEnMgr.isTetherProvisioningRequired());
     }
 
@@ -113,7 +177,7 @@
         setupForRequiredProvisioning();
         when(mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE))
             .thenReturn(null);
-        mEnMgr.updateConfiguration(new TetheringConfiguration(mContext, mLog));
+        mEnMgr.updateConfiguration(new TetheringConfiguration(mMockContext, mLog));
         // Couldn't get the CarrierConfigManager, but still had a declared provisioning app.
         // Therefore provisioning still be required.
         assertTrue(mEnMgr.isTetherProvisioningRequired());
@@ -123,7 +187,7 @@
     public void toleratesCarrierConfigMissing() {
         setupForRequiredProvisioning();
         when(mCarrierConfigManager.getConfig()).thenReturn(null);
-        mEnMgr.updateConfiguration(new TetheringConfiguration(mContext, mLog));
+        mEnMgr.updateConfiguration(new TetheringConfiguration(mMockContext, mLog));
         // We still have a provisioning app configured, so still require provisioning.
         assertTrue(mEnMgr.isTetherProvisioningRequired());
     }
@@ -133,12 +197,143 @@
         setupForRequiredProvisioning();
         when(mResources.getStringArray(R.array.config_mobile_hotspot_provision_app))
             .thenReturn(null);
-        mEnMgr.updateConfiguration(new TetheringConfiguration(mContext, mLog));
+        mEnMgr.updateConfiguration(new TetheringConfiguration(mMockContext, mLog));
         assertFalse(mEnMgr.isTetherProvisioningRequired());
         when(mResources.getStringArray(R.array.config_mobile_hotspot_provision_app))
             .thenReturn(new String[] {"malformedApp"});
-        mEnMgr.updateConfiguration(new TetheringConfiguration(mContext, mLog));
+        mEnMgr.updateConfiguration(new TetheringConfiguration(mMockContext, mLog));
         assertFalse(mEnMgr.isTetherProvisioningRequired());
     }
 
+    @Test
+    public void testGetLastEntitlementCacheValue() throws Exception {
+        final CountDownLatch mCallbacklatch = new CountDownLatch(1);
+        // 1. Entitlement check is not required.
+        mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR;
+        mEnMgr.everRunUiEntitlement = false;
+        ResultReceiver receiver = new ResultReceiver(null) {
+            @Override
+            protected void onReceiveResult(int resultCode, Bundle resultData) {
+                assertEquals(TETHER_ERROR_NO_ERROR, resultCode);
+                mCallbacklatch.countDown();
+            }
+        };
+        mEnMgr.getLatestTetheringEntitlementValue(TETHERING_WIFI, receiver, true);
+        callbackTimeoutHelper(mCallbacklatch);
+        assertFalse(mEnMgr.everRunUiEntitlement);
+
+        setupForRequiredProvisioning();
+        mEnMgr.updateConfiguration(new TetheringConfiguration(mMockContext, mLog));
+        // 2. No cache value and don't need to run entitlement check.
+        mEnMgr.everRunUiEntitlement = false;
+        receiver = new ResultReceiver(null) {
+            @Override
+            protected void onReceiveResult(int resultCode, Bundle resultData) {
+                assertEquals(TETHER_ERROR_ENTITLEMENT_UNKONWN, resultCode);
+                mCallbacklatch.countDown();
+            }
+        };
+        mEnMgr.getLatestTetheringEntitlementValue(TETHERING_WIFI, receiver, false);
+        callbackTimeoutHelper(mCallbacklatch);
+        assertFalse(mEnMgr.everRunUiEntitlement);
+        // 3. No cache value and ui entitlement check is needed.
+        mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISION_FAILED;
+        mEnMgr.everRunUiEntitlement = false;
+        receiver = new ResultReceiver(null) {
+            @Override
+            protected void onReceiveResult(int resultCode, Bundle resultData) {
+                assertEquals(TETHER_ERROR_PROVISION_FAILED, resultCode);
+                mCallbacklatch.countDown();
+            }
+        };
+        mEnMgr.getLatestTetheringEntitlementValue(TETHERING_WIFI, receiver, true);
+        mLooper.dispatchAll();
+        callbackTimeoutHelper(mCallbacklatch);
+        assertTrue(mEnMgr.everRunUiEntitlement);
+        // 4. Cache value is TETHER_ERROR_PROVISION_FAILED and don't need to run entitlement check.
+        mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR;
+        mEnMgr.everRunUiEntitlement = false;
+        receiver = new ResultReceiver(null) {
+            @Override
+            protected void onReceiveResult(int resultCode, Bundle resultData) {
+                assertEquals(TETHER_ERROR_PROVISION_FAILED, resultCode);
+                mCallbacklatch.countDown();
+            }
+        };
+        mEnMgr.getLatestTetheringEntitlementValue(TETHERING_WIFI, receiver, false);
+        callbackTimeoutHelper(mCallbacklatch);
+        assertFalse(mEnMgr.everRunUiEntitlement);
+        // 5. Cache value is TETHER_ERROR_PROVISION_FAILED and ui entitlement check is needed.
+        mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR;
+        mEnMgr.everRunUiEntitlement = false;
+        receiver = new ResultReceiver(null) {
+            @Override
+            protected void onReceiveResult(int resultCode, Bundle resultData) {
+                assertEquals(TETHER_ERROR_NO_ERROR, resultCode);
+                mCallbacklatch.countDown();
+            }
+        };
+        mEnMgr.getLatestTetheringEntitlementValue(TETHERING_WIFI, receiver, true);
+        mLooper.dispatchAll();
+        callbackTimeoutHelper(mCallbacklatch);
+        assertTrue(mEnMgr.everRunUiEntitlement);
+        // 6. Cache value is TETHER_ERROR_NO_ERROR.
+        mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR;
+        mEnMgr.everRunUiEntitlement = false;
+        receiver = new ResultReceiver(null) {
+            @Override
+            protected void onReceiveResult(int resultCode, Bundle resultData) {
+                assertEquals(TETHER_ERROR_NO_ERROR, resultCode);
+                mCallbacklatch.countDown();
+            }
+        };
+        mEnMgr.getLatestTetheringEntitlementValue(TETHERING_WIFI, receiver, true);
+        callbackTimeoutHelper(mCallbacklatch);
+        assertFalse(mEnMgr.everRunUiEntitlement);
+        // 7. Test get value for other downstream type.
+        mEnMgr.everRunUiEntitlement = false;
+        receiver = new ResultReceiver(null) {
+            @Override
+            protected void onReceiveResult(int resultCode, Bundle resultData) {
+                assertEquals(TETHER_ERROR_ENTITLEMENT_UNKONWN, resultCode);
+                mCallbacklatch.countDown();
+            }
+        };
+        mEnMgr.getLatestTetheringEntitlementValue(TETHERING_USB, receiver, false);
+        callbackTimeoutHelper(mCallbacklatch);
+        assertFalse(mEnMgr.everRunUiEntitlement);
+    }
+
+    void callbackTimeoutHelper(final CountDownLatch latch) throws Exception {
+        if (!latch.await(1, TimeUnit.SECONDS)) {
+            fail("Timout, fail to recieve callback");
+        }
+    }
+    public class TestStateMachine extends StateMachine {
+        public final ArrayList<Message> messages = new ArrayList<>();
+        private final State mLoggingState =
+                new EntitlementManagerTest.TestStateMachine.LoggingState();
+
+        class LoggingState extends State {
+            @Override public void enter() {
+                messages.clear();
+            }
+
+            @Override public void exit() {
+                messages.clear();
+            }
+
+            @Override public boolean processMessage(Message msg) {
+                messages.add(msg);
+                return false;
+            }
+        }
+
+        public TestStateMachine() {
+            super("EntitlementManagerTest.TestStateMachine", mLooper.getLooper());
+            addState(mLoggingState);
+            setInitialState(mLoggingState);
+            super.start();
+        }
+    }
 }
diff --git a/tools/aapt/AaptAssets.cpp b/tools/aapt/AaptAssets.cpp
index 3c3edda..672731c 100644
--- a/tools/aapt/AaptAssets.cpp
+++ b/tools/aapt/AaptAssets.cpp
@@ -301,6 +301,7 @@
                         break;
                     }
                     // This is not alphabetical, so we fall through to variant
+                    [[fallthrough]];
                 case 5:
                 case 6:
                 case 7:
diff --git a/tools/aapt2/Android.bp b/tools/aapt2/Android.bp
index 8f75287..bc3a9a1 100644
--- a/tools/aapt2/Android.bp
+++ b/tools/aapt2/Android.bp
@@ -108,6 +108,7 @@
         "link/ProductFilter.cpp",
         "link/PrivateAttributeMover.cpp",
         "link/ReferenceLinker.cpp",
+        "link/ResourceExcluder.cpp",
         "link/TableMerger.cpp",
         "link/XmlCompatVersioner.cpp",
         "link/XmlNamespaceRemover.cpp",
diff --git a/tools/aapt2/cmd/Link.cpp b/tools/aapt2/cmd/Link.cpp
index 729447e..8463046 100644
--- a/tools/aapt2/cmd/Link.cpp
+++ b/tools/aapt2/cmd/Link.cpp
@@ -59,6 +59,7 @@
 #include "link/ManifestFixer.h"
 #include "link/NoDefaultResourceRemover.h"
 #include "link/ReferenceLinker.h"
+#include "link/ResourceExcluder.h"
 #include "link/TableMerger.h"
 #include "link/XmlCompatVersioner.h"
 #include "optimize/ResourceDeduper.h"
@@ -1828,6 +1829,29 @@
       }
     }
 
+    if (!options_.exclude_configs_.empty()) {
+      std::vector<ConfigDescription> excluded_configs;
+
+      for (auto& config_string : options_.exclude_configs_) {
+        ConfigDescription config_description;
+
+        if (!ConfigDescription::Parse(config_string, &config_description)) {
+          context_->GetDiagnostics()->Error(DiagMessage()
+                                                << "failed to parse --excluded-configs "
+                                                << config_string);
+          return 1;
+        }
+
+        excluded_configs.push_back(config_description);
+      }
+
+      ResourceExcluder excluder(excluded_configs);
+      if (!excluder.Consume(context_, &final_table_)) {
+        context_->GetDiagnostics()->Error(DiagMessage() << "failed excluding configurations");
+        return 1;
+      }
+    }
+
     if (!options_.no_resource_deduping) {
       ResourceDeduper deduper;
       if (!deduper.Consume(context_, &final_table_)) {
diff --git a/tools/aapt2/cmd/Link.h b/tools/aapt2/cmd/Link.h
index f70470a..590a6bb 100644
--- a/tools/aapt2/cmd/Link.h
+++ b/tools/aapt2/cmd/Link.h
@@ -82,6 +82,9 @@
   std::vector<SplitConstraints> split_constraints;
   std::vector<std::string> split_paths;
 
+  // Configurations to exclude
+  std::vector<std::string> exclude_configs_;
+
   // Stable ID options.
   std::unordered_map<ResourceName, ResourceId> stable_id_map;
   Maybe<std::string> resource_id_map_path;
@@ -255,6 +258,9 @@
             "Syntax: path/to/output.apk:<config>[,<config>[...]].\n"
             "On Windows, use a semicolon ';' separator instead.",
         &split_args_);
+    AddOptionalFlagList("--exclude-configs",
+        "Excludes values of resources whose configs contain the specified qualifiers.",
+        &options_.exclude_configs_);
     AddOptionalSwitch("--debug-mode",
         "Inserts android:debuggable=\"true\" in to the application node of the\n"
             "manifest, making the application debuggable even on production devices.",
diff --git a/tools/aapt2/link/ManifestFixer.cpp b/tools/aapt2/link/ManifestFixer.cpp
index 5812ec4..85bf6f2 100644
--- a/tools/aapt2/link/ManifestFixer.cpp
+++ b/tools/aapt2/link/ManifestFixer.cpp
@@ -213,27 +213,6 @@
   return true;
 }
 
-static bool AddDeprecatedUsesFeatures(xml::Element* el, SourcePathDiagnostics* diag) {
-  if (xml::Attribute* attr = el->FindAttribute(xml::kSchemaAndroid, "name")) {
-    if (attr->value.empty()) {
-      return true;
-    }
-
-    // Add "android.hardware.fingerprint" when "android.hardware.biometric.fingerprint" is found,
-    // since the former is deprecated in Q and the latter is not present pre-Q. (see b/115639644)
-    if (attr->value == "android.hardware.biometrics.fingerprint") {
-      auto element = el->CloneElement([&](const xml::Element& el, xml::Element* out_el) {
-        xml::Attribute* cloned_attr = out_el->FindOrCreateAttribute(xml::kSchemaAndroid, "name");
-        cloned_attr->value = "android.hardware.fingerprint";
-      });
-
-      el->parent->AppendChild(std::move(element));
-    }
-  }
-
-  return true;
-}
-
 bool ManifestFixer::BuildRules(xml::XmlActionExecutor* executor,
                                IDiagnostics* diag) {
   // First verify some options.
@@ -268,7 +247,6 @@
   // Common <uses-feature> actions.
   xml::XmlNodeAction uses_feature_action;
   uses_feature_action.Action(VerifyUsesFeature);
-  uses_feature_action.Action(AddDeprecatedUsesFeatures);
 
   // Common component actions.
   xml::XmlNodeAction component_action;
diff --git a/tools/aapt2/link/ManifestFixer_test.cpp b/tools/aapt2/link/ManifestFixer_test.cpp
index fcc9f55..adea627 100644
--- a/tools/aapt2/link/ManifestFixer_test.cpp
+++ b/tools/aapt2/link/ManifestFixer_test.cpp
@@ -832,36 +832,4 @@
   EXPECT_THAT(Verify(input), NotNull());
 }
 
-TEST_F(ManifestFixerTest, UsesFeatureAddDeprecated) {
-  std::string input = R"(
-      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="android">
-        <uses-feature android:name="android.hardware.biometrics.fingerprint" />
-        <feature-group>
-          <uses-feature android:name="android.hardware.biometrics.fingerprint" />
-        </feature-group>
-      </manifest>)";
-
-  std::unique_ptr<xml::XmlResource> manifest = Verify(input);
-  ASSERT_THAT(manifest, NotNull());
-  EXPECT_THAT(manifest->root->FindChildWithAttribute("", "uses-feature",
-                                                     xml::kSchemaAndroid, "name",
-                                                     "android.hardware.biometrics.fingerprint"),
-              Ne(nullptr));
-  EXPECT_THAT(manifest->root->FindChildWithAttribute("", "uses-feature",
-                                                     xml::kSchemaAndroid, "name",
-                                                     "android.hardware.fingerprint"),
-              Ne(nullptr));
-
-  xml::Element* feature_group = manifest->root->FindChild("", "feature-group");
-  ASSERT_THAT(feature_group, Ne(nullptr));
-
-  EXPECT_THAT(feature_group->FindChildWithAttribute("", "uses-feature", xml::kSchemaAndroid, "name",
-                                                    "android.hardware.biometrics.fingerprint"),
-              Ne(nullptr));
-  EXPECT_THAT(feature_group->FindChildWithAttribute("", "uses-feature", xml::kSchemaAndroid, "name",
-                                                    "android.hardware.fingerprint"),
-              Ne(nullptr));
-}
-
 }  // namespace aapt
diff --git a/tools/aapt2/link/ResourceExcluder.cpp b/tools/aapt2/link/ResourceExcluder.cpp
new file mode 100644
index 0000000..2555995
--- /dev/null
+++ b/tools/aapt2/link/ResourceExcluder.cpp
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "link/ResourceExcluder.h"
+
+#include <algorithm>
+
+#include "DominatorTree.h"
+#include "ResourceTable.h"
+
+using android::ConfigDescription;
+
+namespace aapt {
+
+namespace {
+
+void RemoveIfExcluded(std::set<std::pair<ConfigDescription, int>>& excluded_configs_,
+                      IAaptContext* context,
+                      ResourceEntry* entry,
+                      ResourceConfigValue* value) {
+  const ConfigDescription& config = value->config;
+
+  // If this entry is a default, ignore
+  if (config == ConfigDescription::DefaultConfig()) {
+    return;
+  }
+
+  for (auto& excluded_pair : excluded_configs_) {
+
+    const ConfigDescription& excluded_config = excluded_pair.first;
+    const int& excluded_diff = excluded_pair.second;
+
+    // Check whether config contains all flags in excluded config
+    int node_diff = config.diff(excluded_config);
+    int masked_diff = excluded_diff & node_diff;
+
+    if (masked_diff == 0) {
+      if (context->IsVerbose()) {
+        context->GetDiagnostics()->Note(
+            DiagMessage(value->value->GetSource())
+                << "excluded resource \""
+                << entry->name
+                << "\" with config "
+                << config.toString());
+      }
+      value->value = {};
+      return;
+    }
+  }
+}
+
+}  // namespace
+
+bool ResourceExcluder::Consume(IAaptContext* context, ResourceTable* table) {
+  for (auto& package : table->packages) {
+    for (auto& type : package->types) {
+      for (auto& entry : type->entries) {
+        for (auto& value : entry->values) {
+          RemoveIfExcluded(excluded_configs_, context, entry.get(), value.get());
+        }
+
+        // Erase the values that were removed.
+        entry->values.erase(
+            std::remove_if(
+                entry->values.begin(), entry->values.end(),
+                [](const std::unique_ptr<ResourceConfigValue>& val) -> bool {
+                  return val == nullptr || val->value == nullptr;
+                }),
+            entry->values.end());
+      }
+    }
+  }
+  return true;
+}
+
+}  // namespace aapt
diff --git a/tools/aapt2/link/ResourceExcluder.h b/tools/aapt2/link/ResourceExcluder.h
new file mode 100644
index 0000000..1890b34
--- /dev/null
+++ b/tools/aapt2/link/ResourceExcluder.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef AAPT_LINK_RESOURCEEXCLUDER_H
+#define AAPT_LINK_RESOURCEEXCLUDER_H
+
+#include "android-base/macros.h"
+
+#include "process/IResourceTableConsumer.h"
+
+using android::ConfigDescription;
+
+namespace aapt {
+
+// Removes excluded configs from resources.
+class ResourceExcluder : public IResourceTableConsumer {
+ public:
+  explicit ResourceExcluder(std::vector<ConfigDescription>& excluded_configs) {
+    for (auto& config: excluded_configs) {
+      int diff_from_default = config.diff(ConfigDescription::DefaultConfig());
+      excluded_configs_.insert(std::pair(config, diff_from_default));
+    }
+  }
+
+  bool Consume(IAaptContext* context, ResourceTable* table) override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ResourceExcluder);
+
+  std::set<std::pair<ConfigDescription, int>> excluded_configs_;
+};
+
+} // namespace aapt
+
+#endif  // AAPT_LINK_RESOURCEEXCLUDER_H
diff --git a/tools/aapt2/link/ResourceExcluder_test.cpp b/tools/aapt2/link/ResourceExcluder_test.cpp
new file mode 100644
index 0000000..c9d01e4
--- /dev/null
+++ b/tools/aapt2/link/ResourceExcluder_test.cpp
@@ -0,0 +1,221 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "link/ResourceExcluder.h"
+
+#include "ResourceTable.h"
+#include "test/Test.h"
+
+using ::aapt::test::HasValue;
+using ::android::ConfigDescription;
+using ::testing::Not;
+
+namespace {
+
+ConfigDescription BuildArg(const std::string arg) {
+  ConfigDescription config_description;
+  ConfigDescription::Parse(arg, &config_description);
+  return config_description;
+}
+
+std::vector<ConfigDescription> BuildArgList(const std::string arg) {
+  ConfigDescription config_description;
+  ConfigDescription::Parse(arg, &config_description);
+  return { config_description };
+}
+
+} // namespace
+
+namespace aapt {
+
+TEST(ResourceExcluderTest, NonMatchConfigNotExcluded) {
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
+  ConfigDescription default_config;
+  auto fr_config = test::ParseConfigOrDie("fr");
+
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .AddString("android:string/test", ResourceId{}, default_config, "default")
+          .AddString("android:string/test", ResourceId{}, fr_config, "fr")
+          .Build();
+
+  auto args = BuildArgList("en");
+
+  ASSERT_TRUE(ResourceExcluder(args).Consume(context.get(), table.get()));
+  EXPECT_THAT(table, HasValue("android:string/test", default_config));
+  EXPECT_THAT(table, HasValue("android:string/test", fr_config));
+}
+
+TEST(ResourceExcluderTest, ExactConfigExcluded) {
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
+  ConfigDescription default_config;
+  auto fr_config = test::ParseConfigOrDie("fr");
+
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .AddString("android:string/test", ResourceId{}, default_config, "default")
+          .AddString("android:string/test", ResourceId{}, fr_config, "fr")
+          .Build();
+
+  auto args = BuildArgList("fr");
+
+  ASSERT_TRUE(ResourceExcluder(args).Consume(context.get(), table.get()));
+  EXPECT_THAT(table, HasValue("android:string/test", default_config));
+  EXPECT_THAT(table, Not(HasValue("android:string/test", fr_config)));
+}
+
+TEST(ResourceExcluderTest, MoreSpecificConfigExcluded) {
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
+  ConfigDescription default_config;
+  auto fr_land_config = test::ParseConfigOrDie("fr-land");
+
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .AddString("android:string/test", ResourceId{}, default_config, "default")
+          .AddString("android:string/test", ResourceId{}, fr_land_config, "fr-land")
+          .Build();
+
+  auto args = BuildArgList("fr");
+
+  ASSERT_TRUE(ResourceExcluder(args).Consume(context.get(), table.get()));
+  EXPECT_THAT(table, HasValue("android:string/test", default_config));
+  EXPECT_THAT(table, Not(HasValue("android:string/test", fr_land_config)));
+}
+
+TEST(ResourceExcluderTest, MultipleMoreSpecificConfigExcluded) {
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
+  ConfigDescription default_config;
+  auto night_config = test::ParseConfigOrDie("night");
+  auto fr_config = test::ParseConfigOrDie("fr");
+  auto fr_land_config = test::ParseConfigOrDie("fr-land");
+  auto fr_night_config = test::ParseConfigOrDie("fr-night");
+
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .AddString("android:string/test", ResourceId{}, default_config, "default")
+          .AddString("android:string/test", ResourceId{}, night_config, "night")
+          .AddString("android:string/test", ResourceId{}, fr_config, "fr")
+          .AddString("android:string/test", ResourceId{}, fr_land_config, "fr-land")
+          .AddString("android:string/test", ResourceId{}, fr_night_config, "fr-night")
+          .Build();
+
+  auto args = BuildArgList("fr");
+
+  ASSERT_TRUE(ResourceExcluder(args).Consume(context.get(), table.get()));
+  EXPECT_THAT(table, HasValue("android:string/test", default_config));
+  EXPECT_THAT(table, HasValue("android:string/test", night_config));
+  EXPECT_THAT(table, Not(HasValue("android:string/test", fr_config)));
+  EXPECT_THAT(table, Not(HasValue("android:string/test", fr_land_config)));
+  EXPECT_THAT(table, Not(HasValue("android:string/test", fr_night_config)));
+}
+
+TEST(ResourceExcluderTest, MultipleConfigsExcluded) {
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
+  ConfigDescription default_config;
+  auto night_config = test::ParseConfigOrDie("night");
+  auto fr_config = test::ParseConfigOrDie("fr");
+  auto fr_land_config = test::ParseConfigOrDie("fr-land");
+  auto fr_night_config = test::ParseConfigOrDie("fr-night");
+
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .AddString("android:string/test", ResourceId{}, default_config, "default")
+          .AddString("android:string/test", ResourceId{}, night_config, "night")
+          .AddString("android:string/test", ResourceId{}, fr_config, "fr")
+          .AddString("android:string/test", ResourceId{}, fr_land_config, "fr-land")
+          .AddString("android:string/test", ResourceId{}, fr_night_config, "fr-night")
+          .Build();
+
+  std::vector<ConfigDescription> args;
+  args.push_back(BuildArg("land"));
+  args.push_back(BuildArg("night"));
+
+  ASSERT_TRUE(ResourceExcluder(args).Consume(context.get(), table.get()));
+  EXPECT_THAT(table, HasValue("android:string/test", default_config));
+  EXPECT_THAT(table, Not(HasValue("android:string/test", night_config)));
+  EXPECT_THAT(table, HasValue("android:string/test", fr_config));
+  EXPECT_THAT(table, Not(HasValue("android:string/test", fr_land_config)));
+  EXPECT_THAT(table, Not(HasValue("android:string/test", fr_night_config)));
+}
+
+TEST(ResourceExcluderTest, LessSpecificConfigNotExcluded) {
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
+  ConfigDescription default_config;
+  auto fr_config = test::ParseConfigOrDie("fr");
+  auto fr_land_config = test::ParseConfigOrDie("fr-land");
+
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .AddString("android:string/test", ResourceId{}, default_config, "default")
+          .AddString("android:string/test", ResourceId{}, fr_config, "fr")
+          .AddString("android:string/test", ResourceId{}, fr_land_config, "fr-land")
+          .Build();
+
+  auto args = BuildArgList("fr-land");
+
+  ASSERT_TRUE(ResourceExcluder(args).Consume(context.get(), table.get()));
+  EXPECT_THAT(table, HasValue("android:string/test", default_config));
+  EXPECT_THAT(table, HasValue("android:string/test", fr_config));
+  EXPECT_THAT(table, Not(HasValue("android:string/test", fr_land_config)));
+}
+
+TEST(ResourceExcluderTest, LowerPrecedenceStillExcludes) {
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
+  ConfigDescription default_config;
+  auto fr_config = test::ParseConfigOrDie("fr");
+  auto fr_night_config = test::ParseConfigOrDie("fr-night");
+
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .AddString("android:string/test", ResourceId{}, default_config, "default")
+          .AddString("android:string/test", ResourceId{}, fr_config, "fr")
+          .AddString("android:string/test", ResourceId{}, fr_night_config, "fr-night")
+          .Build();
+
+  // "night" is lower precedence than "fr"
+  auto args = BuildArgList("night");
+
+  ASSERT_TRUE(ResourceExcluder(args).Consume(context.get(), table.get()));
+  EXPECT_THAT(table, HasValue("android:string/test", default_config));
+  EXPECT_THAT(table, HasValue("android:string/test", fr_config));
+  EXPECT_THAT(table, Not(HasValue("android:string/test", fr_night_config)));
+}
+
+TEST(ResourceExcluderTest, OnlyExcludesSpecificTier) {
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
+  ConfigDescription default_config;
+  auto mdpi_config = test::ParseConfigOrDie("mdpi");
+  auto hdpi_config = test::ParseConfigOrDie("hdpi");
+  auto xhdpi_config = test::ParseConfigOrDie("xhdpi");
+
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .AddString("android:string/test", ResourceId{}, default_config, "default")
+          .AddString("android:string/test", ResourceId{}, mdpi_config, "mdpi")
+          .AddString("android:string/test", ResourceId{}, hdpi_config, "hdpi")
+          .AddString("android:string/test", ResourceId{}, xhdpi_config, "xhdpi")
+          .Build();
+
+  auto args = BuildArgList("hdpi");
+
+  ASSERT_TRUE(ResourceExcluder(args).Consume(context.get(), table.get()));
+  EXPECT_THAT(table, HasValue("android:string/test", default_config));
+  EXPECT_THAT(table, HasValue("android:string/test", mdpi_config));
+  EXPECT_THAT(table, Not(HasValue("android:string/test", hdpi_config)));
+  EXPECT_THAT(table, HasValue("android:string/test", xhdpi_config));
+}
+
+}  // namespace aapt
diff --git a/tools/apilint/apilint.py b/tools/apilint/apilint.py
index 75c3eba..59e89f5 100644
--- a/tools/apilint/apilint.py
+++ b/tools/apilint/apilint.py
@@ -223,6 +223,7 @@
 class V2Tokenizer(object):
     __slots__ = ["raw"]
 
+    SIGNATURE_PREFIX = "// Signature format: "
     DELIMITER = re.compile(r'\s+|[()@<>;,={}/"!?]|\[\]|\.\.\.')
     STRING_SPECIAL = re.compile(r'["\\]')
 
@@ -610,8 +611,12 @@
         else:
             blame = None
 
-        if line == 1 and raw == "// Signature format: 2.0":
-            sig_format = 2
+        if line == 1 and raw.startswith("// Signature format: "):
+            sig_format_string = raw[len(V2Tokenizer.SIGNATURE_PREFIX):]
+            if sig_format_string in ["2.0", "3.0"]:
+                sig_format = 2
+            else:
+                raise ValueError("Unknown format: %s" % (sig_format_string,))
         elif raw.startswith("package"):
             pkg = Package(line, raw, blame)
         elif raw.startswith("  ") and raw.endswith("{"):
diff --git a/tools/apilint/apilint_test.py b/tools/apilint/apilint_test.py
index 9c261d5..3716bf9 100644
--- a/tools/apilint/apilint_test.py
+++ b/tools/apilint/apilint_test.py
@@ -164,6 +164,23 @@
         self.assertEquals(api['android.SomeEnum'].ctors[0].split[0], 'ctor')
         self.assertEquals(api['android.SomeEnum'].methods[0].split[0], 'method')
 
+class ParseV3Stream(unittest.TestCase):
+    def test_field_kinds(self):
+        api = apilint._parse_stream("""
+// Signature format: 3.0
+package a {
+
+  public final class ContextKt {
+    method public static inline <reified T> T! getSystemService(android.content.Context);
+    method public static inline void withStyledAttributes(android.content.Context, android.util.AttributeSet? set = null, int[] attrs, @AttrRes int defStyleAttr = 0, @StyleRes int defStyleRes = 0, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+  }
+}
+        """.strip().split('\n'))
+        self.assertEquals(api['a.ContextKt'].methods[0].name, 'getSystemService')
+        self.assertEquals(api['a.ContextKt'].methods[0].split[:4], ['method', 'public', 'static', 'inline'])
+        self.assertEquals(api['a.ContextKt'].methods[1].name, 'withStyledAttributes')
+        self.assertEquals(api['a.ContextKt'].methods[1].split[:4], ['method', 'public', 'static', 'inline'])
+
 class V2TokenizerTests(unittest.TestCase):
     def _test(self, raw, expected):
         self.assertEquals(apilint.V2Tokenizer(raw).tokenize(), expected)
diff --git a/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectablePropertyProcessor.java b/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectablePropertyProcessor.java
index 42ae890..50c79da 100644
--- a/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectablePropertyProcessor.java
+++ b/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectablePropertyProcessor.java
@@ -352,6 +352,8 @@
                 } else {
                     return Property.Type.OBJECT;
                 }
+            case ARRAY:
+                return Property.Type.OBJECT;
             default:
                 throw new ProcessingException(
                         String.format("Unsupported return type %s.", returnType),
diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java
index 96493de..c50e6a7 100644
--- a/wifi/java/android/net/wifi/WifiConfiguration.java
+++ b/wifi/java/android/net/wifi/WifiConfiguration.java
@@ -49,8 +49,9 @@
  * A class representing a configured Wi-Fi network, including the
  * security configuration.
  *
- * @deprecated Use {@link WifiNetworkConfigBuilder} to create {@link NetworkSpecifier} and
- * {@link WifiNetworkSuggestion}. This will become a system use only object in the future.
+ * @deprecated Use {@link WifiNetworkSpecifier.Builder} to create {@link NetworkSpecifier} and
+ * {@link WifiNetworkSuggestion.Builder} to create {@link WifiNetworkSuggestion}. This will become a
+ * system use only object in the future.
  */
 @Deprecated
 public class WifiConfiguration implements Parcelable {
diff --git a/wifi/java/android/net/wifi/WifiEnterpriseConfig.java b/wifi/java/android/net/wifi/WifiEnterpriseConfig.java
index 17847ea..145e269 100644
--- a/wifi/java/android/net/wifi/WifiEnterpriseConfig.java
+++ b/wifi/java/android/net/wifi/WifiEnterpriseConfig.java
@@ -23,17 +23,9 @@
 import android.text.TextUtils;
 import android.util.Log;
 
-import java.io.ByteArrayInputStream;
 import java.nio.charset.StandardCharsets;
-import java.security.KeyFactory;
-import java.security.NoSuchAlgorithmException;
 import java.security.PrivateKey;
-import java.security.cert.CertificateEncodingException;
-import java.security.cert.CertificateException;
-import java.security.cert.CertificateFactory;
 import java.security.cert.X509Certificate;
-import java.security.spec.InvalidKeySpecException;
-import java.security.spec.PKCS8EncodedKeySpec;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
@@ -1126,6 +1118,12 @@
             String value = PASSWORD_KEY.equals(key) ? "<removed>" : mFields.get(key);
             sb.append(key).append(" ").append(value).append("\n");
         }
+        if (mEapMethod >= 0 && mEapMethod < Eap.strings.length) {
+            sb.append("eap_method: ").append(Eap.strings[mEapMethod]).append("\n");
+        }
+        if (mPhase2Method > 0 && mPhase2Method < Phase2.strings.length) {
+            sb.append("phase2_method: ").append(Phase2.strings[mPhase2Method]).append("\n");
+        }
         return sb.toString();
     }
 
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index 0668239..289f99d 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -947,8 +947,8 @@
     /**
      * Directed broadcast intent action indicating that the device has connected to one of the
      * network suggestions provided by the app. This will be sent post connection to a network
-     * which was created with {@link WifiNetworkConfigBuilder#setIsAppInteractionRequired()} flag
-     * set.
+     * which was created with {@link WifiNetworkSuggestion.Builder#setIsAppInteractionRequired()}
+     * flag set.
      * <p>
      * Note: The broadcast is sent to the app only if it holds
      * {@link android.Manifest.permission#ACCESS_FINE_LOCATION ACCESS_FINE_LOCATION} permission.
@@ -1171,7 +1171,7 @@
      * of {@link WifiConfiguration} objects.
      *
      * @deprecated
-     * a) See {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} for new
+     * a) See {@link WifiNetworkSpecifier.Builder#build()} for new
      * mechanism to trigger connection to a Wi-Fi network.
      * b) See {@link #addNetworkSuggestions(List)},
      * {@link #removeNetworkSuggestions(List)} for new API to add Wi-Fi networks for consideration
@@ -1221,7 +1221,6 @@
      * @param scanResults a list of scanResult that represents the BSSID
      * @return List that consists of {@link WifiConfiguration} and corresponding scanResults per
      * network type({@link #PASSPOINT_HOME_NETWORK} and {@link #PASSPOINT_ROAMING_NETWORK}).
-     * @throws UnsupportedOperationException if Passpoint is not enabled on the device.
      * @hide
      */
     @SystemApi
@@ -1264,7 +1263,6 @@
      *
      * @param scanResults a list of ScanResult
      * @return Map that consists {@link OsuProvider} and a list of matching {@link ScanResult}
-     * @throws UnsupportedOperationException if Passpoint is not enabled on the device.
      * @hide
      */
     @SystemApi
@@ -1291,7 +1289,6 @@
      *
      * @param osuProviders a set of {@link OsuProvider}
      * @return Map that consists of {@link OsuProvider} and matching {@link PasspointConfiguration}.
-     * @throws UnsupportedOperationException if Passpoint is not enabled on the device.
      * @hide
      */
     @SystemApi
@@ -1326,7 +1323,7 @@
      *         Returns {@code -1} on failure.
      *
      * @deprecated
-     * a) See {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} for new
+     * a) See {@link WifiNetworkSpecifier.Builder#build()} for new
      * mechanism to trigger connection to a Wi-Fi network.
      * b) See {@link #addNetworkSuggestions(List)},
      * {@link #removeNetworkSuggestions(List)} for new API to add Wi-Fi networks for consideration
@@ -1361,7 +1358,7 @@
      *         existing network.
      *
      * @deprecated
-     * a) See {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} for new
+     * a) See {@link WifiNetworkSpecifier.Builder#build()} for new
      * mechanism to trigger connection to a Wi-Fi network.
      * b) See {@link #addNetworkSuggestions(List)},
      * {@link #removeNetworkSuggestions(List)} for new API to add Wi-Fi networks for consideration
@@ -1650,8 +1647,8 @@
      * for a detailed explanation of the parameters.
      * When the device decides to connect to one of the provided network suggestions, platform sends
      * a directed broadcast {@link #ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION} to the app if
-     * the network was created with {@link WifiNetworkConfigBuilder#setIsAppInteractionRequired()}
-     * flag set and the app holds
+     * the network was created with {@link WifiNetworkSuggestion.Builder
+     * #setIsAppInteractionRequired()} flag set and the app holds
      * {@link android.Manifest.permission#ACCESS_FINE_LOCATION ACCESS_FINE_LOCATION} permission.
      *<p>
      * NOTE:
@@ -1720,8 +1717,8 @@
      * FQDN, the new configuration will replace the existing configuration.
      *
      * @param config The Passpoint configuration to be added
-     * @throws IllegalArgumentException if configuration is invalid
-     * @throws UnsupportedOperationException if Passpoint is not enabled on the device.
+     * @throws IllegalArgumentException if configuration is invalid or Passpoint is not enabled on
+     *                                  the device.
      */
     public void addOrUpdatePasspointConfiguration(PasspointConfiguration config) {
         try {
@@ -1737,8 +1734,8 @@
      * Remove the Passpoint configuration identified by its FQDN (Fully Qualified Domain Name).
      *
      * @param fqdn The FQDN of the Passpoint configuration to be removed
-     * @throws IllegalArgumentException if no configuration is associated with the given FQDN.
-     * @throws UnsupportedOperationException if Passpoint is not enabled on the device.
+     * @throws IllegalArgumentException if no configuration is associated with the given FQDN or
+     *                                  Passpoint is not enabled on the device.
      * @deprecated This is no longer supported.
      */
     @Deprecated
@@ -1762,7 +1759,6 @@
      * An empty list will be returned when no configurations are installed.
      *
      * @return A list of {@link PasspointConfiguration}
-     * @throws UnsupportedOperationException if Passpoint is not enabled on the device.
      * @deprecated This is no longer supported.
      */
     @Deprecated
@@ -1839,7 +1835,7 @@
      * @return {@code true} if the operation succeeded
      *
      * @deprecated
-     * a) See {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} for new
+     * a) See {@link WifiNetworkSpecifier.Builder#build()} for new
      * mechanism to trigger connection to a Wi-Fi network.
      * b) See {@link #addNetworkSuggestions(List)},
      * {@link #removeNetworkSuggestions(List)} for new API to add Wi-Fi networks for consideration
@@ -1883,7 +1879,7 @@
      * @return {@code true} if the operation succeeded
      *
      * @deprecated
-     * a) See {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} for new
+     * a) See {@link WifiNetworkSpecifier.Builder#build()} for new
      * mechanism to trigger connection to a Wi-Fi network.
      * b) See {@link #addNetworkSuggestions(List)},
      * {@link #removeNetworkSuggestions(List)} for new API to add Wi-Fi networks for consideration
@@ -1915,7 +1911,7 @@
      * @return {@code true} if the operation succeeded
      *
      * @deprecated
-     * a) See {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} for new
+     * a) See {@link WifiNetworkSpecifier.Builder#build()} for new
      * mechanism to trigger connection to a Wi-Fi network.
      * b) See {@link #addNetworkSuggestions(List)},
      * {@link #removeNetworkSuggestions(List)} for new API to add Wi-Fi networks for consideration
@@ -1938,7 +1934,7 @@
      * @return {@code true} if the operation succeeded
      *
      * @deprecated
-     * a) See {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} for new
+     * a) See {@link WifiNetworkSpecifier.Builder#build()} for new
      * mechanism to trigger connection to a Wi-Fi network.
      * b) See {@link #addNetworkSuggestions(List)},
      * {@link #removeNetworkSuggestions(List)} for new API to add Wi-Fi networks for consideration
@@ -1962,7 +1958,7 @@
      * @return {@code true} if the operation succeeded
      *
      * @deprecated
-     * a) See {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} for new
+     * a) See {@link WifiNetworkSpecifier.Builder#build()} for new
      * mechanism to trigger connection to a Wi-Fi network.
      * b) See {@link #addNetworkSuggestions(List)},
      * {@link #removeNetworkSuggestions(List)} for new API to add Wi-Fi networks for consideration
@@ -1986,7 +1982,7 @@
      * @return {@code true} if the operation succeeded
      *
      * @deprecated
-     * a) See {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} for new
+     * a) See {@link WifiNetworkSpecifier.Builder#build()} for new
      * mechanism to trigger connection to a Wi-Fi network.
      * b) See {@link #addNetworkSuggestions(List)},
      * {@link #removeNetworkSuggestions(List)} for new API to add Wi-Fi networks for consideration
diff --git a/wifi/java/android/net/wifi/WifiNetworkAgentSpecifier.java b/wifi/java/android/net/wifi/WifiNetworkAgentSpecifier.java
index 52ee742..9d87466 100644
--- a/wifi/java/android/net/wifi/WifiNetworkAgentSpecifier.java
+++ b/wifi/java/android/net/wifi/WifiNetworkAgentSpecifier.java
@@ -124,7 +124,7 @@
      */
     public boolean satisfiesNetworkSpecifier(@NonNull WifiNetworkSpecifier ns) {
         // None of these should be null by construction.
-        // {@link WifiNetworkConfigBuilder} enforces non-null in {@link WifiNetworkSpecifier}.
+        // {@link WifiNetworkSpecifier.Builder} enforces non-null in {@link WifiNetworkSpecifier}.
         // {@link WifiNetworkFactory} ensures non-null in {@link WifiNetworkAgentSpecifier}.
         checkNotNull(ns);
         checkNotNull(ns.ssidPatternMatcher);
diff --git a/wifi/java/android/net/wifi/WifiNetworkConfigBuilder.java b/wifi/java/android/net/wifi/WifiNetworkConfigBuilder.java
deleted file mode 100644
index 42d4393..0000000
--- a/wifi/java/android/net/wifi/WifiNetworkConfigBuilder.java
+++ /dev/null
@@ -1,657 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import static com.android.internal.util.Preconditions.checkNotNull;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.app.ActivityThread;
-import android.net.MacAddress;
-import android.net.NetworkRequest;
-import android.net.NetworkSpecifier;
-import android.os.PatternMatcher;
-import android.os.Process;
-import android.text.TextUtils;
-import android.util.Pair;
-
-import java.nio.charset.CharsetEncoder;
-import java.nio.charset.StandardCharsets;
-import java.util.List;
-
-/**
- * WifiNetworkConfigBuilder to use for creating Wi-Fi network configuration.
- * <li>See {@link #buildNetworkSpecifier()} for creating a network specifier to use in
- * {@link NetworkRequest}.</li>
- * <li>See {@link #buildNetworkSuggestion()} for creating a network suggestion to use in
- * {@link WifiManager#addNetworkSuggestions(List)}.</li>
- */
-public class WifiNetworkConfigBuilder {
-    private static final String MATCH_ALL_SSID_PATTERN_PATH = ".*";
-    private static final String MATCH_EMPTY_SSID_PATTERN_PATH = "";
-    private static final Pair<MacAddress, MacAddress> MATCH_NO_BSSID_PATTERN1 =
-            new Pair(MacAddress.BROADCAST_ADDRESS, MacAddress.BROADCAST_ADDRESS);
-    private static final Pair<MacAddress, MacAddress> MATCH_NO_BSSID_PATTERN2 =
-            new Pair(MacAddress.ALL_ZEROS_ADDRESS, MacAddress.BROADCAST_ADDRESS);
-    private static final Pair<MacAddress, MacAddress> MATCH_ALL_BSSID_PATTERN =
-            new Pair(MacAddress.ALL_ZEROS_ADDRESS, MacAddress.ALL_ZEROS_ADDRESS);
-    private static final MacAddress MATCH_EXACT_BSSID_PATTERN_MASK =
-            MacAddress.BROADCAST_ADDRESS;
-    private static final int UNASSIGNED_PRIORITY = -1;
-
-    /**
-     * SSID pattern match specified by the app.
-     */
-    private @Nullable PatternMatcher mSsidPatternMatcher;
-    /**
-     * BSSID pattern match specified by the app.
-     * Pair of <BaseAddress, Mask>.
-     */
-    private @Nullable Pair<MacAddress, MacAddress> mBssidPatternMatcher;
-    /**
-     * Whether this is an OWE network or not.
-     */
-    private boolean mIsEnhancedOpen;
-    /**
-     * Pre-shared key for use with WPA-PSK networks.
-     */
-    private @Nullable String mWpa2PskPassphrase;
-    /**
-     * Pre-shared key for use with WPA3-SAE networks.
-     */
-    private @Nullable String mWpa3SaePassphrase;
-    /**
-     * The enterprise configuration details specifying the EAP method,
-     * certificates and other settings associated with the WPA-EAP networks.
-     */
-    private @Nullable WifiEnterpriseConfig mWpa2EnterpriseConfig;
-    /**
-     * The enterprise configuration details specifying the EAP method,
-     * certificates and other settings associated with the SuiteB networks.
-     */
-    private @Nullable WifiEnterpriseConfig mWpa3EnterpriseConfig;
-    /**
-     * This is a network that does not broadcast its SSID, so an
-     * SSID-specific probe request must be used for scans.
-     */
-    private boolean mIsHiddenSSID;
-    /**
-     * Whether app needs to log in to captive portal to obtain Internet access.
-     */
-    private boolean mIsAppInteractionRequired;
-    /**
-     * Whether user needs to log in to captive portal to obtain Internet access.
-     */
-    private boolean mIsUserInteractionRequired;
-    /**
-     * Whether this network is metered or not.
-     */
-    private boolean mIsMetered;
-    /**
-     * Priority of this network among other network suggestions provided by the app.
-     * The lower the number, the higher the priority (i.e value of 0 = highest priority).
-     */
-    private int mPriority;
-
-    public WifiNetworkConfigBuilder() {
-        mSsidPatternMatcher = null;
-        mBssidPatternMatcher = null;
-        mIsEnhancedOpen = false;
-        mWpa2PskPassphrase = null;
-        mWpa3SaePassphrase = null;
-        mWpa2EnterpriseConfig = null;
-        mWpa3EnterpriseConfig = null;
-        mIsHiddenSSID = false;
-        mIsAppInteractionRequired = false;
-        mIsUserInteractionRequired = false;
-        mIsMetered = false;
-        mPriority = UNASSIGNED_PRIORITY;
-    }
-
-    /**
-     * Set the unicode SSID match pattern to use for filtering networks from scan results.
-     * <p>
-     * <li>Only allowed for creating network specifier, i.e {@link #buildNetworkSpecifier()}. </li>
-     * <li>Overrides any previous value set using {@link #setSsid(String)} or
-     * {@link #setSsidPattern(PatternMatcher)}.</li>
-     *
-     * @param ssidPattern Instance of {@link PatternMatcher} containing the UTF-8 encoded
-     *                    string pattern to use for matching the network's SSID.
-     * @return Instance of {@link WifiNetworkConfigBuilder} to enable chaining of the builder
-     * method.
-     */
-    public WifiNetworkConfigBuilder setSsidPattern(@NonNull PatternMatcher ssidPattern) {
-        checkNotNull(ssidPattern);
-        mSsidPatternMatcher = ssidPattern;
-        return this;
-    }
-
-    /**
-     * Set the unicode SSID for the network.
-     * <p>
-     * <li>For network requests ({@link NetworkSpecifier}), built using
-     * {@link #buildNetworkSpecifier}, sets the SSID to use for filtering networks from scan
-     * results. Will only match networks whose SSID is identical to the UTF-8 encoding of the
-     * specified value.</li>
-     * <li>For network suggestions ({@link WifiNetworkSuggestion}), built using
-     * {@link #buildNetworkSuggestion()}, sets the SSID for the network.</li>
-     * <li>Overrides any previous value set using {@link #setSsid(String)} or
-     * {@link #setSsidPattern(PatternMatcher)}.</li>
-     *
-     * @param ssid The SSID of the network. It must be valid Unicode.
-     * @return Instance of {@link WifiNetworkConfigBuilder} to enable chaining of the builder
-     * method.
-     * @throws IllegalArgumentException if the SSID is not valid unicode.
-     */
-    public WifiNetworkConfigBuilder setSsid(@NonNull String ssid) {
-        checkNotNull(ssid);
-        final CharsetEncoder unicodeEncoder = StandardCharsets.UTF_8.newEncoder();
-        if (!unicodeEncoder.canEncode(ssid)) {
-            throw new IllegalArgumentException("SSID is not a valid unicode string");
-        }
-        mSsidPatternMatcher = new PatternMatcher(ssid, PatternMatcher.PATTERN_LITERAL);
-        return this;
-    }
-
-    /**
-     * Set the BSSID match pattern to use for filtering networks from scan results.
-     * Will match all networks with BSSID which satisfies the following:
-     * {@code BSSID & mask == baseAddress}.
-     * <p>
-     * <li>Only allowed for creating network specifier, i.e {@link #buildNetworkSpecifier()}. </li>
-     * <li>Overrides any previous value set using {@link #setBssid(MacAddress)} or
-     * {@link #setBssidPattern(MacAddress, MacAddress)}.</li>
-     *
-     * @param baseAddress Base address for BSSID pattern.
-     * @param mask Mask for BSSID pattern.
-     * @return Instance of {@link WifiNetworkConfigBuilder} to enable chaining of the builder
-     * method.
-     */
-    public WifiNetworkConfigBuilder setBssidPattern(
-            @NonNull MacAddress baseAddress, @NonNull MacAddress mask) {
-        checkNotNull(baseAddress, mask);
-        mBssidPatternMatcher = Pair.create(baseAddress, mask);
-        return this;
-    }
-
-    /**
-     * Set the BSSID to use for filtering networks from scan results. Will only match network whose
-     * BSSID is identical to the specified value.
-     * <p>
-     * <li>For network requests ({@link NetworkSpecifier}), built using
-     * {@link #buildNetworkSpecifier}, sets the BSSID to use for filtering networks from scan
-     * results. Will only match networks whose BSSID is identical to specified value.</li>
-     * <li>For network suggestions ({@link WifiNetworkSuggestion}), built using
-     * {@link #buildNetworkSuggestion()}, sets a specific BSSID for the network suggestion.
-     * If set, only the specified BSSID with the specified SSID will be considered for connection.
-     * If not set, all BSSIDs with the specified SSID will be considered for connection.</li>
-     * <li>Overrides any previous value set using {@link #setBssid(MacAddress)} or
-     * {@link #setBssidPattern(MacAddress, MacAddress)}.</li>
-     *
-     * @param bssid BSSID of the network.
-     * @return Instance of {@link WifiNetworkConfigBuilder} to enable chaining of the builder
-     * method.
-     */
-    public WifiNetworkConfigBuilder setBssid(@NonNull MacAddress bssid) {
-        checkNotNull(bssid);
-        mBssidPatternMatcher = Pair.create(bssid, MATCH_EXACT_BSSID_PATTERN_MASK);
-        return this;
-    }
-
-    /**
-     * Specifies whether this represents an Enhanced Open (OWE) network.
-     *
-     * @return Instance of {@link WifiNetworkConfigBuilder} to enable chaining of the builder
-     * method.
-     */
-    public WifiNetworkConfigBuilder setIsEnhancedOpen() {
-        mIsEnhancedOpen = true;
-        return this;
-    }
-
-    /**
-     * Set the ASCII WPA2 passphrase for this network. Needed for authenticating to
-     * WPA2-PSK networks.
-     *
-     * @param passphrase passphrase of the network.
-     * @return Instance of {@link WifiNetworkConfigBuilder} to enable chaining of the builder
-     * method.
-     * @throws IllegalArgumentException if the passphrase is not ASCII encodable.
-     */
-    public WifiNetworkConfigBuilder setWpa2Passphrase(@NonNull String passphrase) {
-        checkNotNull(passphrase);
-        final CharsetEncoder asciiEncoder = StandardCharsets.US_ASCII.newEncoder();
-        if (!asciiEncoder.canEncode(passphrase)) {
-            throw new IllegalArgumentException("passphrase not ASCII encodable");
-        }
-        mWpa2PskPassphrase = passphrase;
-        return this;
-    }
-
-    /**
-     * Set the ASCII WPA3 passphrase for this network. Needed for authenticating to
-     * WPA3-SAE networks.
-     *
-     * @param passphrase passphrase of the network.
-     * @return Instance of {@link WifiNetworkConfigBuilder} to enable chaining of the builder
-     * method.
-     * @throws IllegalArgumentException if the passphrase is not ASCII encodable.
-     */
-    public WifiNetworkConfigBuilder setWpa3Passphrase(@NonNull String passphrase) {
-        checkNotNull(passphrase);
-        final CharsetEncoder asciiEncoder = StandardCharsets.US_ASCII.newEncoder();
-        if (!asciiEncoder.canEncode(passphrase)) {
-            throw new IllegalArgumentException("passphrase not ASCII encodable");
-        }
-        mWpa3SaePassphrase = passphrase;
-        return this;
-    }
-
-    /**
-     * Set the associated enterprise configuration for this network. Needed for authenticating to
-     * WPA2-EAP networks. See {@link WifiEnterpriseConfig} for description.
-     *
-     * @param enterpriseConfig Instance of {@link WifiEnterpriseConfig}.
-     * @return Instance of {@link WifiNetworkConfigBuilder} to enable chaining of the builder
-     * method.
-     */
-    public WifiNetworkConfigBuilder setWpa2EnterpriseConfig(
-            @NonNull WifiEnterpriseConfig enterpriseConfig) {
-        checkNotNull(enterpriseConfig);
-        mWpa2EnterpriseConfig = new WifiEnterpriseConfig(enterpriseConfig);
-        return this;
-    }
-
-    /**
-     * Set the associated enterprise configuration for this network. Needed for authenticating to
-     * WPA3-SuiteB networks. See {@link WifiEnterpriseConfig} for description.
-     *
-     * @param enterpriseConfig Instance of {@link WifiEnterpriseConfig}.
-     * @return Instance of {@link WifiNetworkConfigBuilder} to enable chaining of the builder
-     * method.
-     */
-    public WifiNetworkConfigBuilder setWpa3EnterpriseConfig(
-            @NonNull WifiEnterpriseConfig enterpriseConfig) {
-        checkNotNull(enterpriseConfig);
-        mWpa3EnterpriseConfig = new WifiEnterpriseConfig(enterpriseConfig);
-        return this;
-    }
-
-    /**
-     * Specifies whether this represents a hidden network.
-     * <p>
-     * <li>For network requests (see {@link NetworkSpecifier}), built using
-     * {@link #buildNetworkSpecifier}, setting this disallows the usage of
-     * {@link #setSsidPattern(PatternMatcher)} since hidden networks need to be explicitly
-     * probed for.</li>
-     * <li>If not set, defaults to false (i.e not a hidden network).</li>
-     *
-     * @return Instance of {@link WifiNetworkConfigBuilder} to enable chaining of the builder
-     * method.
-     */
-    public WifiNetworkConfigBuilder setIsHiddenSsid() {
-        mIsHiddenSSID = true;
-        return this;
-    }
-
-    /**
-     * Specifies whether the app needs to log in to a captive portal to obtain Internet access.
-     * <p>
-     * This will dictate if the directed broadcast
-     * {@link WifiManager#ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION} will be sent to the app
-     * after successfully connecting to the network.
-     * Use this for captive portal type networks where the app needs to authenticate the user
-     * before the device can access the network.
-     * <p>
-     * <li>Only allowed for creating network suggestion, i.e {@link #buildNetworkSuggestion()}.</li>
-     * <li>If not set, defaults to false (i.e no app interaction required).</li>
-     *
-     * @return Instance of {@link WifiNetworkConfigBuilder} to enable chaining of the builder
-     * method.
-     */
-    public WifiNetworkConfigBuilder setIsAppInteractionRequired() {
-        mIsAppInteractionRequired = true;
-        return this;
-    }
-
-    /**
-     * Specifies whether the user needs to log in to a captive portal to obtain Internet access.
-     * <p>
-     * <li>Only allowed for creating network suggestion, i.e {@link #buildNetworkSuggestion()}.</li>
-     * <li>If not set, defaults to false (i.e no user interaction required).</li>
-     *
-     * @return Instance of {@link WifiNetworkConfigBuilder} to enable chaining of the builder
-     * method.
-     */
-    public WifiNetworkConfigBuilder setIsUserInteractionRequired() {
-        mIsUserInteractionRequired = true;
-        return this;
-    }
-
-    /**
-     * Specify the priority of this network among other network suggestions provided by the same app
-     * (priorities have no impact on suggestions by different apps). The lower the number, the
-     * higher the priority (i.e value of 0 = highest priority).
-     * <p>
-     * <li>Only allowed for creating network suggestion, i.e {@link #buildNetworkSuggestion()}.</li>
-     * <li>If not set, defaults to -1 (i.e unassigned priority).</li>
-     *
-     * @param priority Integer number representing the priority among suggestions by the app.
-     * @return Instance of {@link WifiNetworkConfigBuilder} to enable chaining of the builder
-     * method.
-     * @throws IllegalArgumentException if the priority value is negative.
-     */
-    public WifiNetworkConfigBuilder setPriority(int priority) {
-        if (priority < 0) {
-            throw new IllegalArgumentException("Invalid priority value " + priority);
-        }
-        mPriority = priority;
-        return this;
-    }
-
-    /**
-     * Specifies whether this network is metered.
-     * <p>
-     * <li>Only allowed for creating network suggestion, i.e {@link #buildNetworkSuggestion()}.</li>
-     * <li>If not set, defaults to false (i.e not metered).</li>
-     *
-     * @return Instance of {@link WifiNetworkConfigBuilder} to enable chaining of the builder
-     * method.
-     */
-    public WifiNetworkConfigBuilder setIsMetered() {
-        mIsMetered = true;
-        return this;
-    }
-
-    /**
-     * Set defaults for the various low level credential type fields in the newly created
-     * WifiConfiguration object.
-     *
-     * See {@link com.android.server.wifi.WifiConfigManager#setDefaultsInWifiConfiguration(
-     * WifiConfiguration)}.
-     *
-     * @param configuration provided WifiConfiguration object.
-     */
-    private static void setDefaultsInWifiConfiguration(@NonNull WifiConfiguration configuration) {
-        configuration.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
-        configuration.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
-        configuration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
-        configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
-        configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
-    }
-
-    private void setSecurityParamsInWifiConfiguration(@NonNull WifiConfiguration configuration) {
-        if (!TextUtils.isEmpty(mWpa2PskPassphrase)) { // WPA-PSK network.
-            configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
-            // WifiConfiguration.preSharedKey needs quotes around ASCII password.
-            configuration.preSharedKey = "\"" + mWpa2PskPassphrase + "\"";
-        } else if (!TextUtils.isEmpty(mWpa3SaePassphrase)) { // WPA3-SAE network.
-            configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.SAE);
-            // PMF mandatory for SAE.
-            configuration.requirePMF = true;
-            // WifiConfiguration.preSharedKey needs quotes around ASCII password.
-            configuration.preSharedKey = "\"" + mWpa3SaePassphrase + "\"";
-        } else if (mWpa2EnterpriseConfig != null) { // WPA-EAP network
-            configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
-            configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X);
-            configuration.enterpriseConfig = mWpa2EnterpriseConfig;
-        } else if (mWpa3EnterpriseConfig != null) { // WPA3-SuiteB network
-            configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.SUITE_B_192);
-            configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.GCMP_256);
-            // TODO (b/113878056): Verify these params once we verify SuiteB configuration.
-            configuration.allowedGroupManagementCiphers.set(
-                    WifiConfiguration.GroupMgmtCipher.BIP_GMAC_256);
-            configuration.allowedSuiteBCiphers.set(
-                    WifiConfiguration.SuiteBCipher.ECDHE_ECDSA);
-            configuration.allowedSuiteBCiphers.set(
-                    WifiConfiguration.SuiteBCipher.ECDHE_RSA);
-            configuration.requirePMF = true;
-            configuration.enterpriseConfig = mWpa3EnterpriseConfig;
-        } else if (mIsEnhancedOpen) { // OWE network
-            configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.OWE);
-            // PMF mandatory.
-            configuration.requirePMF = true;
-        } else { // Open network
-            configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
-        }
-    }
-
-    /**
-     * Helper method to build WifiConfiguration object from the builder.
-     * @return Instance of {@link WifiConfiguration}.
-     */
-    private WifiConfiguration buildWifiConfiguration() {
-        final WifiConfiguration wifiConfiguration = new WifiConfiguration();
-        setDefaultsInWifiConfiguration(wifiConfiguration);
-        // WifiConfiguration.SSID needs quotes around unicode SSID.
-        if (mSsidPatternMatcher.getType() == PatternMatcher.PATTERN_LITERAL) {
-            wifiConfiguration.SSID = "\"" + mSsidPatternMatcher.getPath() + "\"";
-        }
-        if (mBssidPatternMatcher.second == MATCH_EXACT_BSSID_PATTERN_MASK) {
-            wifiConfiguration.BSSID = mBssidPatternMatcher.first.toString();
-        }
-        setSecurityParamsInWifiConfiguration(wifiConfiguration);
-        wifiConfiguration.hiddenSSID = mIsHiddenSSID;
-        wifiConfiguration.priority = mPriority;
-        wifiConfiguration.meteredOverride =
-                mIsMetered ? WifiConfiguration.METERED_OVERRIDE_METERED
-                           : WifiConfiguration.METERED_OVERRIDE_NONE;
-        return wifiConfiguration;
-    }
-
-    private boolean hasSetAnyPattern() {
-        return mSsidPatternMatcher != null || mBssidPatternMatcher != null;
-    }
-
-    private void setMatchAnyPatternIfUnset() {
-        if (mSsidPatternMatcher == null) {
-            mSsidPatternMatcher = new PatternMatcher(MATCH_ALL_SSID_PATTERN_PATH,
-                    PatternMatcher.PATTERN_SIMPLE_GLOB);
-        }
-        if (mBssidPatternMatcher == null) {
-            mBssidPatternMatcher = MATCH_ALL_BSSID_PATTERN;
-        }
-    }
-
-    private boolean hasSetMatchNonePattern() {
-        if (mSsidPatternMatcher.getType() != PatternMatcher.PATTERN_PREFIX
-                && mSsidPatternMatcher.getPath().equals(MATCH_EMPTY_SSID_PATTERN_PATH)) {
-            return true;
-        }
-        if (mBssidPatternMatcher.equals(MATCH_NO_BSSID_PATTERN1)) {
-            return true;
-        }
-        if (mBssidPatternMatcher.equals(MATCH_NO_BSSID_PATTERN2)) {
-            return true;
-        }
-        return false;
-    }
-
-    private boolean hasSetMatchAllPattern() {
-        if ((mSsidPatternMatcher.match(MATCH_EMPTY_SSID_PATTERN_PATH))
-                && mBssidPatternMatcher.equals(MATCH_ALL_BSSID_PATTERN)) {
-            return true;
-        }
-        return false;
-    }
-
-    private boolean hasSetMatchExactPattern() {
-        // exact ssid match with either match-all bssid or match-exact bssid.
-        if (mSsidPatternMatcher.getType() == PatternMatcher.PATTERN_LITERAL
-                && (mBssidPatternMatcher.equals(MATCH_ALL_BSSID_PATTERN)
-                || mBssidPatternMatcher.second.equals(MATCH_EXACT_BSSID_PATTERN_MASK))) {
-            return true;
-        }
-        return false;
-    }
-
-    private void validateSecurityParams() {
-        int numSecurityTypes = 0;
-        numSecurityTypes += mIsEnhancedOpen ? 1 : 0;
-        numSecurityTypes += !TextUtils.isEmpty(mWpa2PskPassphrase) ? 1 : 0;
-        numSecurityTypes += !TextUtils.isEmpty(mWpa3SaePassphrase) ? 1 : 0;
-        numSecurityTypes += mWpa2EnterpriseConfig != null ? 1 : 0;
-        numSecurityTypes += mWpa3EnterpriseConfig != null ? 1 : 0;
-        if (numSecurityTypes > 1) {
-            throw new IllegalStateException("only one of setIsEnhancedOpen, setWpa2Passphrase,"
-                    + "setWpa3Passphrase, setWpa2EnterpriseConfig or setWpa3EnterpriseConfig"
-                    + " can be invoked for network specifier");
-        }
-    }
-
-    /**
-     * Create a specifier object used to request a Wi-Fi network. The generated
-     * {@link NetworkSpecifier} should be used in
-     * {@link NetworkRequest.Builder#setNetworkSpecifier(NetworkSpecifier)} when building
-     * the {@link NetworkRequest}.
-     *<p>
-     * Note: Apps can set a combination of network match params:
-     * <li> SSID Pattern using {@link #setSsidPattern(PatternMatcher)} OR Specific SSID using
-     * {@link #setSsid(String)}. </li>
-     * AND/OR
-     * <li> BSSID Pattern using {@link #setBssidPattern(MacAddress, MacAddress)} OR Specific BSSID
-     * using {@link #setBssid(MacAddress)} </li>
-     * to trigger connection to a network that matches the set params.
-     * The system will find the set of networks matching the request and present the user
-     * with a system dialog which will allow the user to select a specific Wi-Fi network to connect
-     * to or to deny the request.
-     *</p>
-     *
-     * For example:
-     * To connect to an open network with a SSID prefix of "test" and a BSSID OUI of "10:03:23":
-     * {@code
-     * final NetworkSpecifier specifier =
-     *      new WifiNetworkConfigBuilder()
-     *      .setSsidPattern(new PatternMatcher("test", PatterMatcher.PATTERN_PREFIX))
-     *      .setBssidPattern(MacAddress.fromString("10:03:23:00:00:00"),
-     *                       MacAddress.fromString("ff:ff:ff:00:00:00"))
-     *      .buildNetworkSpecifier()
-     * final NetworkRequest request =
-     *      new NetworkRequest.Builder()
-     *      .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
-     *      .setNetworkSpecifier(specifier)
-     *      .build();
-     * final ConnectivityManager connectivityManager =
-     *      context.getSystemService(Context.CONNECTIVITY_SERVICE);
-     * final NetworkCallback networkCallback = new NetworkCallback() {
-     *      ...
-     *      {@literal @}Override
-     *      void onAvailable(...) {}
-     *      // etc.
-     * };
-     * connectivityManager.requestNetwork(request, networkCallback);
-     * }
-     *
-     * @return Instance of {@link NetworkSpecifier}.
-     * @throws IllegalStateException on invalid params set.
-     */
-    public NetworkSpecifier buildNetworkSpecifier() {
-        if (!hasSetAnyPattern()) {
-            throw new IllegalStateException("one of setSsidPattern/setSsid/setBssidPattern/setBssid"
-                    + " should be invoked for specifier");
-        }
-        setMatchAnyPatternIfUnset();
-        if (hasSetMatchNonePattern()) {
-            throw new IllegalStateException("cannot set match-none pattern for specifier");
-        }
-        if (hasSetMatchAllPattern()) {
-            throw new IllegalStateException("cannot set match-all pattern for specifier");
-        }
-        if (mIsHiddenSSID && mSsidPatternMatcher.getType() != PatternMatcher.PATTERN_LITERAL) {
-            throw new IllegalStateException("setSsid should also be invoked when "
-                    + "setIsHiddenSsid is invoked for network specifier");
-        }
-        if (mIsAppInteractionRequired || mIsUserInteractionRequired
-                || mPriority != -1 || mIsMetered) {
-            throw new IllegalStateException("none of setIsAppInteractionRequired/"
-                    + "setIsUserInteractionRequired/setPriority/setIsMetered are allowed for "
-                    + "specifier");
-        }
-        validateSecurityParams();
-
-        return new WifiNetworkSpecifier(
-                mSsidPatternMatcher,
-                mBssidPatternMatcher,
-                buildWifiConfiguration(),
-                Process.myUid(),
-                ActivityThread.currentApplication().getApplicationContext().getOpPackageName());
-    }
-
-    /**
-     * Create a network suggestion object use in {@link WifiManager#addNetworkSuggestions(List)}.
-     * See {@link WifiNetworkSuggestion}.
-     *<p>
-     * Note: Apps can set a combination of SSID using {@link #setSsid(String)} and BSSID
-     * using {@link #setBssid(MacAddress)} to provide more fine grained network suggestions to the
-     * platform.
-     * </p>
-     *
-     * For example:
-     * To provide credentials for one open, one WPA2 and one WPA3 network with their
-     * corresponding SSID's:
-     * {@code
-     * final WifiNetworkSuggestion suggestion1 =
-     *      new WifiNetworkConfigBuilder()
-     *      .setSsid("test111111")
-     *      .buildNetworkSuggestion()
-     * final WifiNetworkSuggestion suggestion2 =
-     *      new WifiNetworkConfigBuilder()
-     *      .setSsid("test222222")
-     *      .setWpa2Passphrase("test123456")
-     *      .buildNetworkSuggestion()
-     * final WifiNetworkSuggestion suggestion3 =
-     *      new WifiNetworkConfigBuilder()
-     *      .setSsid("test333333")
-     *      .setWpa3Passphrase("test6789")
-     *      .buildNetworkSuggestion()
-     * final List<WifiNetworkSuggestion> suggestionsList = new ArrayList<WifiNetworkSuggestion> {{
-     *          add(suggestion1);
-     *          add(suggestion2);
-     *          add(suggestion3);
-     *      }};
-     * final WifiManager wifiManager =
-     *      context.getSystemService(Context.WIFI_SERVICE);
-     * wifiManager.addNetworkSuggestions(suggestionsList);
-     * ...
-     * }
-     *
-     * @return Instance of {@link WifiNetworkSuggestion}.
-     * @throws IllegalStateException on invalid params set.
-     */
-    public WifiNetworkSuggestion buildNetworkSuggestion() {
-        if (mSsidPatternMatcher == null) {
-            throw new IllegalStateException("setSsid should be invoked for suggestion");
-        }
-        setMatchAnyPatternIfUnset();
-        if (!hasSetMatchExactPattern()) {
-            throw new IllegalStateException("none of setSsidPattern/setBssidPattern are"
-                    + " allowed for suggestion");
-        }
-        if (hasSetMatchNonePattern()) {
-            throw new IllegalStateException("cannot set match-none for suggestion");
-        }
-        validateSecurityParams();
-
-        return new WifiNetworkSuggestion(
-                buildWifiConfiguration(),
-                mIsAppInteractionRequired,
-                mIsUserInteractionRequired,
-                Process.myUid(),
-                ActivityThread.currentApplication().getApplicationContext().getOpPackageName());
-
-    }
-}
diff --git a/wifi/java/android/net/wifi/WifiNetworkSpecifier.java b/wifi/java/android/net/wifi/WifiNetworkSpecifier.java
index a5f4675..a69c7a5 100644
--- a/wifi/java/android/net/wifi/WifiNetworkSpecifier.java
+++ b/wifi/java/android/net/wifi/WifiNetworkSpecifier.java
@@ -19,31 +19,466 @@
 import static com.android.internal.util.Preconditions.checkNotNull;
 
 import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.ActivityThread;
 import android.net.MacAddress;
 import android.net.MatchAllNetworkSpecifier;
+import android.net.NetworkRequest;
 import android.net.NetworkSpecifier;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.os.PatternMatcher;
+import android.os.Process;
 import android.text.TextUtils;
 import android.util.Pair;
 
+import java.nio.charset.CharsetEncoder;
+import java.nio.charset.StandardCharsets;
 import java.util.Objects;
 
 /**
- * Network specifier object used to request a Wi-Fi network. Apps should use the
- * {@link WifiNetworkConfigBuilder} class to create an instance.
- * @hide
+ * Network specifier object used to request a local Wi-Fi network. Apps should use the
+ * {@link WifiNetworkSpecifier.Builder} class to create an instance.
  */
 public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parcelable {
+
+    /**
+     * Builder used to create {@link WifiNetworkSpecifier} objects.
+     */
+    public static class Builder {
+        private static final String MATCH_ALL_SSID_PATTERN_PATH = ".*";
+        private static final String MATCH_EMPTY_SSID_PATTERN_PATH = "";
+        private static final Pair<MacAddress, MacAddress> MATCH_NO_BSSID_PATTERN1 =
+                new Pair(MacAddress.BROADCAST_ADDRESS, MacAddress.BROADCAST_ADDRESS);
+        private static final Pair<MacAddress, MacAddress> MATCH_NO_BSSID_PATTERN2 =
+                new Pair(MacAddress.ALL_ZEROS_ADDRESS, MacAddress.BROADCAST_ADDRESS);
+        private static final Pair<MacAddress, MacAddress> MATCH_ALL_BSSID_PATTERN =
+                new Pair(MacAddress.ALL_ZEROS_ADDRESS, MacAddress.ALL_ZEROS_ADDRESS);
+        private static final MacAddress MATCH_EXACT_BSSID_PATTERN_MASK =
+                MacAddress.BROADCAST_ADDRESS;
+
+        /**
+         * SSID pattern match specified by the app.
+         */
+        private @Nullable PatternMatcher mSsidPatternMatcher;
+        /**
+         * BSSID pattern match specified by the app.
+         * Pair of <BaseAddress, Mask>.
+         */
+        private @Nullable Pair<MacAddress, MacAddress> mBssidPatternMatcher;
+        /**
+         * Whether this is an OWE network or not.
+         */
+        private boolean mIsEnhancedOpen;
+        /**
+         * Pre-shared key for use with WPA-PSK networks.
+         */
+        private @Nullable String mWpa2PskPassphrase;
+        /**
+         * Pre-shared key for use with WPA3-SAE networks.
+         */
+        private @Nullable String mWpa3SaePassphrase;
+        /**
+         * The enterprise configuration details specifying the EAP method,
+         * certificates and other settings associated with the WPA-EAP networks.
+         */
+        private @Nullable WifiEnterpriseConfig mWpa2EnterpriseConfig;
+        /**
+         * The enterprise configuration details specifying the EAP method,
+         * certificates and other settings associated with the SuiteB networks.
+         */
+        private @Nullable WifiEnterpriseConfig mWpa3EnterpriseConfig;
+        /**
+         * This is a network that does not broadcast its SSID, so an
+         * SSID-specific probe request must be used for scans.
+         */
+        private boolean mIsHiddenSSID;
+
+        public Builder() {
+            mSsidPatternMatcher = null;
+            mBssidPatternMatcher = null;
+            mIsEnhancedOpen = false;
+            mWpa2PskPassphrase = null;
+            mWpa3SaePassphrase = null;
+            mWpa2EnterpriseConfig = null;
+            mWpa3EnterpriseConfig = null;
+            mIsHiddenSSID = false;
+        }
+
+        /**
+         * Set the unicode SSID match pattern to use for filtering networks from scan results.
+         * <p>
+         * <li>Overrides any previous value set using {@link #setSsid(String)} or
+         * {@link #setSsidPattern(PatternMatcher)}.</li>
+         *
+         * @param ssidPattern Instance of {@link PatternMatcher} containing the UTF-8 encoded
+         *                    string pattern to use for matching the network's SSID.
+         * @return Instance of {@link Builder} to enable chaining of the builder method.
+         */
+        public Builder setSsidPattern(@NonNull PatternMatcher ssidPattern) {
+            checkNotNull(ssidPattern);
+            mSsidPatternMatcher = ssidPattern;
+            return this;
+        }
+
+        /**
+         * Set the unicode SSID for the network.
+         * <p>
+         * <li>Sets the SSID to use for filtering networks from scan results. Will only match
+         * networks whose SSID is identical to the UTF-8 encoding of the specified value.</li>
+         * <li>Overrides any previous value set using {@link #setSsid(String)} or
+         * {@link #setSsidPattern(PatternMatcher)}.</li>
+         *
+         * @param ssid The SSID of the network. It must be valid Unicode.
+         * @return Instance of {@link Builder} to enable chaining of the builder method.
+         * @throws IllegalArgumentException if the SSID is not valid unicode.
+         */
+        public Builder setSsid(@NonNull String ssid) {
+            checkNotNull(ssid);
+            final CharsetEncoder unicodeEncoder = StandardCharsets.UTF_8.newEncoder();
+            if (!unicodeEncoder.canEncode(ssid)) {
+                throw new IllegalArgumentException("SSID is not a valid unicode string");
+            }
+            mSsidPatternMatcher = new PatternMatcher(ssid, PatternMatcher.PATTERN_LITERAL);
+            return this;
+        }
+
+        /**
+         * Set the BSSID match pattern to use for filtering networks from scan results.
+         * Will match all networks with BSSID which satisfies the following:
+         * {@code BSSID & mask == baseAddress}.
+         * <p>
+         * <li>Overrides any previous value set using {@link #setBssid(MacAddress)} or
+         * {@link #setBssidPattern(MacAddress, MacAddress)}.</li>
+         *
+         * @param baseAddress Base address for BSSID pattern.
+         * @param mask Mask for BSSID pattern.
+         * @return Instance of {@link Builder} to enable chaining of the builder method.
+         */
+        public Builder setBssidPattern(
+                @NonNull MacAddress baseAddress, @NonNull MacAddress mask) {
+            checkNotNull(baseAddress, mask);
+            mBssidPatternMatcher = Pair.create(baseAddress, mask);
+            return this;
+        }
+
+        /**
+         * Set the BSSID to use for filtering networks from scan results. Will only match network
+         * whose BSSID is identical to the specified value.
+         * <p>
+         * <li>Sets the BSSID to use for filtering networks from scan results. Will only match
+         * networks whose BSSID is identical to specified value.</li>
+         * <li>Overrides any previous value set using {@link #setBssid(MacAddress)} or
+         * {@link #setBssidPattern(MacAddress, MacAddress)}.</li>
+         *
+         * @param bssid BSSID of the network.
+         * @return Instance of {@link Builder} to enable chaining of the builder method.
+         */
+        public Builder setBssid(@NonNull MacAddress bssid) {
+            checkNotNull(bssid);
+            mBssidPatternMatcher = Pair.create(bssid, MATCH_EXACT_BSSID_PATTERN_MASK);
+            return this;
+        }
+
+        /**
+         * Specifies whether this represents an Enhanced Open (OWE) network.
+         *
+         * @return Instance of {@link Builder} to enable chaining of the builder method.
+         */
+        public Builder setIsEnhancedOpen() {
+            mIsEnhancedOpen = true;
+            return this;
+        }
+
+        /**
+         * Set the ASCII WPA2 passphrase for this network. Needed for authenticating to
+         * WPA2-PSK networks.
+         *
+         * @param passphrase passphrase of the network.
+         * @return Instance of {@link Builder} to enable chaining of the builder method.
+         * @throws IllegalArgumentException if the passphrase is not ASCII encodable.
+         */
+        public Builder setWpa2Passphrase(@NonNull String passphrase) {
+            checkNotNull(passphrase);
+            final CharsetEncoder asciiEncoder = StandardCharsets.US_ASCII.newEncoder();
+            if (!asciiEncoder.canEncode(passphrase)) {
+                throw new IllegalArgumentException("passphrase not ASCII encodable");
+            }
+            mWpa2PskPassphrase = passphrase;
+            return this;
+        }
+
+        /**
+         * Set the ASCII WPA3 passphrase for this network. Needed for authenticating to WPA3-SAE
+         * networks.
+         *
+         * @param passphrase passphrase of the network.
+         * @return Instance of {@link Builder} to enable chaining of the builder method.
+         * @throws IllegalArgumentException if the passphrase is not ASCII encodable.
+         */
+        public Builder setWpa3Passphrase(@NonNull String passphrase) {
+            checkNotNull(passphrase);
+            final CharsetEncoder asciiEncoder = StandardCharsets.US_ASCII.newEncoder();
+            if (!asciiEncoder.canEncode(passphrase)) {
+                throw new IllegalArgumentException("passphrase not ASCII encodable");
+            }
+            mWpa3SaePassphrase = passphrase;
+            return this;
+        }
+
+        /**
+         * Set the associated enterprise configuration for this network. Needed for authenticating
+         * to WPA2-EAP networks. See {@link WifiEnterpriseConfig} for description.
+         *
+         * @param enterpriseConfig Instance of {@link WifiEnterpriseConfig}.
+         * @return Instance of {@link Builder} to enable chaining of the builder method.
+         */
+        public Builder setWpa2EnterpriseConfig(
+                @NonNull WifiEnterpriseConfig enterpriseConfig) {
+            checkNotNull(enterpriseConfig);
+            mWpa2EnterpriseConfig = new WifiEnterpriseConfig(enterpriseConfig);
+            return this;
+        }
+
+        /**
+         * Set the associated enterprise configuration for this network. Needed for authenticating
+         * to WPA3-SuiteB networks. See {@link WifiEnterpriseConfig} for description.
+         *
+         * @param enterpriseConfig Instance of {@link WifiEnterpriseConfig}.
+         * @return Instance of {@link Builder} to enable chaining of the builder method.
+         */
+        public Builder setWpa3EnterpriseConfig(
+                @NonNull WifiEnterpriseConfig enterpriseConfig) {
+            checkNotNull(enterpriseConfig);
+            mWpa3EnterpriseConfig = new WifiEnterpriseConfig(enterpriseConfig);
+            return this;
+        }
+
+        /**
+         * Specifies whether this represents a hidden network.
+         * <p>
+         * <li>Setting this disallows the usage of {@link #setSsidPattern(PatternMatcher)} since
+         * hidden networks need to be explicitly probed for.</li>
+         * <li>If not set, defaults to false (i.e not a hidden network).</li>
+         *
+         * @return Instance of {@link Builder} to enable chaining of the builder method.
+         */
+        public Builder setIsHiddenSsid() {
+            mIsHiddenSSID = true;
+            return this;
+        }
+
+
+        /**
+         * Set defaults for the various low level credential type fields in the newly created
+         * WifiConfiguration object.
+         *
+         * See {@link com.android.server.wifi.WifiConfigManager#setDefaultsInWifiConfiguration(
+         * WifiConfiguration)}.
+         *
+         * @param configuration provided WifiConfiguration object.
+         */
+        private static void setDefaultsInWifiConfiguration(
+                @NonNull WifiConfiguration configuration) {
+            configuration.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
+            configuration.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
+            configuration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
+            configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
+            configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
+        }
+
+        private void setSecurityParamsInWifiConfiguration(
+                @NonNull WifiConfiguration configuration) {
+            if (!TextUtils.isEmpty(mWpa2PskPassphrase)) { // WPA-PSK network.
+                configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
+                // WifiConfiguration.preSharedKey needs quotes around ASCII password.
+                configuration.preSharedKey = "\"" + mWpa2PskPassphrase + "\"";
+            } else if (!TextUtils.isEmpty(mWpa3SaePassphrase)) { // WPA3-SAE network.
+                configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.SAE);
+                // PMF mandatory for SAE.
+                configuration.requirePMF = true;
+                // WifiConfiguration.preSharedKey needs quotes around ASCII password.
+                configuration.preSharedKey = "\"" + mWpa3SaePassphrase + "\"";
+            } else if (mWpa2EnterpriseConfig != null) { // WPA-EAP network
+                configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
+                configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X);
+                configuration.enterpriseConfig = mWpa2EnterpriseConfig;
+            } else if (mWpa3EnterpriseConfig != null) { // WPA3-SuiteB network
+                configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.SUITE_B_192);
+                configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.GCMP_256);
+                // TODO (b/113878056): Verify these params once we verify SuiteB configuration.
+                configuration.allowedGroupManagementCiphers.set(
+                        WifiConfiguration.GroupMgmtCipher.BIP_GMAC_256);
+                configuration.allowedSuiteBCiphers.set(
+                        WifiConfiguration.SuiteBCipher.ECDHE_ECDSA);
+                configuration.allowedSuiteBCiphers.set(
+                        WifiConfiguration.SuiteBCipher.ECDHE_RSA);
+                configuration.requirePMF = true;
+                configuration.enterpriseConfig = mWpa3EnterpriseConfig;
+            } else if (mIsEnhancedOpen) { // OWE network
+                configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.OWE);
+                // PMF mandatory.
+                configuration.requirePMF = true;
+            } else { // Open network
+                configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
+            }
+        }
+
+        /**
+         * Helper method to build WifiConfiguration object from the builder.
+         * @return Instance of {@link WifiConfiguration}.
+         */
+        private WifiConfiguration buildWifiConfiguration() {
+            final WifiConfiguration wifiConfiguration = new WifiConfiguration();
+            setDefaultsInWifiConfiguration(wifiConfiguration);
+            // WifiConfiguration.SSID needs quotes around unicode SSID.
+            if (mSsidPatternMatcher.getType() == PatternMatcher.PATTERN_LITERAL) {
+                wifiConfiguration.SSID = "\"" + mSsidPatternMatcher.getPath() + "\"";
+            }
+            if (mBssidPatternMatcher.second == MATCH_EXACT_BSSID_PATTERN_MASK) {
+                wifiConfiguration.BSSID = mBssidPatternMatcher.first.toString();
+            }
+            setSecurityParamsInWifiConfiguration(wifiConfiguration);
+            wifiConfiguration.hiddenSSID = mIsHiddenSSID;
+            return wifiConfiguration;
+        }
+
+        private boolean hasSetAnyPattern() {
+            return mSsidPatternMatcher != null || mBssidPatternMatcher != null;
+        }
+
+        private void setMatchAnyPatternIfUnset() {
+            if (mSsidPatternMatcher == null) {
+                mSsidPatternMatcher = new PatternMatcher(MATCH_ALL_SSID_PATTERN_PATH,
+                        PatternMatcher.PATTERN_SIMPLE_GLOB);
+            }
+            if (mBssidPatternMatcher == null) {
+                mBssidPatternMatcher = MATCH_ALL_BSSID_PATTERN;
+            }
+        }
+
+        private boolean hasSetMatchNonePattern() {
+            if (mSsidPatternMatcher.getType() != PatternMatcher.PATTERN_PREFIX
+                    && mSsidPatternMatcher.getPath().equals(MATCH_EMPTY_SSID_PATTERN_PATH)) {
+                return true;
+            }
+            if (mBssidPatternMatcher.equals(MATCH_NO_BSSID_PATTERN1)) {
+                return true;
+            }
+            if (mBssidPatternMatcher.equals(MATCH_NO_BSSID_PATTERN2)) {
+                return true;
+            }
+            return false;
+        }
+
+        private boolean hasSetMatchAllPattern() {
+            if ((mSsidPatternMatcher.match(MATCH_EMPTY_SSID_PATTERN_PATH))
+                    && mBssidPatternMatcher.equals(MATCH_ALL_BSSID_PATTERN)) {
+                return true;
+            }
+            return false;
+        }
+
+        private void validateSecurityParams() {
+            int numSecurityTypes = 0;
+            numSecurityTypes += mIsEnhancedOpen ? 1 : 0;
+            numSecurityTypes += !TextUtils.isEmpty(mWpa2PskPassphrase) ? 1 : 0;
+            numSecurityTypes += !TextUtils.isEmpty(mWpa3SaePassphrase) ? 1 : 0;
+            numSecurityTypes += mWpa2EnterpriseConfig != null ? 1 : 0;
+            numSecurityTypes += mWpa3EnterpriseConfig != null ? 1 : 0;
+            if (numSecurityTypes > 1) {
+                throw new IllegalStateException("only one of setIsEnhancedOpen, setWpa2Passphrase,"
+                        + "setWpa3Passphrase, setWpa2EnterpriseConfig or setWpa3EnterpriseConfig"
+                        + " can be invoked for network specifier");
+            }
+        }
+
+        /**
+         * Create a specifier object used to request a local Wi-Fi network. The generated
+         * {@link NetworkSpecifier} should be used in
+         * {@link NetworkRequest.Builder#setNetworkSpecifier(NetworkSpecifier)} when building
+         * the {@link NetworkRequest}. These specifiers can only be used to request a local wifi
+         * network (i.e no internet capability). So, the device will not switch it's default route
+         * to wifi if there are other transports (cellular for example) available.
+         *<p>
+         * Note: Apps can set a combination of network match params:
+         * <li> SSID Pattern using {@link #setSsidPattern(PatternMatcher)} OR Specific SSID using
+         * {@link #setSsid(String)}. </li>
+         * AND/OR
+         * <li> BSSID Pattern using {@link #setBssidPattern(MacAddress, MacAddress)} OR Specific
+         * BSSID using {@link #setBssid(MacAddress)} </li>
+         * to trigger connection to a network that matches the set params.
+         * The system will find the set of networks matching the request and present the user
+         * with a system dialog which will allow the user to select a specific Wi-Fi network to
+         * connect to or to deny the request.
+         *</p>
+         *
+         * For example:
+         * To connect to an open network with a SSID prefix of "test" and a BSSID OUI of "10:03:23":
+         * {@code
+         * final NetworkSpecifier specifier =
+         *      new Builder()
+         *      .setSsidPattern(new PatternMatcher("test", PatterMatcher.PATTERN_PREFIX))
+         *      .setBssidPattern(MacAddress.fromString("10:03:23:00:00:00"),
+         *                       MacAddress.fromString("ff:ff:ff:00:00:00"))
+         *      .buildNetworkSpecifier()
+         * final NetworkRequest request =
+         *      new NetworkRequest.Builder()
+         *      .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
+         *      .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
+         *      .setNetworkSpecifier(specifier)
+         *      .build();
+         * final ConnectivityManager connectivityManager =
+         *      context.getSystemService(Context.CONNECTIVITY_SERVICE);
+         * final NetworkCallback networkCallback = new NetworkCallback() {
+         *      ...
+         *      {@literal @}Override
+         *      void onAvailable(...) {}
+         *      // etc.
+         * };
+         * connectivityManager.requestNetwork(request, networkCallback);
+         * }
+         *
+         * @return Instance of {@link NetworkSpecifier}.
+         * @throws IllegalStateException on invalid params set.
+         */
+        public NetworkSpecifier build() {
+            if (!hasSetAnyPattern()) {
+                throw new IllegalStateException("one of setSsidPattern/setSsid/setBssidPattern/"
+                        + "setBssid should be invoked for specifier");
+            }
+            setMatchAnyPatternIfUnset();
+            if (hasSetMatchNonePattern()) {
+                throw new IllegalStateException("cannot set match-none pattern for specifier");
+            }
+            if (hasSetMatchAllPattern()) {
+                throw new IllegalStateException("cannot set match-all pattern for specifier");
+            }
+            if (mIsHiddenSSID && mSsidPatternMatcher.getType() != PatternMatcher.PATTERN_LITERAL) {
+                throw new IllegalStateException("setSsid should also be invoked when "
+                        + "setIsHiddenSsid is invoked for network specifier");
+            }
+            validateSecurityParams();
+
+            return new WifiNetworkSpecifier(
+                    mSsidPatternMatcher,
+                    mBssidPatternMatcher,
+                    buildWifiConfiguration(),
+                    Process.myUid(),
+                    ActivityThread.currentApplication().getApplicationContext().getOpPackageName());
+        }
+    }
+
     /**
      * SSID pattern match specified by the app.
+     * @hide
      */
     public final PatternMatcher ssidPatternMatcher;
 
     /**
      * BSSID pattern match specified by the app.
      * Pair of <BaseAddress, Mask>.
+     * @hide
      */
     public final Pair<MacAddress, MacAddress> bssidPatternMatcher;
 
@@ -54,6 +489,7 @@
      * WifiConfiguration are not used. Instead we use the {@link #ssidPatternMatcher} &
      * {@link #bssidPatternMatcher} fields embedded directly
      * within {@link WifiNetworkSpecifier}.
+     * @hide
      */
     public final WifiConfiguration wifiConfiguration;
 
@@ -61,18 +497,26 @@
      * The UID of the process initializing this network specifier. Validated by receiver using
      * checkUidIfNecessary() and is used by satisfiedBy() to determine whether the specifier
      * matches the offered network.
+     * @hide
      */
     public final int requestorUid;
 
     /**
      * The package name of the app initializing this network specifier.
+     * @hide
      */
     public final String requestorPackageName;
 
+    /** @hide */
+    public WifiNetworkSpecifier() throws IllegalAccessException {
+        throw new IllegalAccessException("Use the builder to create an instance");
+    }
+
+    /** @hide */
     public WifiNetworkSpecifier(@NonNull PatternMatcher ssidPatternMatcher,
-                 @NonNull Pair<MacAddress, MacAddress> bssidPatternMatcher,
-                 @NonNull WifiConfiguration wifiConfiguration,
-                 int requestorUid, @NonNull String requestorPackageName) {
+                                @NonNull Pair<MacAddress, MacAddress> bssidPatternMatcher,
+                                @NonNull WifiConfiguration wifiConfiguration,
+                                int requestorUid, @NonNull String requestorPackageName) {
         checkNotNull(ssidPatternMatcher);
         checkNotNull(bssidPatternMatcher);
         checkNotNull(wifiConfiguration);
@@ -123,23 +567,6 @@
     }
 
     @Override
-    public boolean satisfiedBy(NetworkSpecifier other) {
-        if (this == other) {
-            return true;
-        }
-        // Any generic requests should be satisifed by a specific wifi network.
-        if (other == null || other instanceof MatchAllNetworkSpecifier) {
-            return true;
-        }
-        if (other instanceof WifiNetworkAgentSpecifier) {
-            return ((WifiNetworkAgentSpecifier) other).satisfiesNetworkSpecifier(this);
-        }
-        // Specific requests are checked for equality although testing for equality of 2 patterns do
-        // not make much sense!
-        return equals(other);
-    }
-
-    @Override
     public int hashCode() {
         return Objects.hash(
                 ssidPatternMatcher.getPath(),
@@ -184,6 +611,25 @@
                 .toString();
     }
 
+    /** @hide */
+    @Override
+    public boolean satisfiedBy(NetworkSpecifier other) {
+        if (this == other) {
+            return true;
+        }
+        // Any generic requests should be satisifed by a specific wifi network.
+        if (other == null || other instanceof MatchAllNetworkSpecifier) {
+            return true;
+        }
+        if (other instanceof WifiNetworkAgentSpecifier) {
+            return ((WifiNetworkAgentSpecifier) other).satisfiesNetworkSpecifier(this);
+        }
+        // Specific requests are checked for equality although testing for equality of 2 patterns do
+        // not make much sense!
+        return equals(other);
+    }
+
+    /** @hide */
     @Override
     public void assertValidFromUid(int requestorUid) {
         if (this.requestorUid != requestorUid) {
diff --git a/wifi/java/android/net/wifi/WifiNetworkSuggestion.java b/wifi/java/android/net/wifi/WifiNetworkSuggestion.java
index 6b05dfc..460c633 100644
--- a/wifi/java/android/net/wifi/WifiNetworkSuggestion.java
+++ b/wifi/java/android/net/wifi/WifiNetworkSuggestion.java
@@ -19,23 +19,449 @@
 import static com.android.internal.util.Preconditions.checkNotNull;
 
 import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.ActivityThread;
+import android.net.MacAddress;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.os.Process;
 import android.text.TextUtils;
 
+import java.nio.charset.CharsetEncoder;
+import java.nio.charset.StandardCharsets;
 import java.util.List;
 import java.util.Objects;
 
 /**
  * The Network Suggestion object is used to provide a Wi-Fi network for consideration when
  * auto-connecting to networks. Apps cannot directly create this object, they must use
- * {@link WifiNetworkConfigBuilder#buildNetworkSuggestion()} to obtain an instance
- * of this object.
+ * {@link WifiNetworkSuggestion.Builder#build()} to obtain an instance of this object.
  *<p>
  * Apps can provide a list of such networks to the platform using
  * {@link WifiManager#addNetworkSuggestions(List)}.
  */
 public final class WifiNetworkSuggestion implements Parcelable {
+
+    /**
+     * Builder used to create {@link WifiNetworkSuggestion} objects.
+     */
+    public static class Builder {
+        private static final int UNASSIGNED_PRIORITY = -1;
+
+        /**
+         * SSID of the network.
+         */
+        private String mSsid;
+        /**
+         * Optional BSSID within the network.
+         */
+        private MacAddress mBssid;
+        /**
+         * Whether this is an OWE network or not.
+         */
+        private boolean mIsEnhancedOpen;
+        /**
+         * Pre-shared key for use with WPA-PSK networks.
+         */
+        private @Nullable String mWpa2PskPassphrase;
+        /**
+         * Pre-shared key for use with WPA3-SAE networks.
+         */
+        private @Nullable String mWpa3SaePassphrase;
+        /**
+         * The enterprise configuration details specifying the EAP method,
+         * certificates and other settings associated with the WPA-EAP networks.
+         */
+        private @Nullable WifiEnterpriseConfig mWpa2EnterpriseConfig;
+        /**
+         * The enterprise configuration details specifying the EAP method,
+         * certificates and other settings associated with the SuiteB networks.
+         */
+        private @Nullable WifiEnterpriseConfig mWpa3EnterpriseConfig;
+        /**
+         * This is a network that does not broadcast its SSID, so an
+         * SSID-specific probe request must be used for scans.
+         */
+        private boolean mIsHiddenSSID;
+        /**
+         * Whether app needs to log in to captive portal to obtain Internet access.
+         */
+        private boolean mIsAppInteractionRequired;
+        /**
+         * Whether user needs to log in to captive portal to obtain Internet access.
+         */
+        private boolean mIsUserInteractionRequired;
+        /**
+         * Whether this network is metered or not.
+         */
+        private boolean mIsMetered;
+        /**
+         * Priority of this network among other network suggestions provided by the app.
+         * The lower the number, the higher the priority (i.e value of 0 = highest priority).
+         */
+        private int mPriority;
+
+        public Builder() {
+            mSsid = null;
+            mBssid =  null;
+            mIsEnhancedOpen = false;
+            mWpa2PskPassphrase = null;
+            mWpa3SaePassphrase = null;
+            mWpa2EnterpriseConfig = null;
+            mWpa3EnterpriseConfig = null;
+            mIsHiddenSSID = false;
+            mIsAppInteractionRequired = false;
+            mIsUserInteractionRequired = false;
+            mIsMetered = false;
+            mPriority = UNASSIGNED_PRIORITY;
+        }
+
+        /**
+         * Set the unicode SSID for the network.
+         * <p>
+         * <li>Overrides any previous value set using {@link #setSsid(String)}.</li>
+         *
+         * @param ssid The SSID of the network. It must be valid Unicode.
+         * @return Instance of {@link Builder} to enable chaining of the builder method.
+         * @throws IllegalArgumentException if the SSID is not valid unicode.
+         */
+        public Builder setSsid(@NonNull String ssid) {
+            checkNotNull(ssid);
+            final CharsetEncoder unicodeEncoder = StandardCharsets.UTF_8.newEncoder();
+            if (!unicodeEncoder.canEncode(ssid)) {
+                throw new IllegalArgumentException("SSID is not a valid unicode string");
+            }
+            mSsid = new String(ssid);
+            return this;
+        }
+
+        /**
+         * Set the BSSID to use for filtering networks from scan results. Will only match network
+         * whose BSSID is identical to the specified value.
+         * <p>
+         * <li Sets a specific BSSID for the network suggestion. If set, only the specified BSSID
+         * with the specified SSID will be considered for connection.
+         * <li>If set, only the specified BSSID with the specified SSID will be considered for
+         * connection.</li>
+         * <li>If not set, all BSSIDs with the specified SSID will be considered for connection.
+         * </li>
+         * <li>Overrides any previous value set using {@link #setBssid(MacAddress)}.</li>
+         *
+         * @param bssid BSSID of the network.
+         * @return Instance of {@link Builder} to enable chaining of the builder method.
+         */
+        public Builder setBssid(@NonNull MacAddress bssid) {
+            checkNotNull(bssid);
+            mBssid = MacAddress.fromBytes(bssid.toByteArray());
+            return this;
+        }
+
+        /**
+         * Specifies whether this represents an Enhanced Open (OWE) network.
+         *
+         * @return Instance of {@link Builder} to enable chaining of the builder method.
+         */
+        public Builder setIsEnhancedOpen() {
+            mIsEnhancedOpen = true;
+            return this;
+        }
+
+        /**
+         * Set the ASCII WPA2 passphrase for this network. Needed for authenticating to
+         * WPA2-PSK networks.
+         *
+         * @param passphrase passphrase of the network.
+         * @return Instance of {@link Builder} to enable chaining of the builder method.
+         * @throws IllegalArgumentException if the passphrase is not ASCII encodable.
+         */
+        public Builder setWpa2Passphrase(@NonNull String passphrase) {
+            checkNotNull(passphrase);
+            final CharsetEncoder asciiEncoder = StandardCharsets.US_ASCII.newEncoder();
+            if (!asciiEncoder.canEncode(passphrase)) {
+                throw new IllegalArgumentException("passphrase not ASCII encodable");
+            }
+            mWpa2PskPassphrase = passphrase;
+            return this;
+        }
+
+        /**
+         * Set the ASCII WPA3 passphrase for this network. Needed for authenticating to WPA3-SAE
+         * networks.
+         *
+         * @param passphrase passphrase of the network.
+         * @return Instance of {@link Builder} to enable chaining of the builder method.
+         * @throws IllegalArgumentException if the passphrase is not ASCII encodable.
+         */
+        public Builder setWpa3Passphrase(@NonNull String passphrase) {
+            checkNotNull(passphrase);
+            final CharsetEncoder asciiEncoder = StandardCharsets.US_ASCII.newEncoder();
+            if (!asciiEncoder.canEncode(passphrase)) {
+                throw new IllegalArgumentException("passphrase not ASCII encodable");
+            }
+            mWpa3SaePassphrase = passphrase;
+            return this;
+        }
+
+        /**
+         * Set the associated enterprise configuration for this network. Needed for authenticating
+         * to WPA2-EAP networks. See {@link WifiEnterpriseConfig} for description.
+         *
+         * @param enterpriseConfig Instance of {@link WifiEnterpriseConfig}.
+         * @return Instance of {@link Builder} to enable chaining of the builder method.
+         */
+        public Builder setWpa2EnterpriseConfig(
+                @NonNull WifiEnterpriseConfig enterpriseConfig) {
+            checkNotNull(enterpriseConfig);
+            mWpa2EnterpriseConfig = new WifiEnterpriseConfig(enterpriseConfig);
+            return this;
+        }
+
+        /**
+         * Set the associated enterprise configuration for this network. Needed for authenticating
+         * to WPA3-SuiteB networks. See {@link WifiEnterpriseConfig} for description.
+         *
+         * @param enterpriseConfig Instance of {@link WifiEnterpriseConfig}.
+         * @return Instance of {@link Builder} to enable chaining of the builder method.
+         */
+        public Builder setWpa3EnterpriseConfig(
+                @NonNull WifiEnterpriseConfig enterpriseConfig) {
+            checkNotNull(enterpriseConfig);
+            mWpa3EnterpriseConfig = new WifiEnterpriseConfig(enterpriseConfig);
+            return this;
+        }
+
+        /**
+         * Specifies whether this represents a hidden network.
+         * <p>
+         * <li>If not set, defaults to false (i.e not a hidden network).</li>
+         *
+         * @return Instance of {@link Builder} to enable chaining of the builder method.
+         */
+        public Builder setIsHiddenSsid() {
+            mIsHiddenSSID = true;
+            return this;
+        }
+
+        /**
+         * Specifies whether the app needs to log in to a captive portal to obtain Internet access.
+         * <p>
+         * This will dictate if the directed broadcast
+         * {@link WifiManager#ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION} will be sent to the
+         * app after successfully connecting to the network.
+         * Use this for captive portal type networks where the app needs to authenticate the user
+         * before the device can access the network.
+         * <p>
+         * <li>If not set, defaults to false (i.e no app interaction required).</li>
+         *
+         * @return Instance of {@link Builder} to enable chaining of the builder method.
+         */
+        public Builder setIsAppInteractionRequired() {
+            mIsAppInteractionRequired = true;
+            return this;
+        }
+
+        /**
+         * Specifies whether the user needs to log in to a captive portal to obtain Internet access.
+         * <p>
+         * <li>If not set, defaults to false (i.e no user interaction required).</li>
+         *
+         * @return Instance of {@link Builder} to enable chaining of the builder method.
+         */
+        public Builder setIsUserInteractionRequired() {
+            mIsUserInteractionRequired = true;
+            return this;
+        }
+
+        /**
+         * Specify the priority of this network among other network suggestions provided by the same
+         * app (priorities have no impact on suggestions by different apps). The lower the number,
+         * the higher the priority (i.e value of 0 = highest priority).
+         * <p>
+         * <li>If not set, defaults to -1 (i.e unassigned priority).</li>
+         *
+         * @param priority Integer number representing the priority among suggestions by the app.
+         * @return Instance of {@link Builder} to enable chaining of the builder method.
+         * @throws IllegalArgumentException if the priority value is negative.
+         */
+        public Builder setPriority(int priority) {
+            if (priority < 0) {
+                throw new IllegalArgumentException("Invalid priority value " + priority);
+            }
+            mPriority = priority;
+            return this;
+        }
+
+        /**
+         * Specifies whether this network is metered.
+         * <p>
+         * <li>If not set, defaults to false (i.e not metered).</li>
+         *
+         * @return Instance of {@link Builder} to enable chaining of the builder method.
+         */
+        public Builder setIsMetered() {
+            mIsMetered = true;
+            return this;
+        }
+
+        /**
+         * Set defaults for the various low level credential type fields in the newly created
+         * WifiConfiguration object.
+         *
+         * See {@link com.android.server.wifi.WifiConfigManager#setDefaultsInWifiConfiguration(
+         * WifiConfiguration)}.
+         *
+         * @param configuration provided WifiConfiguration object.
+         */
+        private static void setDefaultsInWifiConfiguration(
+                @NonNull WifiConfiguration configuration) {
+            configuration.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
+            configuration.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
+            configuration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
+            configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
+            configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
+        }
+
+        private void setSecurityParamsInWifiConfiguration(
+                @NonNull WifiConfiguration configuration) {
+            if (!TextUtils.isEmpty(mWpa2PskPassphrase)) { // WPA-PSK network.
+                configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
+                // WifiConfiguration.preSharedKey needs quotes around ASCII password.
+                configuration.preSharedKey = "\"" + mWpa2PskPassphrase + "\"";
+            } else if (!TextUtils.isEmpty(mWpa3SaePassphrase)) { // WPA3-SAE network.
+                configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.SAE);
+                // PMF mandatory for SAE.
+                configuration.requirePMF = true;
+                // WifiConfiguration.preSharedKey needs quotes around ASCII password.
+                configuration.preSharedKey = "\"" + mWpa3SaePassphrase + "\"";
+            } else if (mWpa2EnterpriseConfig != null) { // WPA-EAP network
+                configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
+                configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X);
+                configuration.enterpriseConfig = mWpa2EnterpriseConfig;
+            } else if (mWpa3EnterpriseConfig != null) { // WPA3-SuiteB network
+                configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.SUITE_B_192);
+                configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.GCMP_256);
+                // TODO (b/113878056): Verify these params once we verify SuiteB configuration.
+                configuration.allowedGroupManagementCiphers.set(
+                        WifiConfiguration.GroupMgmtCipher.BIP_GMAC_256);
+                configuration.allowedSuiteBCiphers.set(
+                        WifiConfiguration.SuiteBCipher.ECDHE_ECDSA);
+                configuration.allowedSuiteBCiphers.set(
+                        WifiConfiguration.SuiteBCipher.ECDHE_RSA);
+                configuration.requirePMF = true;
+                configuration.enterpriseConfig = mWpa3EnterpriseConfig;
+            } else if (mIsEnhancedOpen) { // OWE network
+                configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.OWE);
+                // PMF mandatory.
+                configuration.requirePMF = true;
+            } else { // Open network
+                configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
+            }
+        }
+
+        /**
+         * Helper method to build WifiConfiguration object from the builder.
+         * @return Instance of {@link WifiConfiguration}.
+         */
+        private WifiConfiguration buildWifiConfiguration() {
+            final WifiConfiguration wifiConfiguration = new WifiConfiguration();
+            setDefaultsInWifiConfiguration(wifiConfiguration);
+            // WifiConfiguration.SSID needs quotes around unicode SSID.
+            wifiConfiguration.SSID = "\"" + mSsid + "\"";
+            if (mBssid != null) {
+                wifiConfiguration.BSSID = mBssid.toString();
+            }
+
+            setSecurityParamsInWifiConfiguration(wifiConfiguration);
+
+            wifiConfiguration.hiddenSSID = mIsHiddenSSID;
+            wifiConfiguration.priority = mPriority;
+            wifiConfiguration.meteredOverride =
+                    mIsMetered ? WifiConfiguration.METERED_OVERRIDE_METERED
+                            : WifiConfiguration.METERED_OVERRIDE_NONE;
+            return wifiConfiguration;
+        }
+
+        private void validateSecurityParams() {
+            int numSecurityTypes = 0;
+            numSecurityTypes += mIsEnhancedOpen ? 1 : 0;
+            numSecurityTypes += !TextUtils.isEmpty(mWpa2PskPassphrase) ? 1 : 0;
+            numSecurityTypes += !TextUtils.isEmpty(mWpa3SaePassphrase) ? 1 : 0;
+            numSecurityTypes += mWpa2EnterpriseConfig != null ? 1 : 0;
+            numSecurityTypes += mWpa3EnterpriseConfig != null ? 1 : 0;
+            if (numSecurityTypes > 1) {
+                throw new IllegalStateException("only one of setIsEnhancedOpen, setWpa2Passphrase,"
+                        + "setWpa3Passphrase, setWpa2EnterpriseConfig or setWpa3EnterpriseConfig"
+                        + " can be invoked for network specifier");
+            }
+        }
+
+        /**
+         * Create a network suggestion object use in
+         * {@link WifiManager#addNetworkSuggestions(List)}.
+         *
+         * See {@link WifiNetworkSuggestion}.
+         *<p>
+         * Note: Apps can set a combination of SSID using {@link #setSsid(String)} and BSSID
+         * using {@link #setBssid(MacAddress)} to provide more fine grained network suggestions to
+         * the platform.
+         * </p>
+         *
+         * For example:
+         * To provide credentials for one open, one WPA2 and one WPA3 network with their
+         * corresponding SSID's:
+         * {@code
+         * final WifiNetworkSuggestion suggestion1 =
+         *      new Builder()
+         *      .setSsid("test111111")
+         *      .buildNetworkSuggestion()
+         * final WifiNetworkSuggestion suggestion2 =
+         *      new Builder()
+         *      .setSsid("test222222")
+         *      .setWpa2Passphrase("test123456")
+         *      .buildNetworkSuggestion()
+         * final WifiNetworkSuggestion suggestion3 =
+         *      new Builder()
+         *      .setSsid("test333333")
+         *      .setWpa3Passphrase("test6789")
+         *      .buildNetworkSuggestion()
+         * final List<WifiNetworkSuggestion> suggestionsList =
+         *      new ArrayList<WifiNetworkSuggestion> {{
+         *          add(suggestion1);
+         *          add(suggestion2);
+         *          add(suggestion3);
+         *      }};
+         * final WifiManager wifiManager =
+         *      context.getSystemService(Context.WIFI_SERVICE);
+         * wifiManager.addNetworkSuggestions(suggestionsList);
+         * ...
+         * }
+         *
+         * @return Instance of {@link WifiNetworkSuggestion}.
+         * @throws IllegalStateException on invalid params set.
+         */
+        public WifiNetworkSuggestion build() {
+            if (mSsid == null) {
+                throw new IllegalStateException("setSsid should be invoked for suggestion");
+            }
+            if (TextUtils.isEmpty(mSsid)) {
+                throw new IllegalStateException("invalid ssid for suggestion");
+            }
+            if (mBssid != null
+                    && (mBssid.equals(MacAddress.BROADCAST_ADDRESS)
+                    || mBssid.equals(MacAddress.ALL_ZEROS_ADDRESS))) {
+                throw new IllegalStateException("invalid bssid for suggestion");
+            }
+            validateSecurityParams();
+
+            return new WifiNetworkSuggestion(
+                    buildWifiConfiguration(),
+                    mIsAppInteractionRequired,
+                    mIsUserInteractionRequired,
+                    Process.myUid(),
+                    ActivityThread.currentApplication().getApplicationContext().getOpPackageName());
+        }
+    }
+
     /**
      * Network configuration for the provided network.
      * @hide
@@ -67,6 +493,15 @@
     public final String suggestorPackageName;
 
     /** @hide */
+    public WifiNetworkSuggestion() {
+        this.wifiConfiguration = null;
+        this.isAppInteractionRequired = false;
+        this.isUserInteractionRequired = false;
+        this.suggestorUid = -1;
+        this.suggestorPackageName = null;
+    }
+
+    /** @hide */
     public WifiNetworkSuggestion(@NonNull WifiConfiguration wifiConfiguration,
                                  boolean isAppInteractionRequired,
                                  boolean isUserInteractionRequired,
diff --git a/wifi/java/android/net/wifi/WifiUsabilityStatsEntry.java b/wifi/java/android/net/wifi/WifiUsabilityStatsEntry.java
index c796e29..c43818d 100644
--- a/wifi/java/android/net/wifi/WifiUsabilityStatsEntry.java
+++ b/wifi/java/android/net/wifi/WifiUsabilityStatsEntry.java
@@ -16,10 +16,14 @@
 
 package android.net.wifi;
 
+import android.annotation.IntDef;
 import android.annotation.SystemApi;
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
 /**
  * This class makes a subset of
  * com.android.server.wifi.nano.WifiMetricsProto.WifiUsabilityStatsEntry parcelable.
@@ -28,6 +32,24 @@
  */
 @SystemApi
 public final class WifiUsabilityStatsEntry implements Parcelable {
+    /** {@hide} */
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef(prefix = {"PROBE_STATUS_"}, value = {
+            PROBE_STATUS_UNKNOWN,
+            PROBE_STATUS_NO_PROBE,
+            PROBE_STATUS_SUCCESS,
+            PROBE_STATUS_FAILURE})
+    public @interface ProbeStatus {}
+
+    /** Link probe status is unknown */
+    public static final int PROBE_STATUS_UNKNOWN = 0;
+    /** Link probe is not triggered */
+    public static final int PROBE_STATUS_NO_PROBE = 1;
+    /** Link probe is triggered and the result is success */
+    public static final int PROBE_STATUS_SUCCESS = 2;
+    /** Link probe is triggered and the result is failure */
+    public static final int PROBE_STATUS_FAILURE = 3;
+
     /** Absolute milliseconds from device boot when these stats were sampled */
     public final long timeStampMs;
     /** The RSSI (in dBm) at the sample time */
@@ -68,6 +90,14 @@
     public final long totalRadioOnFreqTimeMs;
     /** The total number of beacons received from the last radio chip reset */
     public final long totalBeaconRx;
+    /** The status of link probe since last stats update */
+    public final int probeStatusSinceLastUpdate;
+    /** The elapsed time of the most recent link probe since last stats update */
+    public final int probeElapsedTimeMsSinceLastUpdate;
+    /** The MCS rate of the most recent link probe since last stats update */
+    public final int probeMcsRateSinceLastUpdate;
+    /** Rx link speed at the sample time in Mbps */
+    public final int rxLinkSpeedMbps;
 
     /** Constructor function {@hide} */
     public WifiUsabilityStatsEntry(long timeStampMs, int rssi,
@@ -76,7 +106,9 @@
             long totalRadioTxTimeMs, long totalRadioRxTimeMs, long totalScanTimeMs,
             long totalNanScanTimeMs, long totalBackgroundScanTimeMs, long totalRoamScanTimeMs,
             long totalPnoScanTimeMs, long totalHotspot2ScanTimeMs, long totalCcaBusyFreqTimeMs,
-            long totalRadioOnFreqTimeMs, long totalBeaconRx) {
+            long totalRadioOnFreqTimeMs, long totalBeaconRx,
+            @ProbeStatus int probeStatusSinceLastUpdate, int probeElapsedTimeMsSinceLastUpdate,
+            int probeMcsRateSinceLastUpdate, int rxLinkSpeedMbps) {
         this.timeStampMs = timeStampMs;
         this.rssi = rssi;
         this.linkSpeedMbps = linkSpeedMbps;
@@ -96,6 +128,10 @@
         this.totalCcaBusyFreqTimeMs = totalCcaBusyFreqTimeMs;
         this.totalRadioOnFreqTimeMs = totalRadioOnFreqTimeMs;
         this.totalBeaconRx = totalBeaconRx;
+        this.probeStatusSinceLastUpdate = probeStatusSinceLastUpdate;
+        this.probeElapsedTimeMsSinceLastUpdate = probeElapsedTimeMsSinceLastUpdate;
+        this.probeMcsRateSinceLastUpdate = probeMcsRateSinceLastUpdate;
+        this.rxLinkSpeedMbps = rxLinkSpeedMbps;
     }
 
     /** Implement the Parcelable interface */
@@ -124,6 +160,10 @@
         dest.writeLong(totalCcaBusyFreqTimeMs);
         dest.writeLong(totalRadioOnFreqTimeMs);
         dest.writeLong(totalBeaconRx);
+        dest.writeInt(probeStatusSinceLastUpdate);
+        dest.writeInt(probeElapsedTimeMsSinceLastUpdate);
+        dest.writeInt(probeMcsRateSinceLastUpdate);
+        dest.writeInt(rxLinkSpeedMbps);
     }
 
     /** Implement the Parcelable interface */
@@ -137,7 +177,8 @@
                     in.readLong(), in.readLong(), in.readLong(),
                     in.readLong(), in.readLong(), in.readLong(),
                     in.readLong(), in.readLong(), in.readLong(),
-                    in.readLong(), in.readLong()
+                    in.readLong(), in.readLong(), in.readInt(),
+                    in.readInt(), in.readInt(), in.readInt()
             );
         }
 
diff --git a/wifi/java/android/net/wifi/hotspot2/pps/Credential.java b/wifi/java/android/net/wifi/hotspot2/pps/Credential.java
index 59a7290..28165e15 100644
--- a/wifi/java/android/net/wifi/hotspot2/pps/Credential.java
+++ b/wifi/java/android/net/wifi/hotspot2/pps/Credential.java
@@ -1216,7 +1216,15 @@
                 Arrays.equals(key1.getEncoded(), key2.getEncoded());
     }
 
-    private static boolean isX509CertificateEquals(X509Certificate cert1, X509Certificate cert2) {
+    /**
+     * Verify two X.509 certificates are identical.
+     *
+     * @param cert1 a certificate to compare
+     * @param cert2 a certificate to compare
+     * @return {@code true} if given certificates are the same each other, {@code false} otherwise.
+     * @hide
+     */
+    public static boolean isX509CertificateEquals(X509Certificate cert1, X509Certificate cert2) {
         if (cert1 == null && cert2 == null) {
             return true;
         }
diff --git a/wifi/java/android/net/wifi/hotspot2/pps/UpdateParameter.java b/wifi/java/android/net/wifi/hotspot2/pps/UpdateParameter.java
index 9eb6314..8d30ff1 100644
--- a/wifi/java/android/net/wifi/hotspot2/pps/UpdateParameter.java
+++ b/wifi/java/android/net/wifi/hotspot2/pps/UpdateParameter.java
@@ -16,6 +16,7 @@
 
 package android.net.wifi.hotspot2.pps;
 
+import android.net.wifi.ParcelUtil;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.text.TextUtils;
@@ -23,6 +24,7 @@
 import android.util.Log;
 
 import java.nio.charset.StandardCharsets;
+import java.security.cert.X509Certificate;
 import java.util.Arrays;
 import java.util.Objects;
 
@@ -167,7 +169,7 @@
     }
 
     /**
-     * SHA-256 fingerprint of the certificate located at {@link #trustRootCertUrl}
+     * SHA-256 fingerprint of the certificate located at {@code mTrustRootCertUrl}
      */
     private byte[] mTrustRootCertSha256Fingerprint = null;
     public void setTrustRootCertSha256Fingerprint(byte[] fingerprint) {
@@ -178,6 +180,31 @@
     }
 
     /**
+     * CA (Certificate Authority) X509 certificates.
+     */
+    private X509Certificate mCaCertificate;
+
+    /**
+     * Set the CA (Certification Authority) certificate associated with Policy/Subscription update.
+     *
+     * @param caCertificate The CA certificate to set
+     * @hide
+     */
+    public void setCaCertificate(X509Certificate caCertificate) {
+        mCaCertificate = caCertificate;
+    }
+
+    /**
+     * Get the CA (Certification Authority) certificate associated with Policy/Subscription update.
+     *
+     * @return CA certificate associated and {@code null} if certificate is not set.
+     * @hide
+     */
+    public X509Certificate getCaCertificate() {
+        return mCaCertificate;
+    }
+
+    /**
      * Constructor for creating Policy with default values.
      */
     public UpdateParameter() {}
@@ -202,6 +229,7 @@
             mTrustRootCertSha256Fingerprint = Arrays.copyOf(source.mTrustRootCertSha256Fingerprint,
                     source.mTrustRootCertSha256Fingerprint.length);
         }
+        mCaCertificate = source.mCaCertificate;
     }
 
     @Override
@@ -219,6 +247,7 @@
         dest.writeString(mBase64EncodedPassword);
         dest.writeString(mTrustRootCertUrl);
         dest.writeByteArray(mTrustRootCertSha256Fingerprint);
+        ParcelUtil.writeCertificate(dest, mCaCertificate);
     }
 
     @Override
@@ -239,14 +268,15 @@
                 && TextUtils.equals(mBase64EncodedPassword, that.mBase64EncodedPassword)
                 && TextUtils.equals(mTrustRootCertUrl, that.mTrustRootCertUrl)
                 && Arrays.equals(mTrustRootCertSha256Fingerprint,
-                        that.mTrustRootCertSha256Fingerprint);
+                that.mTrustRootCertSha256Fingerprint)
+                && Credential.isX509CertificateEquals(mCaCertificate, that.mCaCertificate);
     }
 
     @Override
     public int hashCode() {
         return Objects.hash(mUpdateIntervalInMinutes, mUpdateMethod, mRestriction, mServerUri,
                 mUsername, mBase64EncodedPassword, mTrustRootCertUrl,
-                mTrustRootCertSha256Fingerprint);
+                Arrays.hashCode(mTrustRootCertSha256Fingerprint), mCaCertificate);
     }
 
     @Override
@@ -361,6 +391,7 @@
                 updateParam.setBase64EncodedPassword(in.readString());
                 updateParam.setTrustRootCertUrl(in.readString());
                 updateParam.setTrustRootCertSha256Fingerprint(in.createByteArray());
+                updateParam.setCaCertificate(ParcelUtil.readCertificate(in));
                 return updateParam;
             }
 
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pManager.java b/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
index 052ab99..63f47e7 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
@@ -190,6 +190,10 @@
      * the network info in the form of a {@link android.net.NetworkInfo}. A third extra provides
      * the details of the group.
      *
+     * All of these permissions are required to receive this broadcast:
+     * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} and
+     * {@link android.Manifest.permission#ACCESS_WIFI_STATE}
+     *
      * @see #EXTRA_WIFI_P2P_INFO
      * @see #EXTRA_NETWORK_INFO
      * @see #EXTRA_WIFI_P2P_GROUP
@@ -222,6 +226,10 @@
      * Broadcast intent action indicating that the available peer list has changed. This
      * can be sent as a result of peers being found, lost or updated.
      *
+     * All of these permissions are required to receive this broadcast:
+     * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} and
+     * {@link android.Manifest.permission#ACCESS_WIFI_STATE}
+     *
      * <p> An extra {@link #EXTRA_P2P_DEVICE_LIST} provides the full list of
      * current peers. The full list of peers can also be obtained any time with
      * {@link #requestPeers}.
@@ -238,7 +246,7 @@
       *
       * <p>Retrieve with {@link android.content.Intent#getParcelableExtra(String)}.
       */
-     public static final String EXTRA_P2P_DEVICE_LIST = "wifiP2pDeviceList";
+    public static final String EXTRA_P2P_DEVICE_LIST = "wifiP2pDeviceList";
 
     /**
      * Broadcast intent action indicating that peer discovery has either started or stopped.
@@ -285,6 +293,18 @@
 
     /**
      * Broadcast intent action indicating that this device details have changed.
+     *
+     * <p> An extra {@link #EXTRA_WIFI_P2P_DEVICE} provides this device details.
+     * The valid device details can also be obtained with
+     * {@link #requestDeviceInfo(Channel, DeviceInfoListener)} when p2p is enabled.
+     * To get information notifications on P2P getting enabled refers
+     * {@link #WIFI_P2P_STATE_ENABLED}.
+     *
+     * All of these permissions are required to receive this broadcast:
+     * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} and
+     * {@link android.Manifest.permission#ACCESS_WIFI_STATE}
+     *
+     * @see #EXTRA_WIFI_P2P_DEVICE
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String WIFI_P2P_THIS_DEVICE_CHANGED_ACTION =
@@ -546,6 +566,11 @@
     /** @hide */
     public static final int UPDATE_CHANNEL_INFO                     = BASE + 96;
 
+    /** @hide */
+    public static final int REQUEST_DEVICE_INFO                     = BASE + 97;
+    /** @hide */
+    public static final int RESPONSE_DEVICE_INFO                    = BASE + 98;
+
     /**
      * Create a new WifiP2pManager instance. Applications use
      * {@link android.content.Context#getSystemService Context.getSystemService()} to retrieve
@@ -783,6 +808,17 @@
         void onOngoingPeerAvailable(WifiP2pConfig peerConfig);
     }
 
+    /** Interface for callback invocation when {@link android.net.wifi.p2p.WifiP2pDevice}
+     *  is available in response to {@link #requestDeviceInfo(Channel, DeviceInfoListener)}.
+     */
+    public interface DeviceInfoListener {
+        /**
+         * The requested {@link android.net.wifi.p2p.WifiP2pDevice} is available.
+         * @param wifiP2pDevice Wi-Fi p2p {@link android.net.wifi.p2p.WifiP2pDevice}
+         */
+        void onDeviceInfoAvailable(WifiP2pDevice wifiP2pDevice);
+    }
+
     /**
      * A channel that connects the application to the Wifi p2p framework.
      * Most p2p operations require a Channel as an argument. An instance of Channel is obtained
@@ -988,6 +1024,12 @@
                                     .onNetworkInfoAvailable((NetworkInfo) message.obj);
                         }
                         break;
+                    case RESPONSE_DEVICE_INFO:
+                        if (listener != null) {
+                            ((DeviceInfoListener) listener)
+                                    .onDeviceInfoAvailable((WifiP2pDevice) message.obj);
+                        }
+                        break;
                     default:
                         Log.d(TAG, "Ignored " + message);
                         break;
@@ -1826,4 +1868,29 @@
         if (listener == null) throw new IllegalArgumentException("This listener cannot be null.");
         c.mAsyncChannel.sendMessage(REQUEST_NETWORK_INFO, 0, c.putListener(listener));
     }
+
+     /**
+     * Request Device Info
+     *
+     * <p> This method provides the device info
+     * in the form of a {@link android.net.wifi.p2p.WifiP2pDevice}.
+     * Valid {@link android.net.wifi.p2p.WifiP2pDevice} is returned when p2p is enabled.
+     * To get information notifications on P2P getting enabled refers
+     * {@link #WIFI_P2P_STATE_ENABLED}.
+     *
+     * <p> This {@link android.net.wifi.p2p.WifiP2pDevice} is returned using the
+     * {@link DeviceInfoListener} listener.
+     *
+     * <p> This information is also included in the {@link #WIFI_P2P_THIS_DEVICE_CHANGED_ACTION}
+     * broadcast event with extra {@link #EXTRA_WIFI_P2P_DEVICE}.
+     *
+     * @param c is the channel created at {@link #initialize(Context, Looper, ChannelListener)}.
+     * @param listener for callback when network info is available.
+     */
+    @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION)
+    public void requestDeviceInfo(@NonNull Channel c, @NonNull DeviceInfoListener listener) {
+        checkChannel(c);
+        if (listener == null) throw new IllegalArgumentException("This listener cannot be null.");
+        c.mAsyncChannel.sendMessage(REQUEST_DEVICE_INFO, 0, c.putListener(listener));
+    }
 }
diff --git a/wifi/tests/src/android/net/wifi/WifiNetworkConfigBuilderTest.java b/wifi/tests/src/android/net/wifi/WifiNetworkConfigBuilderTest.java
deleted file mode 100644
index dd6e2c9..0000000
--- a/wifi/tests/src/android/net/wifi/WifiNetworkConfigBuilderTest.java
+++ /dev/null
@@ -1,653 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import static android.os.PatternMatcher.PATTERN_LITERAL;
-import static android.os.PatternMatcher.PATTERN_PREFIX;
-import static android.os.PatternMatcher.PATTERN_SIMPLE_GLOB;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import android.net.MacAddress;
-import android.net.NetworkSpecifier;
-import android.os.PatternMatcher;
-import android.os.Process;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-
-/**
- * Unit tests for {@link android.net.wifi.WifiNetworkConfigBuilder}.
- */
-@SmallTest
-public class WifiNetworkConfigBuilderTest {
-    private static final String TEST_SSID = "Test123";
-    private static final String TEST_BSSID_OUI_BASE_ADDRESS = "12:12:12:00:00:00";
-    private static final String TEST_BSSID_OUI_MASK = "ff:ff:ff:00:00:00";
-    private static final String TEST_BSSID = "12:12:12:12:12:12";
-    private static final String TEST_PRESHARED_KEY = "Test123";
-
-    /**
-     * Validate correctness of WifiNetworkSpecifier object created by
-     * {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} for open network with SSID pattern.
-     */
-    @Test
-    public void testWifiNetworkSpecifierBuilderForOpenNetworkWithSsidPattern() {
-        NetworkSpecifier specifier = new WifiNetworkConfigBuilder()
-                .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_PREFIX))
-                .buildNetworkSpecifier();
-
-        assertTrue(specifier instanceof WifiNetworkSpecifier);
-        WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier;
-
-        assertEquals(Process.myUid(), wifiNetworkSpecifier.requestorUid);
-        assertEquals(TEST_SSID, wifiNetworkSpecifier.ssidPatternMatcher.getPath());
-        assertEquals(PATTERN_PREFIX, wifiNetworkSpecifier.ssidPatternMatcher.getType());
-        assertEquals(MacAddress.ALL_ZEROS_ADDRESS, wifiNetworkSpecifier.bssidPatternMatcher.first);
-        assertEquals(MacAddress.ALL_ZEROS_ADDRESS, wifiNetworkSpecifier.bssidPatternMatcher.second);
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.NONE));
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedProtocols
-                .get(WifiConfiguration.Protocol.RSN));
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedAuthAlgorithms
-                .get(WifiConfiguration.AuthAlgorithm.OPEN));
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedPairwiseCiphers
-                .get(WifiConfiguration.PairwiseCipher.CCMP));
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers
-                .get(WifiConfiguration.GroupCipher.CCMP));
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers
-                .get(WifiConfiguration.GroupCipher.TKIP));
-    }
-
-    /**
-     * Validate correctness of WifiNetworkSpecifier object created by
-     * {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} for WPA_PSK network with BSSID
-     * pattern.
-     */
-    @Test
-    public void testWifiNetworkSpecifierBuilderForWpa2PskNetworkWithBssidPattern() {
-        NetworkSpecifier specifier = new WifiNetworkConfigBuilder()
-                .setBssidPattern(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
-                        MacAddress.fromString(TEST_BSSID_OUI_MASK))
-                .setWpa2Passphrase(TEST_PRESHARED_KEY)
-                .buildNetworkSpecifier();
-
-        assertTrue(specifier instanceof WifiNetworkSpecifier);
-        WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier;
-
-        assertEquals(".*", wifiNetworkSpecifier.ssidPatternMatcher.getPath());
-        assertEquals(PATTERN_SIMPLE_GLOB, wifiNetworkSpecifier.ssidPatternMatcher.getType());
-        assertEquals(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
-                wifiNetworkSpecifier.bssidPatternMatcher.first);
-        assertEquals(MacAddress.fromString(TEST_BSSID_OUI_MASK),
-                wifiNetworkSpecifier.bssidPatternMatcher.second);
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.WPA_PSK));
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedProtocols
-                .get(WifiConfiguration.Protocol.RSN));
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedAuthAlgorithms
-                .get(WifiConfiguration.AuthAlgorithm.OPEN));
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedPairwiseCiphers
-                .get(WifiConfiguration.PairwiseCipher.CCMP));
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers
-                .get(WifiConfiguration.GroupCipher.CCMP));
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers
-                .get(WifiConfiguration.GroupCipher.TKIP));
-        assertEquals("\"" + TEST_PRESHARED_KEY + "\"",
-                wifiNetworkSpecifier.wifiConfiguration.preSharedKey);
-    }
-
-    /**
-     * Validate correctness of WifiNetworkSpecifier object created by
-     * {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} for WPA_EAP network with
-     * SSID and BSSID pattern.
-     */
-    @Test
-    public void testWifiNetworkSpecifierBuilderForWpa2EapHiddenNetworkWithSsidAndBssid() {
-        WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
-        enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
-        enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.GTC);
-
-        NetworkSpecifier specifier = new WifiNetworkConfigBuilder()
-                .setSsid(TEST_SSID)
-                .setBssid(MacAddress.fromString(TEST_BSSID))
-                .setWpa2EnterpriseConfig(enterpriseConfig)
-                .setIsHiddenSsid()
-                .buildNetworkSpecifier();
-
-        assertTrue(specifier instanceof WifiNetworkSpecifier);
-        WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier;
-
-        assertEquals(TEST_SSID, wifiNetworkSpecifier.ssidPatternMatcher.getPath());
-        assertEquals(PATTERN_LITERAL, wifiNetworkSpecifier.ssidPatternMatcher.getType());
-        assertEquals(MacAddress.fromString(TEST_BSSID),
-                wifiNetworkSpecifier.bssidPatternMatcher.first);
-        assertEquals(MacAddress.BROADCAST_ADDRESS,
-                wifiNetworkSpecifier.bssidPatternMatcher.second);
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.WPA_EAP));
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.IEEE8021X));
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedProtocols
-                .get(WifiConfiguration.Protocol.RSN));
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedAuthAlgorithms
-                .get(WifiConfiguration.AuthAlgorithm.OPEN));
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedPairwiseCiphers
-                .get(WifiConfiguration.PairwiseCipher.CCMP));
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers
-                .get(WifiConfiguration.GroupCipher.CCMP));
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers
-                .get(WifiConfiguration.GroupCipher.TKIP));
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.hiddenSSID);
-        assertEquals(enterpriseConfig.getEapMethod(),
-                wifiNetworkSpecifier.wifiConfiguration.enterpriseConfig.getEapMethod());
-        assertEquals(enterpriseConfig.getPhase2Method(),
-                wifiNetworkSpecifier.wifiConfiguration.enterpriseConfig.getPhase2Method());
-    }
-
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#setSsid(String)} throws an exception
-     * when the string is not Unicode.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testSetSsidWithNonUnicodeString() {
-        new WifiNetworkConfigBuilder()
-                .setSsid("\ud800")
-                .buildNetworkSpecifier();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#setWpa2Passphrase(String)} throws an exception
-     * when the string is not ASCII encodable.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testSetWpa2PasphraseWithNonAsciiString() {
-        new WifiNetworkConfigBuilder()
-                .setSsid(TEST_SSID)
-                .setWpa2Passphrase("salvē")
-                .buildNetworkSpecifier();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} throws an exception
-     * when neither SSID nor BSSID patterns were set.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithNoSsidAndBssidPattern() {
-        new WifiNetworkConfigBuilder().buildNetworkSpecifier();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} throws an exception
-     * when match-all SSID pattern is set.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithMatchAllSsidPattern1() {
-        new WifiNetworkConfigBuilder()
-                .setSsidPattern(new PatternMatcher(".*", PatternMatcher.PATTERN_SIMPLE_GLOB))
-                .buildNetworkSpecifier();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} throws an exception
-     * when match-all SSID pattern is set.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithMatchAllSsidPattern2() {
-        new WifiNetworkConfigBuilder()
-                .setSsidPattern(new PatternMatcher(".*", PatternMatcher.PATTERN_ADVANCED_GLOB))
-                .buildNetworkSpecifier();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} throws an exception
-     * when match-all SSID pattern is set.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithMatchAllSsidPattern3() {
-        new WifiNetworkConfigBuilder()
-                .setSsidPattern(new PatternMatcher("", PatternMatcher.PATTERN_PREFIX))
-                .buildNetworkSpecifier();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} throws an exception
-     * when match-all BSSID pattern is set.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithMatchAllBssidPattern() {
-        new WifiNetworkConfigBuilder()
-                .setBssidPattern(MacAddress.ALL_ZEROS_ADDRESS, MacAddress.ALL_ZEROS_ADDRESS)
-                .buildNetworkSpecifier();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} throws an exception
-     * when match-none SSID pattern is set.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithMatchNoneSsidPattern1() {
-        new WifiNetworkConfigBuilder()
-                .setSsidPattern(new PatternMatcher("", PatternMatcher.PATTERN_LITERAL))
-                .buildNetworkSpecifier();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} throws an exception
-     * when match-none SSID pattern is set.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithMatchNoneSsidPattern2() {
-        new WifiNetworkConfigBuilder()
-                .setSsid("")
-                .buildNetworkSpecifier();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} throws an exception
-     * when match-none BSSID pattern is set.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithMatchNoneBssidPattern1() {
-        new WifiNetworkConfigBuilder()
-                .setBssidPattern(MacAddress.BROADCAST_ADDRESS, MacAddress.BROADCAST_ADDRESS)
-                .buildNetworkSpecifier();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} throws an exception
-     * when match-none BSSID pattern is set.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithMatchNoneBssidPattern2() {
-        new WifiNetworkConfigBuilder()
-                .setBssid(MacAddress.BROADCAST_ADDRESS)
-                .buildNetworkSpecifier();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} throws an exception
-     * when match-none BSSID pattern is set.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithMatchNoneBssidPattern3() {
-        new WifiNetworkConfigBuilder()
-                .setBssid(MacAddress.ALL_ZEROS_ADDRESS)
-                .buildNetworkSpecifier();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} throws an exception
-     * when SSID pattern is set for hidden network.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithBssidMatchPatternForHiddenNetwork() {
-        new WifiNetworkConfigBuilder()
-                .setBssidPattern(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
-                        MacAddress.fromString(TEST_BSSID_OUI_MASK))
-                .setIsHiddenSsid()
-                .buildNetworkSpecifier();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} throws an exception
-     * when both {@link WifiNetworkConfigBuilder#setWpa2Passphrase(String)} and
-     * {@link WifiNetworkConfigBuilder#setWpa2EnterpriseConfig(WifiEnterpriseConfig)} are invoked.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithBothWpa2PasphraseAndEnterpriseConfig() {
-        new WifiNetworkConfigBuilder()
-                .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_LITERAL))
-                .setWpa2Passphrase(TEST_PRESHARED_KEY)
-                .setWpa2EnterpriseConfig(new WifiEnterpriseConfig())
-                .buildNetworkSpecifier();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} throws an exception
-     * when SSID pattern is set for hidden network.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithSsidMatchPatternForHiddenNetwork() {
-        new WifiNetworkConfigBuilder()
-                .setSsidPattern(new PatternMatcher(TEST_SSID, PatternMatcher.PATTERN_PREFIX))
-                .setIsHiddenSsid()
-                .buildNetworkSpecifier();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} throws an exception
-     * when {@link WifiNetworkConfigBuilder#setIsAppInteractionRequired()} is set.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithRequiredAppInteraction() {
-        new WifiNetworkConfigBuilder()
-                .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_LITERAL))
-                .setIsAppInteractionRequired()
-                .buildNetworkSpecifier();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} throws an exception
-     * when {@link WifiNetworkConfigBuilder#setIsUserInteractionRequired()} is set.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithRequiredUserInteraction() {
-        new WifiNetworkConfigBuilder()
-                .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_LITERAL))
-                .setIsUserInteractionRequired()
-                .buildNetworkSpecifier();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} throws an exception
-     * when {@link WifiNetworkConfigBuilder#setPriority(int)} is set.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithSetPriority() {
-        new WifiNetworkConfigBuilder()
-                .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_LITERAL))
-                .setPriority(4)
-                .buildNetworkSpecifier();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} throws an exception
-     * when {@link WifiNetworkConfigBuilder#setIsMetered()} is set.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithMetered() {
-        new WifiNetworkConfigBuilder()
-                .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_LITERAL))
-                .setIsMetered()
-                .buildNetworkSpecifier();
-    }
-
-    /**
-     * Validate correctness of WifiNetworkSuggestion object created by
-     * {@link WifiNetworkConfigBuilder#buildNetworkSuggestion()} for Open network which requires
-     * app interaction.
-     */
-    @Test
-    public void testWifiNetworkSuggestionBuilderForOpenNetworkWithReqAppInteraction() {
-        WifiNetworkSuggestion suggestion = new WifiNetworkConfigBuilder()
-                .setSsid(TEST_SSID)
-                .setIsAppInteractionRequired()
-                .buildNetworkSuggestion();
-
-        assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
-        assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.NONE));
-        assertTrue(suggestion.isAppInteractionRequired);
-        assertFalse(suggestion.isUserInteractionRequired);
-        assertEquals(WifiConfiguration.METERED_OVERRIDE_NONE,
-                suggestion.wifiConfiguration.meteredOverride);
-        assertEquals(-1, suggestion.wifiConfiguration.priority);
-    }
-
-    /**
-     * Validate correctness of WifiNetworkSuggestion object created by
-     * {@link WifiNetworkConfigBuilder#buildNetworkSuggestion()} for WPA_EAP network which requires
-     * app interaction and has a priority of zero set.
-     */
-    @Test
-    public void
-            testWifiNetworkSuggestionBuilderForWpa2EapNetworkWithPriorityAndReqAppInteraction() {
-        WifiNetworkSuggestion suggestion = new WifiNetworkConfigBuilder()
-                .setSsid(TEST_SSID)
-                .setWpa2Passphrase(TEST_PRESHARED_KEY)
-                .setIsAppInteractionRequired()
-                .setPriority(0)
-                .buildNetworkSuggestion();
-
-        assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
-        assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.WPA_PSK));
-        assertEquals("\"" + TEST_PRESHARED_KEY + "\"",
-                suggestion.wifiConfiguration.preSharedKey);
-        assertTrue(suggestion.isAppInteractionRequired);
-        assertFalse(suggestion.isUserInteractionRequired);
-        assertEquals(WifiConfiguration.METERED_OVERRIDE_NONE,
-                suggestion.wifiConfiguration.meteredOverride);
-        assertEquals(0, suggestion.wifiConfiguration.priority);
-    }
-
-    /**
-     * Validate correctness of WifiNetworkSuggestion object created by
-     * {@link WifiNetworkConfigBuilder#buildNetworkSuggestion()} for WPA_PSK network which requires
-     * user interaction and is metered.
-     */
-    @Test
-    public void
-            testWifiNetworkSuggestionBuilderForWpa2PskNetworkWithMeteredAndReqUserInteraction() {
-        WifiNetworkSuggestion suggestion = new WifiNetworkConfigBuilder()
-                .setSsid(TEST_SSID)
-                .setWpa2Passphrase(TEST_PRESHARED_KEY)
-                .setIsUserInteractionRequired()
-                .setIsMetered()
-                .buildNetworkSuggestion();
-
-        assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
-        assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.WPA_PSK));
-        assertEquals("\"" + TEST_PRESHARED_KEY + "\"",
-                suggestion.wifiConfiguration.preSharedKey);
-        assertFalse(suggestion.isAppInteractionRequired);
-        assertTrue(suggestion.isUserInteractionRequired);
-        assertEquals(WifiConfiguration.METERED_OVERRIDE_METERED,
-                suggestion.wifiConfiguration.meteredOverride);
-        assertEquals(-1, suggestion.wifiConfiguration.priority);
-    }
-
-    /**
-     * Validate correctness of WifiNetworkSuggestion object created by
-     * {@link WifiNetworkConfigBuilder#buildNetworkSuggestion()} for OWE network.
-     */
-    @Test
-    public void testWifiNetworkSuggestionBuilderForEnhancedOpenNetworkWithBssid() {
-        WifiNetworkSuggestion suggestion = new WifiNetworkConfigBuilder()
-                .setSsid(TEST_SSID)
-                .setBssid(MacAddress.fromString(TEST_BSSID))
-                .setIsEnhancedOpen()
-                .buildNetworkSuggestion();
-
-        assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
-        assertEquals(TEST_BSSID, suggestion.wifiConfiguration.BSSID);
-        assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.OWE));
-        assertNull(suggestion.wifiConfiguration.preSharedKey);
-        assertTrue(suggestion.wifiConfiguration.requirePMF);
-    }
-
-    /**
-     * Validate correctness of WifiNetworkSuggestion object created by
-     * {@link WifiNetworkConfigBuilder#buildNetworkSuggestion()} for SAE network.
-     */
-    @Test
-    public void testWifiNetworkSuggestionBuilderForWpa3PskNetwork() {
-        WifiNetworkSuggestion suggestion = new WifiNetworkConfigBuilder()
-                .setSsid(TEST_SSID)
-                .setWpa3Passphrase(TEST_PRESHARED_KEY)
-                .buildNetworkSuggestion();
-
-        assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
-        assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.SAE));
-        assertEquals("\"" + TEST_PRESHARED_KEY + "\"",
-                suggestion.wifiConfiguration.preSharedKey);
-        assertTrue(suggestion.wifiConfiguration.requirePMF);
-    }
-
-
-    /**
-     * Validate correctness of WifiNetworkSuggestion object created by
-     * {@link WifiNetworkConfigBuilder#buildNetworkSuggestion()} for SuiteB network.
-     */
-    @Test
-    public void testWifiNetworkSuggestionBuilderForWpa3EapNetwork() {
-        WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
-        enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
-        enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.GTC);
-
-        WifiNetworkSuggestion suggestion = new WifiNetworkConfigBuilder()
-                .setSsid(TEST_SSID)
-                .setWpa3EnterpriseConfig(enterpriseConfig)
-                .buildNetworkSuggestion();
-
-        assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
-        assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.SUITE_B_192));
-        assertTrue(suggestion.wifiConfiguration.allowedGroupCiphers
-                .get(WifiConfiguration.GroupCipher.GCMP_256));
-        assertTrue(suggestion.wifiConfiguration.allowedGroupManagementCiphers
-                .get(WifiConfiguration.GroupMgmtCipher.BIP_GMAC_256));
-        assertTrue(suggestion.wifiConfiguration.allowedSuiteBCiphers
-                .get(WifiConfiguration.SuiteBCipher.ECDHE_ECDSA));
-        assertTrue(suggestion.wifiConfiguration.allowedSuiteBCiphers
-                .get(WifiConfiguration.SuiteBCipher.ECDHE_RSA));
-        assertTrue(suggestion.wifiConfiguration.requirePMF);
-        assertNull(suggestion.wifiConfiguration.preSharedKey);
-    }
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#buildNetworkSuggestion()} throws an exception
-     * when {@link WifiNetworkConfigBuilder#setSsidPattern(PatternMatcher)} is set.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSuggestionBuilderWithSsidPattern() {
-        new WifiNetworkConfigBuilder()
-                .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_PREFIX))
-                .buildNetworkSuggestion();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#buildNetworkSuggestion()} throws an exception
-     * when {@link WifiNetworkConfigBuilder#setBssidPattern(MacAddress, MacAddress)} is set.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSuggestionBuilderWithBssidPattern() {
-        new WifiNetworkConfigBuilder()
-                .setSsid(TEST_SSID)
-                .setBssidPattern(MacAddress.fromString(TEST_BSSID),
-                        MacAddress.fromString(TEST_BSSID))
-                .buildNetworkSuggestion();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#buildNetworkSuggestion()} throws an exception
-     * when {@link WifiNetworkConfigBuilder#setSsid(String)} is not set.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSuggestionBuilderWithNoSsid() {
-        new WifiNetworkConfigBuilder()
-                .buildNetworkSuggestion();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#buildNetworkSuggestion()} throws an exception
-     * when {@link WifiNetworkConfigBuilder#setSsid(String)} is invoked with an invalid value.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSuggestionBuilderWithInvalidSsid() {
-        new WifiNetworkConfigBuilder()
-                .setSsid("")
-                .buildNetworkSuggestion();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#buildNetworkSuggestion()} throws an exception
-     * when {@link WifiNetworkConfigBuilder#setBssid(MacAddress)} is invoked with an invalid value.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSuggestionBuilderWithInvalidBroadcastBssid() {
-        new WifiNetworkConfigBuilder()
-                .setSsid(TEST_SSID)
-                .setBssid(MacAddress.BROADCAST_ADDRESS)
-                .buildNetworkSuggestion();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#buildNetworkSuggestion()} throws an exception
-     * when {@link WifiNetworkConfigBuilder#setBssid(MacAddress)} is invoked with an invalid value.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSuggestionBuilderWithInvalidAllZeroBssid() {
-        new WifiNetworkConfigBuilder()
-                .setSsid(TEST_SSID)
-                .setBssid(MacAddress.ALL_ZEROS_ADDRESS)
-                .buildNetworkSuggestion();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#setPriority(int)} throws an exception
-     * when the value is negative.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testWifiNetworkSuggestionBuilderWithInvalidPriority() {
-        new WifiNetworkConfigBuilder()
-                .setSsid(TEST_SSID)
-                .setPriority(-1)
-                .buildNetworkSuggestion();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} throws an exception
-     * when both {@link WifiNetworkConfigBuilder#setWpa2Passphrase(String)} and
-     * {@link WifiNetworkConfigBuilder#setWpa3Passphrase(String)} are invoked.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithBothWpa2PasphraseAndWpa3Passphrase() {
-        new WifiNetworkConfigBuilder()
-                .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_LITERAL))
-                .setWpa2Passphrase(TEST_PRESHARED_KEY)
-                .setWpa3Passphrase(TEST_PRESHARED_KEY)
-                .buildNetworkSpecifier();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} throws an exception
-     * when both {@link WifiNetworkConfigBuilder#setWpa3Passphrase(String)} and
-     * {@link WifiNetworkConfigBuilder#setWpa3EnterpriseConfig(WifiEnterpriseConfig)} are invoked.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithBothWpa3PasphraseAndEnterprise() {
-        new WifiNetworkConfigBuilder()
-                .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_LITERAL))
-                .setWpa3Passphrase(TEST_PRESHARED_KEY)
-                .setWpa3EnterpriseConfig(new WifiEnterpriseConfig())
-                .buildNetworkSpecifier();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkConfigBuilder#buildNetworkSpecifier()} throws an exception
-     * when both {@link WifiNetworkConfigBuilder#setWpa3Passphrase(String)} and
-     * {@link WifiNetworkConfigBuilder#setIsEnhancedOpen(} are invoked.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithBothWpa3PasphraseAndEnhancedOpen() {
-        new WifiNetworkConfigBuilder()
-                .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_LITERAL))
-                .setWpa3Passphrase(TEST_PRESHARED_KEY)
-                .setIsEnhancedOpen()
-                .buildNetworkSpecifier();
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/WifiNetworkSpecifierTest.java b/wifi/tests/src/android/net/wifi/WifiNetworkSpecifierTest.java
index fce247f..bef33b7 100644
--- a/wifi/tests/src/android/net/wifi/WifiNetworkSpecifierTest.java
+++ b/wifi/tests/src/android/net/wifi/WifiNetworkSpecifierTest.java
@@ -17,6 +17,8 @@
 package android.net.wifi;
 
 import static android.os.PatternMatcher.PATTERN_LITERAL;
+import static android.os.PatternMatcher.PATTERN_PREFIX;
+import static android.os.PatternMatcher.PATTERN_SIMPLE_GLOB;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -24,8 +26,10 @@
 
 import android.net.MacAddress;
 import android.net.MatchAllNetworkSpecifier;
+import android.net.NetworkSpecifier;
 import android.os.Parcel;
 import android.os.PatternMatcher;
+import android.os.Process;
 import android.util.Pair;
 
 import androidx.test.filters.SmallTest;
@@ -42,9 +46,343 @@
     private static final String TEST_SSID = "Test123";
     private static final String TEST_BSSID_OUI_BASE_ADDRESS = "12:12:12:00:00:00";
     private static final String TEST_BSSID_OUI_MASK = "ff:ff:ff:00:00:00";
+    private static final String TEST_BSSID = "12:12:12:12:12:12";
     private static final String TEST_PRESHARED_KEY = "\"Test123\"";
 
     /**
+     * Validate correctness of WifiNetworkSpecifier object created by
+     * {@link WifiNetworkSpecifier.Builder#build()} for open network with SSID pattern.
+     */
+    @Test
+    public void testWifiNetworkSpecifierBuilderForOpenNetworkWithSsidPattern() {
+        NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
+                .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_PREFIX))
+                .build();
+
+        assertTrue(specifier instanceof WifiNetworkSpecifier);
+        WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier;
+
+        assertEquals(Process.myUid(), wifiNetworkSpecifier.requestorUid);
+        assertEquals(TEST_SSID, wifiNetworkSpecifier.ssidPatternMatcher.getPath());
+        assertEquals(PATTERN_PREFIX, wifiNetworkSpecifier.ssidPatternMatcher.getType());
+        assertEquals(MacAddress.ALL_ZEROS_ADDRESS, wifiNetworkSpecifier.bssidPatternMatcher.first);
+        assertEquals(MacAddress.ALL_ZEROS_ADDRESS, wifiNetworkSpecifier.bssidPatternMatcher.second);
+        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
+                .get(WifiConfiguration.KeyMgmt.NONE));
+        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedProtocols
+                .get(WifiConfiguration.Protocol.RSN));
+        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedAuthAlgorithms
+                .get(WifiConfiguration.AuthAlgorithm.OPEN));
+        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedPairwiseCiphers
+                .get(WifiConfiguration.PairwiseCipher.CCMP));
+        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers
+                .get(WifiConfiguration.GroupCipher.CCMP));
+        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers
+                .get(WifiConfiguration.GroupCipher.TKIP));
+    }
+
+    /**
+     * Validate correctness of WifiNetworkSpecifier object created by
+     * {@link WifiNetworkSpecifier.Builder#build()} for WPA_PSK network with BSSID
+     * pattern.
+     */
+    @Test
+    public void testWifiNetworkSpecifierBuilderForWpa2PskNetworkWithBssidPattern() {
+        NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
+                .setBssidPattern(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
+                        MacAddress.fromString(TEST_BSSID_OUI_MASK))
+                .setWpa2Passphrase(TEST_PRESHARED_KEY)
+                .build();
+
+        assertTrue(specifier instanceof WifiNetworkSpecifier);
+        WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier;
+
+        assertEquals(".*", wifiNetworkSpecifier.ssidPatternMatcher.getPath());
+        assertEquals(PATTERN_SIMPLE_GLOB, wifiNetworkSpecifier.ssidPatternMatcher.getType());
+        assertEquals(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
+                wifiNetworkSpecifier.bssidPatternMatcher.first);
+        assertEquals(MacAddress.fromString(TEST_BSSID_OUI_MASK),
+                wifiNetworkSpecifier.bssidPatternMatcher.second);
+        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
+                .get(WifiConfiguration.KeyMgmt.WPA_PSK));
+        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedProtocols
+                .get(WifiConfiguration.Protocol.RSN));
+        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedAuthAlgorithms
+                .get(WifiConfiguration.AuthAlgorithm.OPEN));
+        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedPairwiseCiphers
+                .get(WifiConfiguration.PairwiseCipher.CCMP));
+        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers
+                .get(WifiConfiguration.GroupCipher.CCMP));
+        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers
+                .get(WifiConfiguration.GroupCipher.TKIP));
+        assertEquals("\"" + TEST_PRESHARED_KEY + "\"",
+                wifiNetworkSpecifier.wifiConfiguration.preSharedKey);
+    }
+
+    /**
+     * Validate correctness of WifiNetworkSpecifier object created by
+     * {@link WifiNetworkSpecifier.Builder#build()} for WPA_EAP network with
+     * SSID and BSSID pattern.
+     */
+    @Test
+    public void testWifiNetworkSpecifierBuilderForWpa2EapHiddenNetworkWithSsidAndBssid() {
+        WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
+        enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
+        enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.GTC);
+
+        NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
+                .setSsid(TEST_SSID)
+                .setBssid(MacAddress.fromString(TEST_BSSID))
+                .setWpa2EnterpriseConfig(enterpriseConfig)
+                .setIsHiddenSsid()
+                .build();
+
+        assertTrue(specifier instanceof WifiNetworkSpecifier);
+        WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier;
+
+        assertEquals(TEST_SSID, wifiNetworkSpecifier.ssidPatternMatcher.getPath());
+        assertEquals(PATTERN_LITERAL, wifiNetworkSpecifier.ssidPatternMatcher.getType());
+        assertEquals(MacAddress.fromString(TEST_BSSID),
+                wifiNetworkSpecifier.bssidPatternMatcher.first);
+        assertEquals(MacAddress.BROADCAST_ADDRESS,
+                wifiNetworkSpecifier.bssidPatternMatcher.second);
+        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
+                .get(WifiConfiguration.KeyMgmt.WPA_EAP));
+        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
+                .get(WifiConfiguration.KeyMgmt.IEEE8021X));
+        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedProtocols
+                .get(WifiConfiguration.Protocol.RSN));
+        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedAuthAlgorithms
+                .get(WifiConfiguration.AuthAlgorithm.OPEN));
+        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedPairwiseCiphers
+                .get(WifiConfiguration.PairwiseCipher.CCMP));
+        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers
+                .get(WifiConfiguration.GroupCipher.CCMP));
+        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers
+                .get(WifiConfiguration.GroupCipher.TKIP));
+        assertTrue(wifiNetworkSpecifier.wifiConfiguration.hiddenSSID);
+        assertEquals(enterpriseConfig.getEapMethod(),
+                wifiNetworkSpecifier.wifiConfiguration.enterpriseConfig.getEapMethod());
+        assertEquals(enterpriseConfig.getPhase2Method(),
+                wifiNetworkSpecifier.wifiConfiguration.enterpriseConfig.getPhase2Method());
+    }
+
+
+    /**
+     * Ensure {@link WifiNetworkSpecifier.Builder#setSsid(String)} throws an exception
+     * when the string is not Unicode.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testWifiNetworkSpecifierBuilderSetSsidWithNonUnicodeString() {
+        new WifiNetworkSpecifier.Builder()
+                .setSsid("\ud800")
+                .build();
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSpecifier.Builder#setWpa2Passphrase(String)} throws an exception
+     * when the string is not ASCII encodable.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testWifiNetworkSpecifierSetWpa2PasphraseWithNonAsciiString() {
+        new WifiNetworkSpecifier.Builder()
+                .setSsid(TEST_SSID)
+                .setWpa2Passphrase("salvē")
+                .build();
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
+     * when neither SSID nor BSSID patterns were set.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testWifiNetworkSpecifierBuilderWithNoSsidAndBssidPattern() {
+        new WifiNetworkSpecifier.Builder().build();
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
+     * when match-all SSID pattern is set.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testWifiNetworkSpecifierBuilderWithMatchAllSsidPattern1() {
+        new WifiNetworkSpecifier.Builder()
+                .setSsidPattern(new PatternMatcher(".*", PATTERN_SIMPLE_GLOB))
+                .build();
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
+     * when match-all SSID pattern is set.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testWifiNetworkSpecifierBuilderWithMatchAllSsidPattern2() {
+        new WifiNetworkSpecifier.Builder()
+                .setSsidPattern(new PatternMatcher(".*", PatternMatcher.PATTERN_ADVANCED_GLOB))
+                .build();
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
+     * when match-all SSID pattern is set.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testWifiNetworkSpecifierBuilderWithMatchAllSsidPattern3() {
+        new WifiNetworkSpecifier.Builder()
+                .setSsidPattern(new PatternMatcher("", PATTERN_PREFIX))
+                .build();
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
+     * when match-all BSSID pattern is set.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testWifiNetworkSpecifierBuilderWithMatchAllBssidPattern() {
+        new WifiNetworkSpecifier.Builder()
+                .setBssidPattern(MacAddress.ALL_ZEROS_ADDRESS, MacAddress.ALL_ZEROS_ADDRESS)
+                .build();
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
+     * when match-none SSID pattern is set.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testWifiNetworkSpecifierBuilderWithMatchNoneSsidPattern1() {
+        new WifiNetworkSpecifier.Builder()
+                .setSsidPattern(new PatternMatcher("", PatternMatcher.PATTERN_LITERAL))
+                .build();
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
+     * when match-none SSID pattern is set.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testWifiNetworkSpecifierBuilderWithMatchNoneSsidPattern2() {
+        new WifiNetworkSpecifier.Builder()
+                .setSsid("")
+                .build();
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
+     * when match-none BSSID pattern is set.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testWifiNetworkSpecifierBuilderWithMatchNoneBssidPattern1() {
+        new WifiNetworkSpecifier.Builder()
+                .setBssidPattern(MacAddress.BROADCAST_ADDRESS, MacAddress.BROADCAST_ADDRESS)
+                .build();
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
+     * when match-none BSSID pattern is set.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testWifiNetworkSpecifierBuilderWithMatchNoneBssidPattern2() {
+        new WifiNetworkSpecifier.Builder()
+                .setBssid(MacAddress.BROADCAST_ADDRESS)
+                .build();
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
+     * when match-none BSSID pattern is set.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testWifiNetworkSpecifierBuilderWithMatchNoneBssidPattern3() {
+        new WifiNetworkSpecifier.Builder()
+                .setBssid(MacAddress.ALL_ZEROS_ADDRESS)
+                .build();
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
+     * when SSID pattern is set for hidden network.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testWifiNetworkSpecifierBuilderWithBssidMatchPatternForHiddenNetwork() {
+        new WifiNetworkSpecifier.Builder()
+                .setBssidPattern(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
+                        MacAddress.fromString(TEST_BSSID_OUI_MASK))
+                .setIsHiddenSsid()
+                .build();
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
+     * when both {@link WifiNetworkSpecifier.Builder#setWpa2Passphrase(String)} and
+     * {@link WifiNetworkSpecifier.Builder#setWpa2EnterpriseConfig(WifiEnterpriseConfig)} are
+     * invoked.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testWifiNetworkSpecifierBuilderWithBothWpa2PasphraseAndEnterpriseConfig() {
+        new WifiNetworkSpecifier.Builder()
+                .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_LITERAL))
+                .setWpa2Passphrase(TEST_PRESHARED_KEY)
+                .setWpa2EnterpriseConfig(new WifiEnterpriseConfig())
+                .build();
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
+     * when SSID pattern is set for hidden network.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testWifiNetworkSpecifierBuilderWithSsidMatchPatternForHiddenNetwork() {
+        new WifiNetworkSpecifier.Builder()
+                .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_PREFIX))
+                .setIsHiddenSsid()
+                .build();
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
+     * when both {@link WifiNetworkSpecifier.Builder#setWpa2Passphrase(String)} and
+     * {@link WifiNetworkSpecifier.Builder#setWpa3Passphrase(String)} are invoked.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testWifiNetworkSpecifierBuilderWithBothWpa2PasphraseAndWpa3Passphrase() {
+        new WifiNetworkSpecifier.Builder()
+                .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_LITERAL))
+                .setWpa2Passphrase(TEST_PRESHARED_KEY)
+                .setWpa3Passphrase(TEST_PRESHARED_KEY)
+                .build();
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
+     * when both {@link WifiNetworkSpecifier.Builder#setWpa3Passphrase(String)} and
+     * {@link WifiNetworkSpecifier.Builder#setWpa3EnterpriseConfig(WifiEnterpriseConfig)} are
+     * invoked.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testWifiNetworkSpecifierBuilderWithBothWpa3PasphraseAndEnterprise() {
+        new WifiNetworkSpecifier.Builder()
+                .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_LITERAL))
+                .setWpa3Passphrase(TEST_PRESHARED_KEY)
+                .setWpa3EnterpriseConfig(new WifiEnterpriseConfig())
+                .build();
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
+     * when both {@link WifiNetworkSpecifier.Builder#setWpa3Passphrase(String)} and
+     * {@link WifiNetworkSpecifier.Builder#setIsEnhancedOpen()} are invoked.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testWifiNetworkSpecifierBuilderWithBothWpa3PasphraseAndEnhancedOpen() {
+        new WifiNetworkSpecifier.Builder()
+                .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_LITERAL))
+                .setWpa3Passphrase(TEST_PRESHARED_KEY)
+                .setIsEnhancedOpen()
+                .build();
+    }
+
+    /**
      * Validate that parcel marshalling/unmarshalling works
      */
     @Test
diff --git a/wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java b/wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java
index 5f76055..05ee22c 100644
--- a/wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java
+++ b/wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java
@@ -18,7 +18,9 @@
 
 import static org.junit.Assert.*;
 
+import android.net.MacAddress;
 import android.os.Parcel;
+import android.os.Process;
 
 import androidx.test.filters.SmallTest;
 
@@ -36,6 +38,279 @@
     private static final String TEST_SSID = "\"Test123\"";
     private static final String TEST_BSSID = "12:12:12:12:12:12";
     private static final String TEST_SSID_1 = "\"Test1234\"";
+    private static final String TEST_PRESHARED_KEY = "Test123";
+
+    /**
+     * Validate correctness of WifiNetworkSuggestion object created by
+     * {@link WifiNetworkSuggestion.Builder#build()} for Open network which requires
+     * app interaction.
+     */
+    @Test
+    public void testWifiNetworkSuggestionBuilderForOpenNetworkWithReqAppInteraction() {
+        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
+                .setSsid(TEST_SSID)
+                .setIsAppInteractionRequired()
+                .build();
+
+        assertEquals(Process.myUid(), suggestion.suggestorUid);
+        assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
+        assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
+                .get(WifiConfiguration.KeyMgmt.NONE));
+        assertTrue(suggestion.isAppInteractionRequired);
+        assertFalse(suggestion.isUserInteractionRequired);
+        assertEquals(WifiConfiguration.METERED_OVERRIDE_NONE,
+                suggestion.wifiConfiguration.meteredOverride);
+        assertEquals(-1, suggestion.wifiConfiguration.priority);
+    }
+
+    /**
+     * Validate correctness of WifiNetworkSuggestion object created by
+     * {@link WifiNetworkSuggestion.Builder#build()} for WPA_EAP network which requires
+     * app interaction and has a priority of zero set.
+     */
+    @Test
+    public void
+            testWifiNetworkSuggestionBuilderForWpa2EapNetworkWithPriorityAndReqAppInteraction() {
+        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
+                .setSsid(TEST_SSID)
+                .setWpa2Passphrase(TEST_PRESHARED_KEY)
+                .setIsAppInteractionRequired()
+                .setPriority(0)
+                .build();
+
+        assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
+        assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
+                .get(WifiConfiguration.KeyMgmt.WPA_PSK));
+        assertEquals("\"" + TEST_PRESHARED_KEY + "\"",
+                suggestion.wifiConfiguration.preSharedKey);
+        assertTrue(suggestion.isAppInteractionRequired);
+        assertFalse(suggestion.isUserInteractionRequired);
+        assertEquals(WifiConfiguration.METERED_OVERRIDE_NONE,
+                suggestion.wifiConfiguration.meteredOverride);
+        assertEquals(0, suggestion.wifiConfiguration.priority);
+    }
+
+    /**
+     * Validate correctness of WifiNetworkSuggestion object created by
+     * {@link WifiNetworkSuggestion.Builder#build()} for WPA_PSK network which requires
+     * user interaction and is metered.
+     */
+    @Test
+    public void
+            testWifiNetworkSuggestionBuilderForWpa2PskNetworkWithMeteredAndReqUserInteraction() {
+        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
+                .setSsid(TEST_SSID)
+                .setWpa2Passphrase(TEST_PRESHARED_KEY)
+                .setIsUserInteractionRequired()
+                .setIsMetered()
+                .build();
+
+        assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
+        assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
+                .get(WifiConfiguration.KeyMgmt.WPA_PSK));
+        assertEquals("\"" + TEST_PRESHARED_KEY + "\"",
+                suggestion.wifiConfiguration.preSharedKey);
+        assertFalse(suggestion.isAppInteractionRequired);
+        assertTrue(suggestion.isUserInteractionRequired);
+        assertEquals(WifiConfiguration.METERED_OVERRIDE_METERED,
+                suggestion.wifiConfiguration.meteredOverride);
+        assertEquals(-1, suggestion.wifiConfiguration.priority);
+    }
+
+    /**
+     * Validate correctness of WifiNetworkSuggestion object created by
+     * {@link WifiNetworkSuggestion.Builder#build()} for OWE network.
+     */
+    @Test
+    public void testWifiNetworkSuggestionBuilderForEnhancedOpenNetworkWithBssid() {
+        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
+                .setSsid(TEST_SSID)
+                .setBssid(MacAddress.fromString(TEST_BSSID))
+                .setIsEnhancedOpen()
+                .build();
+
+        assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
+        assertEquals(TEST_BSSID, suggestion.wifiConfiguration.BSSID);
+        assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
+                .get(WifiConfiguration.KeyMgmt.OWE));
+        assertNull(suggestion.wifiConfiguration.preSharedKey);
+        assertTrue(suggestion.wifiConfiguration.requirePMF);
+    }
+
+    /**
+     * Validate correctness of WifiNetworkSuggestion object created by
+     * {@link WifiNetworkSuggestion.Builder#build()} for SAE network.
+     */
+    @Test
+    public void testWifiNetworkSuggestionBuilderForWpa3PskNetwork() {
+        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
+                .setSsid(TEST_SSID)
+                .setWpa3Passphrase(TEST_PRESHARED_KEY)
+                .build();
+
+        assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
+        assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
+                .get(WifiConfiguration.KeyMgmt.SAE));
+        assertEquals("\"" + TEST_PRESHARED_KEY + "\"",
+                suggestion.wifiConfiguration.preSharedKey);
+        assertTrue(suggestion.wifiConfiguration.requirePMF);
+    }
+
+
+    /**
+     * Validate correctness of WifiNetworkSuggestion object created by
+     * {@link WifiNetworkSuggestion.Builder#build()} for SuiteB network.
+     */
+    @Test
+    public void testWifiNetworkSuggestionBuilderForWpa3EapNetwork() {
+        WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
+        enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
+        enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.GTC);
+
+        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
+                .setSsid(TEST_SSID)
+                .setWpa3EnterpriseConfig(enterpriseConfig)
+                .build();
+
+        assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
+        assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
+                .get(WifiConfiguration.KeyMgmt.SUITE_B_192));
+        assertTrue(suggestion.wifiConfiguration.allowedGroupCiphers
+                .get(WifiConfiguration.GroupCipher.GCMP_256));
+        assertTrue(suggestion.wifiConfiguration.allowedGroupManagementCiphers
+                .get(WifiConfiguration.GroupMgmtCipher.BIP_GMAC_256));
+        assertTrue(suggestion.wifiConfiguration.allowedSuiteBCiphers
+                .get(WifiConfiguration.SuiteBCipher.ECDHE_ECDSA));
+        assertTrue(suggestion.wifiConfiguration.allowedSuiteBCiphers
+                .get(WifiConfiguration.SuiteBCipher.ECDHE_RSA));
+        assertTrue(suggestion.wifiConfiguration.requirePMF);
+        assertNull(suggestion.wifiConfiguration.preSharedKey);
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSuggestion.Builder#setSsid(String)} throws an exception
+     * when the string is not Unicode.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testWifiNetworkSuggestionBuilderSetSsidWithNonUnicodeString() {
+        new WifiNetworkSuggestion.Builder()
+                .setSsid("\ud800")
+                .build();
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSuggestion.Builder#setWpa2Passphrase(String)} throws an exception
+     * when the string is not ASCII encodable.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testWifiNetworkSuggestionBuilderSetWpa2PasphraseWithNonAsciiString() {
+        new WifiNetworkSuggestion.Builder()
+                .setSsid(TEST_SSID)
+                .setWpa2Passphrase("salvē")
+                .build();
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
+     * when {@link WifiNetworkSuggestion.Builder#setSsid(String)} is not set.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testWifiNetworkSuggestionBuilderWithNoSsid() {
+        new WifiNetworkSuggestion.Builder()
+                .build();
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
+     * when {@link WifiNetworkSuggestion.Builder#setSsid(String)} is invoked with an invalid value.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testWifiNetworkSuggestionBuilderWithInvalidSsid() {
+        new WifiNetworkSuggestion.Builder()
+                .setSsid("")
+                .build();
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
+     * when {@link WifiNetworkSuggestion.Builder#setBssid(MacAddress)} is invoked with an invalid
+     * value.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testWifiNetworkSuggestionBuilderWithInvalidBroadcastBssid() {
+        new WifiNetworkSuggestion.Builder()
+                .setSsid(TEST_SSID)
+                .setBssid(MacAddress.BROADCAST_ADDRESS)
+                .build();
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
+     * when {@link WifiNetworkSuggestion.Builder#setBssid(MacAddress)} is invoked with an invalid
+     * value.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testWifiNetworkSuggestionBuilderWithInvalidAllZeroBssid() {
+        new WifiNetworkSuggestion.Builder()
+                .setSsid(TEST_SSID)
+                .setBssid(MacAddress.ALL_ZEROS_ADDRESS)
+                .build();
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSuggestion.Builder#setPriority(int)} throws an exception
+     * when the value is negative.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testWifiNetworkSuggestionBuilderWithInvalidPriority() {
+        new WifiNetworkSuggestion.Builder()
+                .setSsid(TEST_SSID)
+                .setPriority(-1)
+                .build();
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
+     * when both {@link WifiNetworkSuggestion.Builder#setWpa2Passphrase(String)} and
+     * {@link WifiNetworkSuggestion.Builder#setWpa3Passphrase(String)} are invoked.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testWifiNetworkSuggestionBuilderWithBothWpa2PasphraseAndWpa3Passphrase() {
+        new WifiNetworkSuggestion.Builder()
+                .setSsid(TEST_SSID)
+                .setWpa2Passphrase(TEST_PRESHARED_KEY)
+                .setWpa3Passphrase(TEST_PRESHARED_KEY)
+                .build();
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
+     * when both {@link WifiNetworkSuggestion.Builder#setWpa3Passphrase(String)} and
+     * {@link WifiNetworkSuggestion.Builder#setWpa3EnterpriseConfig(WifiEnterpriseConfig)} are
+     * invoked.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testWifiNetworkSuggestionBuilderWithBothWpa3PasphraseAndEnterprise() {
+        new WifiNetworkSuggestion.Builder()
+                .setSsid(TEST_SSID)
+                .setWpa3Passphrase(TEST_PRESHARED_KEY)
+                .setWpa3EnterpriseConfig(new WifiEnterpriseConfig())
+                .build();
+    }
+
+    /**
+     * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
+     * when both {@link WifiNetworkSuggestion.Builder#setWpa3Passphrase(String)} and
+     * {@link WifiNetworkSuggestion.Builder#setIsEnhancedOpen()} are invoked.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testWifiNetworkSuggestionBuilderWithBothWpa3PasphraseAndEnhancedOpen() {
+        new WifiNetworkSuggestion.Builder()
+                .setSsid(TEST_SSID)
+                .setWpa3Passphrase(TEST_PRESHARED_KEY)
+                .setIsEnhancedOpen()
+                .build();
+    }
 
     /**
      * Check that parcel marshalling/unmarshalling works
diff --git a/wifi/tests/src/android/net/wifi/WifiUsabilityStatsEntryTest.java b/wifi/tests/src/android/net/wifi/WifiUsabilityStatsEntryTest.java
index a947b55..a22f8ce 100644
--- a/wifi/tests/src/android/net/wifi/WifiUsabilityStatsEntryTest.java
+++ b/wifi/tests/src/android/net/wifi/WifiUsabilityStatsEntryTest.java
@@ -74,7 +74,7 @@
 
     private static WifiUsabilityStatsEntry createResult() {
         return new WifiUsabilityStatsEntry(
-                0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18
+                0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22
         );
     }
 
@@ -100,5 +100,10 @@
         assertEquals(expected.totalCcaBusyFreqTimeMs, actual.totalCcaBusyFreqTimeMs);
         assertEquals(expected.totalRadioOnFreqTimeMs, actual.totalRadioOnFreqTimeMs);
         assertEquals(expected.totalBeaconRx, actual.totalBeaconRx);
+        assertEquals(expected.probeStatusSinceLastUpdate, actual.probeStatusSinceLastUpdate);
+        assertEquals(expected.probeElapsedTimeMsSinceLastUpdate,
+                actual.probeElapsedTimeMsSinceLastUpdate);
+        assertEquals(expected.probeMcsRateSinceLastUpdate, actual.probeMcsRateSinceLastUpdate);
+        assertEquals(expected.rxLinkSpeedMbps, actual.rxLinkSpeedMbps);
     }
 }
diff --git a/wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java b/wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java
index 1ecc3fe..0a3e989 100644
--- a/wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java
+++ b/wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java
@@ -541,4 +541,20 @@
         Credential copyCred = new Credential(sourceCred);
         assertTrue(copyCred.equals(sourceCred));
     }
+
+    /**
+     * Verify that two certificates are identical.
+     */
+    @Test
+    public void validateTwoCertificateIdentical() {
+        assertTrue(Credential.isX509CertificateEquals(FakeKeys.CA_CERT1, FakeKeys.CA_CERT1));
+    }
+
+    /**
+     * Verify that two certificates are different.
+     */
+    @Test
+    public void validateTwoCertificateDifferent() {
+        assertFalse(Credential.isX509CertificateEquals(FakeKeys.CA_CERT0, FakeKeys.CA_CERT1));
+    }
 }
diff --git a/wifi/tests/src/android/net/wifi/hotspot2/pps/UpdateParameterTest.java b/wifi/tests/src/android/net/wifi/hotspot2/pps/UpdateParameterTest.java
index 0b8cd3d..07cb151 100644
--- a/wifi/tests/src/android/net/wifi/hotspot2/pps/UpdateParameterTest.java
+++ b/wifi/tests/src/android/net/wifi/hotspot2/pps/UpdateParameterTest.java
@@ -16,9 +16,11 @@
 
 package android.net.wifi.hotspot2.pps;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+import android.net.wifi.FakeKeys;
 import android.os.Parcel;
 import android.util.Base64;
 
@@ -56,6 +58,7 @@
                 Base64.encodeToString("password".getBytes(), Base64.DEFAULT));
         updateParam.setTrustRootCertUrl("trust.cert.com");
         updateParam.setTrustRootCertSha256Fingerprint(new byte[32]);
+        updateParam.setCaCertificate(FakeKeys.CA_CERT0);
         return updateParam;
     }
 
@@ -71,6 +74,7 @@
         parcel.setDataPosition(0);    // Rewind data position back to the beginning for read.
         UpdateParameter paramFromRead = UpdateParameter.CREATOR.createFromParcel(parcel);
         assertTrue(paramFromRead.equals(paramToWrite));
+        assertEquals(paramToWrite.hashCode(), paramFromRead.hashCode());
     }
 
     /**